๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฑ| Android/๐Ÿ“˜ | ๊ธฐ๋ก

[Android, Kotlin] android์—์„œ Junit์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

by immgga 2023. 9. 28.

 

์ด๋ฒˆ์— ์ •๋ฆฌํ•  ๋‚ด์šฉ์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์ด๋‹ค.

๋‹ค๋“ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ผ๋Š” ๋ง์„ ๋“ค์–ด๋ณธ ์ ์€ ์žˆ์–ด๋„ ์‚ฌ์šฉ๋ฒ•์„ ๋ชฐ๋ผ์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ์„ ๊ฒƒ์ด๊ณ ,

์žฅ์ ์— ๋Œ€ํ•ด์„œ๋Š” ๋“ค์—ˆ์ง€๋งŒ ํ™• ์™€๋‹ฟ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•„์ž์˜ ๊ฒฝ์šฐ์—๋Š” 2๊ฐ€์ง€ ๋ชจ๋‘ ํ•ด๋‹น์‚ฌํ•ญ์ด์—ˆ๋‹ค ใ…Žใ…Ž

 

ํ•˜์ง€๋งŒ ์ด๋ฒˆ์— ์นœ๊ตฌ๋“ค์ด๋ž‘ ํ•˜๋Š” ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ํŒŒํŠธ๋ณ„ ๊ฐœ๋ฐœ์„ ํ•˜๋˜ ์ค‘ ๋‚ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž˜ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” ๊ฑธ๊นŒ?๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค์–ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ณ  ์ด๋ฒˆ ๊ธฐํšŒ์— ํฌ์ŠคํŒ…์œผ๋กœ ๋‚จ๊ฒจ๋ณผ๊นŒ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด๊ณ  ์ฝ”๋“œ ์˜ˆ์ œ๋กœ ๊ฐ™์ด ํ™•์ธํ•ด ๋ณด๋„๋ก ํ•˜์ž.

 

1. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ด์œ ?

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ํŠน์ • ๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•˜๋ฉด์„œ ๊ธฐ๋Šฅ์˜ ๋ฌธ์ œ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ด ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ๋œปํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๋˜ ์‚ฌ๋žŒ๋“ค์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ด๋ ‡๊ฒŒ ์ง„ํ–‰ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

  1. ์•ฑ ์‹คํ–‰
  2. ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  3. ๋กœ๊ทธ๋ฅผ ์ฐ์–ด ์˜ค๋ฅ˜ ํŒŒ์•…
  4. ๋‹ค์‹œ ์ˆ˜์ • ํ›„ ์•ฑ ์‹คํ–‰

์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

์ž‘์€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํฌ๊ฒŒ ์ƒ๊ด€์—†๋Š” ๋ถ€๋ถ„์ด์ง€๋งŒ, ๊ทœ๋ชจ๊ฐ€ ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด ์•ฑ์˜ build ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ui ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ„๋„ ์žˆ๊ธฐ์— ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์ ์  ์–ด๋ ค์›Œ์งˆ ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ „์ฒด ์•ฑ์„ ์ผ์ผ์ด ๋นŒ๋“œํ•˜๋Š” ์ž‘์—…์€ ๋น„ํšจ์œจ์ ์ธ ์ž‘์—…์ด ๋  ๊ฒƒ์ด๋‹ค.

 

์ด ๋ฌธ์ œ๋ฅผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ํ•ด๊ฒฐํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ํŠน์ • ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ์— ํšจ์œจ์ ์œผ๋กœ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ข…๋ฅ˜๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ, unit test์™€ ui test์ด๋‹ค.

unit test๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ๋กœ์ง์„ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ์ฝ”๋“œ์ด๊ณ , ui test๋Š” ui์˜ ๋™์ž‘์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์•Œ์•˜์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

ํ•„์ž๋Š” unit test ์ฝ”๋“œ ์ž‘์„ฑ ์ฝ”๋“œ๋งŒ ๋‹ค๋ฃจ๊ฒ ๋‹ค. ui test์— ๊ด€ํ•œ ๋‚ด์šฉ์€ ์ถ”ํ›„์— ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

2. unit test ์ฝ”๋“œ ์ž‘์„ฑ

