-
Notifications
You must be signed in to change notification settings - Fork 0
๐ค AN ํ ์คํธ ์ ๋ต
- Instrumentation Test: Espresso.
- Integration Test: Robelectric
- Unit Test: Kotest.
- Test Double: Fake, Mockk
BDD ๊ธฐ๋ฒ ์ค Given-When-Then ํจํด์ ์ฌ์ฉํ์ฌ ์์ฑํ๋ค.
- given: ์๋๋ฆฌ์ค ์งํ์ ํ์ํ ๋ฐ์ดํฐ ์ค๋น
- when: ์๋๋ฆฌ์ค๋ฅผ ์งํํ๋๋ฐ ํ์ ์กฐ๊ฑด
- then: ์๋๋ฆฌ์ค๋ฅผ ์๋ฃํ์ ๋ ๋ณด์ฅํด์ผ ํ๋ ๊ฒฐ๊ณผ
@Test
fun `test`() {
// given
val num1 = 1
val num2 = 2
// when
val actual = sum(num1, num2)
// then
val expect = 3
actual shouldBe expect
}
- ViewModel Test ๋ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ค.
- ๊ทธ ์ธ์ Test๋ ์์ฑ์๊ฐ ์ ํ์ ์ผ๋ก ํ ์คํธํ๋ค.
- ์ฑ๊ณต ์๋๋ฆฌ์ค๋ **๋ฐ๋์ Fake ๊ฐ์ฒด**๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธํ๋ค.
- ์์ธ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ๋ Mock์ ํ์ฉํ์ฌ ํ ์คํธํด๋ ๋๋ค.
- ์ค์ ๋์๊ณผ ์ ์ฌํ ๋์์ ํ๊ธฐ์ ์ ๋ขฐ์ฑ ์๋ ํ ์คํธ๋ฅผ ์ ๊ณต
- Unit Test ์ Android Test ์์ ์ฌ์ฌ์ฉ๋ ์ ์์
Fake ๊ฐ์ฒด๋ testing ๋ชจ๋ ์ ๋ชจ์๋์์ต๋๋ค.
๊ตฌ๋ถ | Fake ๊ฐ์ฒด | Mock ๊ฐ์ฒด |
---|---|---|
์ ์ | Product ๊ฐ์ฒด๋ฅผ ๋ชจ๋ฐฉํ ๊ฐ์ฒด๋ก, ์ค์ ๋์์ ๋จ์ํํ ๊ตฌํ์ฒด | ํน์ ํ๋์ด ์ผ์ด๋ฌ๋์ง ๊ฒ์ฆํ๊ธฐ ์ํ ๊ฐ์ฒด๋ก, ์์๋ ํธ์ถ๊ณผ ์๋ต์ ๋ฏธ๋ฆฌ ์ ์ |
์ฃผ์ฉ๋ | ์ค์ ๋์์ ๋ชจ๋ฐฉํ์ฌ ํ ์คํธ์ ์ถฉ์ค๋์ ์ ๋ขฐ์ฑ์ ๋์ | ํ๋ ๊ฒ์ฆ (Behavior Verification) |
์ฅ์ | - ๋์ ํ
์คํธ ์ถฉ์ค๋ - ๋ค์ํ ํ ์คํธ ํ๊ฒฝ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ - ๊ฐ์ฒด์ ๋ด๋ถ ์ฝ๋๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ์ฌ์ฉ ๊ฐ๋ฅ (์ถ์ํ, ์บก์ํ) |
- ํ
์คํธ ์ ํธ์ถ๋ ๋ฉ์๋์ ๊ทธ ์์๋ฅผ ๊ฒ์ฆ ๊ฐ๋ฅ - ํ ์คํธ ์ผ์ด์ค๊ฐ ๋ช ํํ๊ณ ๊ตฌ์ฒด์ ์ |
๋จ์ | - ํ๋ก๋ํธ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด Fake๋ ๋ณ๊ฒฝ๋์ด์ผ ํจ (์ ์ง๋ณด์ ๋น์ฉ ์ฆ๊ฐ) - Fake๋ ์ค์ ์ฒ๋ผ ๋์ํ๋์ง ํ ์คํธ ํ์ |
- ์์๋ ํธ์ถ๊ณผ ์๋ต์ ๋ฏธ๋ฆฌ ์ ์ํด์ผ ํ๋ฏ๋ก ์ค์ ์ด ๋ฒ๊ฑฐ๋ก์ - ํ ์คํธ๊ฐ Mock ๊ฐ์ฒด์ ์์กดํ๊ฒ ๋์ด ์ ์ฐ์ฑ์ด ๋จ์ด์ง ์ ์์ |
์ฌ์ฉ ์ฌ๋ก | - DB๋ Server ์์ ์์กด์ฑ์ ์ ๊ฑฐํ๊ณ ๋
๋ฆฝ์ ์ธ ViewModel ํ
์คํธ ์ํ |
- ํน์ ๋ฉ์๋๊ฐ ํธ์ถ๋์๋์ง ๊ฒ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ |
- Product์ฉ Repository ๊ฐ ์๋ Fake Repository๋ฅผ ์ฌ์ฉํ๋ค.
- Fake๋ฅผ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ธ ๊ฒฝ์ฐ์๋ง Mock ์ ์ฌ์ฉํ์ฌ ํ ์คํธํ๋ค.
- ํ๋ฉด๋ณ Portrait, Landscape ํ ์คํธ๋ ํ์๋ค.
ํ ์คํธ ์์ฑ ๋ฐฉ๋ฒ https://github.com/woowacourse-teams/2024-pokerogue-helper/pull/434 ์ฐธ๊ณ
๋๋น ๋ง์ด๊ทธ๋ ์ด์ ํ ์คํธ์ ๋ํ ์ดํด๋ฅผ ์ํด ๊ฐ๋จํ๊ฒ ์์ฑํด๋๊ฒ์ฌ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์ฑํ ์ฝ๋๋ฅผ ๋ด์ฃผ์ธ์ฌ~
room-test
์์ ์ง์ํ๋ MigrationTestHelper
๊ฐ scheme history๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ
์คํธํฉ๋๋ค.
๋ฐ๋ผ์, androidTest/schemas/../pokeRogueDatabase/(dbVersion).json
์ ์ด์ ๋๋น ๋ฒ์ ์ scheme ๋ค์ด ์์ด์ผํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ง์ด๊ทธ๋ ์ด์ ํ ์คํธ์๋ ๋ค์๊ณผ ๊ฐ์ด 2๊ฐ์ง ์ข ๋ฅ์ ํ ์คํธ๊ฐ ์๋ค๊ณ ํฉ๋๋ค.
DB ๋ฒ์ ์ ์ฌ๋ ค๋ ์ด์ ๋ฐ์ดํฐ๊ฐ ์์์ด ์ผ์ด๋์ง ์๋์ง๋ฅผ ํ ์คํธํฉ๋๋ค!
// from: db version 1
data class User(
@PrimaryKey val id: String,
val name: String,
)
// to: db version 2
data class User(
@PrimaryKey val id: String,
val name: String,
@ColumnInfo(defaultValue = -1)
val age: Int,
)
์์ ๊ฐ์ด User ์ age ๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ด ์ถ๊ฐ๋์์ผ๋ฉด 2๊ฐ์ง ํ ์คํธ๋ฅผ ํฉ๋๋ค.
- ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ์์๋์๋๊ฐ?
- ์๋ก์ด ์ปฌ๋ผ์ default ๊ฐ์ด ๋ค์ด๊ฐ๋๊ฐ
๊ฐ์ฅ ์ค๋๋ db ๋ฒ์ ์ด 1์ด๊ณ , ๊ฐ์ฅ ์ต์ db ๋ฒ์ ์ด 10์ด๋ผ๊ณ ๊ฐ์ ํ์ ๋
1 ์์ 10์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋๋ฐ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๋ ํ
์คํธ์
๋๋ค!
๋๋น ๋ง์ด๊ทธ๋ ์ด์ ํ ์คํธ์ ๋ํ ์ดํด๋ฅผ ์ํด ๊ฐ๋จํ๊ฒ ์์ฑํด๋๊ฒ์ฌ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์ฑํ ์ฝ๋๋ฅผ ๋ด์ฃผ์ธ์ฌ~
room-test
์์ ์ง์ํ๋ MigrationTestHelper
๊ฐ scheme history๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ
์คํธํฉ๋๋ค.
๋ฐ๋ผ์, androidTest/schemas/../pokeRogueDatabase/(dbVersion).json
์ ์ด์ ๋๋น ๋ฒ์ ์ scheme ๋ค์ด ์์ด์ผํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ง์ด๊ทธ๋ ์ด์ ํ ์คํธ์๋ ๋ค์๊ณผ ๊ฐ์ด 2๊ฐ์ง ์ข ๋ฅ์ ํ ์คํธ๊ฐ ์๋ค๊ณ ํฉ๋๋ค.
DB ๋ฒ์ ์ ์ฌ๋ ค๋ ์ด์ ๋ฐ์ดํฐ๊ฐ ์์์ด ์ผ์ด๋์ง ์๋์ง๋ฅผ ํ ์คํธํฉ๋๋ค!
// from: db version 1
data class User(
@PrimaryKey val id: String,
val name: String,
)
// to: db version 2
data class User(
@PrimaryKey val id: String,
val name: String,
@ColumnInfo(defaultValue = -1)
val age: Int,
)
์์ ๊ฐ์ด User ์ age ๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ด ์ถ๊ฐ๋์์ผ๋ฉด 2๊ฐ์ง ํ ์คํธ๋ฅผ ํฉ๋๋ค.
- ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ์์๋์๋๊ฐ?
- ์๋ก์ด ์ปฌ๋ผ์ default ๊ฐ์ด ๋ค์ด๊ฐ๋๊ฐ
๊ฐ์ฅ ์ค๋๋ db ๋ฒ์ ์ด 1์ด๊ณ , ๊ฐ์ฅ ์ต์ db ๋ฒ์ ์ด 10์ด๋ผ๊ณ ๊ฐ์ ํ์ ๋
1 ์์ 10์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋๋ฐ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๋ ํ
์คํธ์
๋๋ค!