๐ก TDD๋ฅผ ํตํด ๋ก์ง์ ๊ตฌํํ๋ฉด์ TestFixture์ ๋ํ ๊ฐ๋ ์ ์๊ฒ ๋์๊ณ , ์ด์ ๋ํ์ฌ ์์ธํ๊ฒ ํ์ตํ์์ต๋๋ค.
TestFixture
- ํ ์คํธ๋ฅผ ์ํ ๊ณ ์ ๋ ์ํ๋ฅผ ์ค์ ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ํ ์คํธ ์คํ ์ ์ ๊ณตํต์ผ๋ก ํ์ํ ๊ฐ์ฒด๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ์ฌ, ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ด๊ณ ๊ฐ๋ ์ฑ๊ณผ ์ผ๊ด์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
ํ ์คํธ ๋์ ํด๋์ค ์์ฑ
class Calculator {
fun add(a: Int, b: Int): Int {
return a + b
}
fun subtract(a: Int, b: Int): Int {
return a - b
}
}
- ์์ ๊ฐ์ ๊ฐ๋จํ ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ณ , ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.assertEquals
class CalculatorTest {
private lateinit var calculator: Calculator
@BeforeEach
fun setUp() {
// TestFixture ์ค์
calculator = Calculator()
}
@Test
fun testAdd() {
val result = calculator.add(2, 3)
assertEquals(5, result)
}
@Test
fun testSubtract() {
val result = calculator.subtract(5, 3)
assertEquals(2, result)
}
}
- @BeforEach ์ด๋ ธํ ์ด์ ์ ํ์ฉํด์ ๊ฐ ํ ์คํธ ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ์ setUp() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ calculator ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ์์ต๋๋ค.
- ์ด๋ ๊ฒ ํ๋ค๋ฉด ๊ฐ ํ ์คํธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ํ๋ ์ ์์ผ๋ฉฐ, ๋งค๋ฒ calculator ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๊ฐ ์์ด์ ธ ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ผ ์ ์์์ต๋๋ค.
ํ์ฅํจ์ ํ์ฉํ๊ธฐ
- ํ ์คํธ์ฝ๋ ๋ง์ ์ํ ํ์ฅํจ์๋ฅผ ์ ์ธํ๋ ๊ฒ๋ TestFixture๊ฐ ๋ ์ ์์ต๋๋ค.
object TestFixture {
fun CartItemDatabase.deleteAll() {
this.openHelper.writableDatabase.execSQL("DELETE FROM ${CartItemDatabase.CART_ITEMS_DB_NAME}")
}
}
- CartItemDatabase๋ผ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๊ธฐํํ๋ ์ฝ๋๋ฅผ ํ์ฅํจ์๋ก ์ ์ธํ์์ต๋๋ค.
- ์ด๋ ์ค๋ณต ์ฝ๋๋ฅผ ๊ฐ์์ํค๊ณ , ์ผ๊ด์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๋์ด๋ ๋ฐ ๋์์ ์ฃผ์์ผ๋ฏ๋ก ์ผ์ข ์ TestFixture๋ผ๊ณ ํ ์ ์์ต๋๋ค.
Mock ๋ฐ์ดํฐ ์์ฑ
- ํ ์คํธ ์คํ์ ํ๊ธฐ ์ ์ ํ์ํ ๊ณ ์ ๋ ์ํ๋ ๊ฐ์ฒด๋ฅผ ์ค์ ํ๋ ๊ฒ์ TestFixture๋ผ๊ณ ํ ์ ์์ต๋๋ค.
- ์๋์ ๊ฐ์ ํ ์คํธ์ ํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ ๊ฐ์ฒด ์์ฑ์ ์ญํ ์ ์ค์ฌ์ค ์ ์์ต๋๋ค.
object TestFixture {
fun makeCartItemEntity(): CartItemEntity {
return CartItemEntity(
product =
Product(
imageUrl = "",
price = 10000,
name = "์๋ฉ๋ฆฌ์นด๋
ธ",
id = 0L,
category = "",
),
)
}
fun makeRecentlyProductEntity(): RecentlyProductEntity {
return RecentlyProductEntity(
id = 2L,
productId = 9999999L,
imageUrl = "",
name = "",
category = "fashion",
)
}
}
์ ๋ฆฌ
- TestFixture๋ ํ ์คํธ ์ฝ๋์์ ๋ฐ๋ณต์ ์ผ๋ก ํ์ํ ์ด๊ธฐํ ์์ ์ ์ค์ ์ง์คํํ ์ ์์ต๋๋ค.
- ์ผ๊ด์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๋์ด๋ ๋ฐ ๋์์ด ๋๋ฉฐ, @BeforEach ํน์ @BeforAll ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ด๊ธฐํ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
https://oliveyoung.tech/blog/2024-04-01/testcode-use-fixture-monkey/