์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ unit test๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” app ๋ชจ๋“ˆ ์•ˆ์— ํŒจํ‚ค์ง€๊ฐ€ 3๊ฐœ ์žˆ์„ ๊ฑด๋ฐ, ๊ทธ์ค‘์— test๋ผ๊ณ  ์ ํžŒ ํŒจํ‚ค์ง€ ์•ˆ์— ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

test ํŒจํ‚ค์ง€ ์•ˆ์— ExampleUnitTest๋ผ๋Š” ์ƒ˜ํ”Œ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์›๋ž˜๋Š” ๊ฐ๊ฐ ์ฝ”๋“œ ํŒŒํŠธ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ํ•„์ž๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์—ฐ์Šต์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ExampleUnitTest ํŒŒ์ผ ์•ˆ์—์„œ ์ž‘์—…ํ•ด ์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

๊ธฐ๋ณธ์ ์ธ ExampleUnitTest.kt์€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ƒ๊ธด๋‹ค.

class ExampleUnitTest {
    @Test
    fun addition_isCorrect() {
        assertEquals(4, 2 + 2)
    }
}

addition_isCorrect ํ•จ์ˆ˜์— Test ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„์„œ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  assertEquals()๋ฅผ ํ†ตํ•ด 4์™€ 2+2๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

assertEquals() ํ•จ์ˆ˜๋Š” junit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์— ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๋‹ˆ๊นŒ ๋”ฐ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•„์„œ ์ถ”๊ฐ€ํ•ด์ค„ ํ•„์š”๋Š” ์—†๋‹ค.

 

์ถ”๊ฐ€๋˜๋Š” junit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")

 

junit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ assert ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

assert ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์„ฑ๊ณต ์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

assert๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋‹ค์–‘ํ•˜๊ฒŒ assert ํ•จ์ˆ˜๋“ค์ด ๋‚˜์˜ค๋Š”๋ฐ ๊ทธ๊ฒƒ๋“ค์„ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๋“ฏํ•˜๋‹ค.(state๊ฐ€ true์ผ ๋•Œ๊ฐ€ ์„ฑ๊ณต์ด๋ฉด assertTrue()๋ฅผ, api์—์„œ ๋ฐ›์•„์˜จ response body๊ฐ€ null์ด ์•„๋‹ ๋•Œ๊ฐ€ ์„ฑ๊ณต์ด๋ผ๋ฉด assertNotNull()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.)

๋‹ค์–‘ํ•œ assert ํ•จ์ˆ˜๋“ค

 

์ด์ œ test function์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ assert ํ•จ์ˆ˜๋“ค์ด ํ…Œ์ŠคํŠธ ์„ฑ๊ณต, ์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ํ•„์ž๊ฐ€ ์ž‘์„ฑํ–ˆ๋˜ ์˜ˆ์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

ํ•„์ž๋Š” api ํ˜ธ์ถœ์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

private var exchangeRateApi: ExchangeRateApi? = null

@Before
fun setUp() {
    val okhttp = OkHttpClient.Builder()
        .build()

    val retrofit = Retrofit.Builder()
        .baseUrl(BuildConfig.BASE_URL)
        .client(okhttp)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

    exchangeRateApi = retrofit.create(ExchangeRateApi::class.java)
}

@Test
fun getExchangeRateListApiTest() {
    val call = exchangeRateApi?.getExchangeRate(type = "usd", date = "2023-09-08")?.execute()

    assertTrue(call!!.isSuccessful)
    assertNotNull(call.body())
}

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ฒ˜์Œ ๋ณด๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š”๋ฐ @Before ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

@Before ์–ด๋…ธํ…Œ์ด์…˜์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋˜์–ด์•ผ ํ•  ๋™์ž‘์„ ์ž‘์„ฑํ•˜๋Š” ๋ถ€๋ถ„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ๊ฐ™์€ ๊ณผ์ •)

๋˜ํ•œ ์œ„์˜ ์ฝ”๋“œ์—์„œ ์–ธ๊ธ‰๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ @After๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜๋„ ์žˆ๋Š”๋ฐ, after ์–ด๋…ธํ…Œ์ด์…˜์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ํ›„์— ์‹คํ–‰๋ผ์•ผ ํ•  ๋กœ์ง๋“ค์„ ์ž‘์„ฑํ•˜๋Š” ํ•จ์ˆ˜์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

 

