์ด๋ฒ์ ์ ๋ฆฌํ ๋ด์ฉ์ ํ ์คํธ ์ฝ๋์ด๋ค.
๋ค๋ค ํ ์คํธ ์ฝ๋๋ผ๋ ๋ง์ ๋ค์ด๋ณธ ์ ์ ์์ด๋ ์ฌ์ฉ๋ฒ์ ๋ชฐ๋ผ์ ์ฌ์ฉํ์ง ์์๋ ๊ฒฝ์ฐ๋ ์์์ ๊ฒ์ด๊ณ ,
์ฅ์ ์ ๋ํด์๋ ๋ค์์ง๋ง ํ ์๋ฟ์ง ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์์์ ์๋ ์์ ๊ฒ์ด๋ค.
ํ์์ ๊ฒฝ์ฐ์๋ 2๊ฐ์ง ๋ชจ๋ ํด๋น์ฌํญ์ด์๋ค ใ ใ
ํ์ง๋ง ์ด๋ฒ์ ์น๊ตฌ๋ค์ด๋ ํ๋ ๋ํ ํ๋ก์ ํธ์์ ํํธ๋ณ ๊ฐ๋ฐ์ ํ๋ ์ค ๋ด๊ฐ ์ฝ๋๋ฅผ ์ ์์ฑํ๊ณ ์๋ ๊ฑธ๊น?๋ผ๋ ์๋ฌธ์ด ๋ค์ด ํ ์คํธ ์ฝ๋์ ๋ํด ๊ณต๋ถํ๊ณ ์ด๋ฒ ๊ธฐํ์ ํฌ์คํ ์ผ๋ก ๋จ๊ฒจ๋ณผ๊น ํ๋ค.
๊ทธ๋ฌ๋ฉด ๋ฐ๋ก ํ ์คํธ ์ฝ๋์ ๋ํด ๊ฐ๋จํ ์์๋ณด๊ณ ์ฝ๋ ์์ ๋ก ๊ฐ์ด ํ์ธํด ๋ณด๋๋ก ํ์.
1. ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ด์ ?
ํ ์คํธ ์ฝ๋๋ ์๋๋ก์ด๋ ์ฑ์ ๊ฐ๋ฐํ๋ฉด์ ํน์ ๋ก์ง์ ํ ์คํธํ๋ฉด์ ๊ธฐ๋ฅ์ ๋ฌธ์ ๋ ์ค๋ฅ๋ฅผ ์ฐพ์๋ด ์ฃผ๋ ์ฝ๋๋ฅผ ๋ปํ๋ค.
ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ์ฌ๋๋ค์ ํ ์คํธ๋ฅผ ์ด๋ ๊ฒ ์งํํ์ ๊ฒ์ด๋ค.
- ์ฑ ์คํ
- ์ค๋ฅ ๋ฐ์
- ๋ก๊ทธ๋ฅผ ์ฐ์ด ์ค๋ฅ ํ์
- ๋ค์ ์์ ํ ์ฑ ์คํ
์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ์ ๊ฒ์ด๋ค.
์์ ํ๋ก์ ํธ๋ฅผ ํ๊ณ ์๋ค๋ฉด ํฌ๊ฒ ์๊ด์๋ ๋ถ๋ถ์ด์ง๋ง, ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด ์ฑ์ 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()์ ์ฌ์ฉํ๋ฉด ๋๋ค.)
์ด์ 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