ํ•„์ž์˜ ๊ฒฝ์šฐ์—๋Š” after ์–ด๋…ธํ…Œ์ด์…˜์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๊ณ , before ์–ด๋…ธํ…Œ์ด์…˜์ด ์‚ฌ์šฉ๋œ ํ•จ์ˆ˜ ์•ˆ์—์„œ retrofit service ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋Š” ์ž‘์—…์„ ํ–ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ @Test ์–ด๋…ธํ…Œ์ด์…˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€๋ฅผ ๋ณด๋ฉด, call ๋ณ€์ˆ˜์— api๋ฅผ ํ˜ธ์ถœํ•˜์˜€๋‹ค.

๊ทธ๋‹ค์Œ call์ด ์„ฑ๊ณตํ•˜์˜€๋Š”์ง€, call์˜ body๊ฐ€ null์ด ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๋Š” assert ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ๋‹ค.

 

์ด๊ฒŒ ๋์ด๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜์ง€ ์•Š์€๊ฐ€?

 

์ •๋ฆฌ


 

  • ์ด๋ฒˆ์— ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๋ฉด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ํ•„์š”์„ฑ์„ ๋Š๊ปด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์•˜๋Š”๋ฐ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚˜๋‹ˆ๊นŒ ํ›จ์”ฌ ํƒ€ ๋ธ”๋กœ๊ทธ์— ์–ธ๊ธ‰๋˜์—ˆ๋˜ ์žฅ์ ๋“ค์ด ํ™• ์™€๋‹ฟ๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ junit์—์„œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ์—ˆ๊ธฐ์— ์ƒ๊ฐ๋ณด๋‹ค ๊ณต๋ถ€ํ•˜๋Š”๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.(์ฒ˜์Œ์—๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ์‹œ ์—๋Ÿฌ๋ฅผ thorw ํ•˜๋Š” ์ฝ”๋“œ๋„ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋Š” ๊ฑธ๋กœ ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค;;)
  • ์ด๋ฒˆ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ๋งŒ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ ๋‚˜์ค‘์—๋Š” ui test์™€ junit ๋ง๊ณ ๋„ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Mockito๋„ ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด๋‚˜ ๋‹ค๋ฅธ ์œ ์šฉํ•œ ์ง€์‹์„ ๊ฐ€์ง€๊ณ  ๊ณ„์‹  ๋ถ„๋“ค์˜ ํ”ผ๋“œ๋ฐฑ ๋Œ“๊ธ€์€ ์ ๊ทน ํ™˜์˜์ž…๋‹ˆ๋‹ค!

 

์ฐธ๊ณ ํ•œ ๊ธ€

https://yoon-dailylife.tistory.com/114

 

Android) ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์™œ ์ž‘์„ฑ ํ•ด์•ผ ํ• ๊นŒ? ์˜ˆ์ œ๋กœ ์•Œ์•„๋ณด์ž

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ "์™œ" ์ž‘์„ฑํ•ด์•ผ ํ• ๊นŒ? ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ , ๊ทธ ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ํ˜น์€ ๋””๋ฐ”์ด์Šค์—์„œ ์ง์ ‘ ๊ฒฐ๊ณผ๋ฅผ ์ •์„ฑ์Šค๋Ÿฝ๊ฒŒ ํ™•์ธ -> ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

yoon-dailylife.tistory.com

https://youngest-programming.tistory.com/492

 

[์•ˆ๋“œ๋กœ์ด๋“œ] Android UnitTest ์ •๋ฆฌ

์•ˆ๋“œ๋กœ์ด๋“œ ์œ ๋‹›ํ…Œ์ŠคํŠธ ๊ธฐ๋ณธ๊ธฐ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๋Š” ํฌ์ŠคํŒ…์„ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ์—๋Š” ๊ณ„์ธกํ…Œ์ŠคํŠธ(androidTest)์™€ ๋กœ์ปฌ๋‹จ์œ„ํ…Œ์ŠคํŠธ(test) ๋กœ ์œ ๋‹›ํ…Œ์ŠคํŠธ๊ฐ€ ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด andr

youngest-programming.tistory.com

 

728x90