01A. Kotest ๊ฐ์(overview)
01A. Kotest ๊ฐ์(overview) ๊ด๋ จ
Kotlin์ ํ ์คํ ํ๋ ์์ํฌ์ ๋ํด ์๊ฐํ๋ค.
Kotest๋?
Kotlin์ ํ๋์ ์ด๊ณ ๊ฐ๋ ฅํ ์ธ์ด๋ก์ ๊ฐ๋ฐ์๋ค์ด ์์ ์ ์ด๊ณ ๊ฒฌ๊ณ ํ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ ์ ์๊ฒ ํด์ค๋ค. ์ด์ ํ์ง์ ์ ์งํ๊ณ ๊ธฐ๋ฅ์ ๋ณด์ฅํ๊ธฐ ์ํด์๋ ํจ๊ณผ์ ์ธ ํ ์คํธ๊ฐ ํ์์ ์ธ๋ฐ, ์ด๋ฅผ ์ํด Kotlin ๊ฐ๋ฐ์๋ค์ Kotest์ ๊ฐ์ ๊ฐ๋ ฅํ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ค.
Java์์๋ ์์ ๋ถํฐ JUnit์ ํ ์คํธ์ ๋ง์ด ์ฌ์ฉํด ์๋ค. Kotlin์์๋ JUnit์ผ๋ก ํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ณ ๋ง์ด ์ฌ์ฉ๋๊ธฐ๋ ํ๋ค. JUnit์ Java๋ก ๊ตฌํ ํ ์คํ ํ๋ ์์ํฌ์ด์ง๋ง, Kotest๋ ์์ Kotlin์ผ๋ก ๊ตฌํ๋ ํ ์คํ ํ๋ ์์ํฌ์ด๋ค. Kotest๋ฅผ ์ฌ์ฉํ๋ฉด JUnit์ ๋นํด Kotlin์ Syntax๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ฝ๋ ์์ ์ค์ผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋์ ํ ์คํธ ์ผ์ด์ค ๋ด์ ๋ค๋ฅธ ํ ์คํธ ์ผ์ด์ค๋ฅผ ํฌํจํ์ฌ ์ค์ฒฉ(Nested)๋๊ฒ ์์ฑํ ์ ์๋ ์ด์ ์ด ์๋ค. ์ด๋ ํ ์คํธ๋ฅผ ๋์ฑ ๋ชจ๋ํํ๊ณ ๊ตฌ์กฐํํ์ฌ ํํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
Kotest๋ Kotlin์ผ๋ก ์์ฑ๋ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ํ ์คํธ ํ๋ ์์ํฌ์ด๋ค. Kotest๋ Kotlin์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ํ ์คํธ ์์ฑ ๋ฐ ๊ด๋ฆฌ๋ฅผ ์ฝ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ํํ ์ ์๋๋ก ์ง์ํ๋ค. ์ด ํ๋ ์์ํฌ๋ ๋ค์ํ ํ ์คํธ ์คํ์ผ๊ณผ ๊ตฌ์ฑ ์ต์ ์ ์ ๊ณตํ์ฌ ๋ค์ํ ํ ์คํธ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑ์ํฌ ์ ์๋ค.
์์ธํ ๋ด์ฉ์ ๊ณต์ ์ฌ์ดํธ์์ ์ ๋ฆฌ๋์ด ์๋๋ฐ, ์ฌ๊ธฐ์ ๊ฐ๋จํ ์๊ฐ๋ฅผ ํ์๋ฉด, ํฐ ํน์ง์ผ๋ก์๋ 10๊ฐ์ง ์ข ๋ฅ์ Spec์ด๋ผ๊ณ ํ๋ ํด๋์ค๊ฐ ์ค๋น๋์ด ์๊ณ , ์ํ๋ Spec๋ฅผ ์ ํํด ํ ์คํธ๋ฅผ ์ฐ๋ ๊ฒ์ด ์ ์๋ค. Spec์ ๊ฐ๊ฐ ๋ค์ํ ์ธ์ด, ํ ์คํ ํ๋ ์์ํฌ์ ์ํฅ์ ๋ฐ์ ๋ง๋ค์ด์ง๊ณ ์์ผ๋ฉฐ ๋ค๋ฅธ ์ธ์ด์์ Kotlin์ ์์ํ ์ฌ๋์ ์์ ์ ๋ชจ๊ตญ์ด ํ ์คํธ Spec์ ์ ํํ ์ ์๋ค.
๊ทธ ๋ฐ์๋ ์คํ์ ์ธ ๊ธฐ๋ฅ์ ํฌํจํ ๋ง์ ๊ธฐ๋ฅ๊ณผ Assertion, Extension์ด ์ค๋น๋์ด ์๋ค.
์ฌ๊ธฐ์์๋ Kotest์ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ๋ํด ์ ๋ฆฌํ๊ณ , Kotest๋ฅผ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์๋ ์ค๋ช ํ๋ค.
์๋ Kotest๋?
Kotlin์์ ์ฌ์ฉํ ์ ์๋ ํ ์คํ ํ๋ ์์ํฌ์ผ๋ก ์ด์ ์๋ KotlinTest๋ผ๋ ์ด๋ฆ์ด์์ง๋ง, ๋ฆด๋ฆฌ์ค 4.0๋ถํฐ๋ Jetbrains ์ ๊ณต ํจํค์ง์์ ํผ๋์ ํผํ๊ธฐ ์ํด Kotest๋ก ์ด๋ฆ์ด ๋ณ๊ฒฝ๋์๋ค.
๋จผ์ ์์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ๋ค. ์๋ ์ฝ๋๋ ๊ณต์ ์ํ ํ ์คํธ ์ฝ๋์ด๋ค.
class MyTests : StringSpec({
"length should return size of string" {
"hello".length shouldBe 5
}
"startsWith should test for a prefix" {
"world" should startWith("wor")
}
})
์ฝ๋์ ๋ํด์๋ ๋์ค์ ๋ ์์ธํ ์ดํด ๋ณด๊ฒ ์ง๋ง, ์ฌ๊ธฐ์ ๊ฐ๋จํ ์ดํด ๋ณด๋ฉด, StringSpec
ํด๋์ค๋ฅผ ์์์ ๋ฐ์ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ , ํ
์คํธ์ ์ค๋ช
์ ๋ฌธ์์ด๋ก ์์ฑ์ ํ์๊ณ , shouldBe
์ should
์ผ๋ก ๊ฒ์ฆ์ ํ๊ณ ์๋ค.
์ด๋ ๊ฒ Kotest๋ Kotlin์ Syntax์ผ๋ก 2๊ฐ์ ํ ์คํธ ์ฝ๋๋ฅผ ์ค์ฒฉ๋๊ฒ ์์ฑํ ์ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Kotest์ ์ฅ์ ๊ณผ ํน์ง
Kotest๋ ๋ค์ํ ์ฅ์ ๊ณผ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
KoTest ์ฅ์
- Kotest๋ Kotlin ์ธ์ด์ ์๋ฒฝํ๊ฒ ํตํฉ๋์ด ์์ผ๋ฉฐ, Kotlin์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ต๋ํ ํ์ฉํ ์ ์๋ค.
- Kotest๋ ๋ค์ํ ํ ์คํธ ์คํ์ผ์ ์ง์ํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์์ ์ ์ทจํฅ์ ๋ง๋ ์คํ์ผ์ ์ ํํ ์ ์๋ค.
- Kotest๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ, ํ ์คํธ ์์ฑ๊ณผ ๊ด๋ฆฌ๋ฅผ ํฅ์์ํจ๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ Assertion๊ณผ Matchers, ๋ชจํน ๋ฐ ์คํ , ํ ์คํธ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฑ์ด ์๋ค. ๋ง์ง๋ง์ผ๋ก, Kotest๋ ํ์ฅ ๊ฐ๋ฅํ ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ๋ฅผ ์ ๊ณตํ์ฌ ์ฌ์ฉ์๊ฐ ํ์์ ๋ฐ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฅํ ์ ์๋ค.
Kotest๋ Kotlin ๊ธฐ๋ฐ ํ๋ก์ ํธ์์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๋๊ตฌ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ๊ฐ๋ฐ์๋ค์ด ์์ ์ ์ด๊ณ ํ์ง ๋์ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ํฐ ๋์์ด ๋๋ค.
KoTest ํน์ง
- Kotest DSL์ ์ฌ์ฉ
- ์ฌ๋ฌ TestStyle์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ณ ์๋ฆ๋ค์ด ํ ์คํธ ์์ฑ
- ๋ฐ์ดํฐ ๊ธฐ๋ฐ ํ ์คํธ๋ก ๋ง์ ์์ ๋งค๊ฐ๋ณ์๋ ํ ์คํธ ๊ฐ๋ฅ
- ๋ชจ๋ ํ ์คํธ์ ๋ํด ํธ์ถ์, ๋ณ๋ ฌ ์ฒ๋ฆฌ, ์๊ฐ์ ํ, ํ ์คํธ ๊ทธ๋ฃนํ, ์กฐ๊ฑด๋ถ ๋นํ์ฑ ๋ฑ์ ๋ฏธ์ธ ์กฐ์ ํ ์คํธ ๊ฐ๋ฅ
- ์ค์ฒฉ ํ ์คํธ๊ธฐ๋ฅ ์ ๊ณต
- ๋์ ํ ์คํธ ์ ๊ณต (๋ฐํ์์ ์กฐ๊ฑด๋ถ๋ก ํ ์คํธ๋ฅผ ์ถ๊ฐ ๊ฐ๋ฅ)
- ํ ์คํธ ์๋ช ์ฃผ๊ธฐ์ ๋ง๋ ๋ค์ํ ์ฝ๋ฐฑ์ ์ ๊ณต
ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ ์๊ฐ
Kotest๋ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(Test-driven development, TDD)๋ฅผ ์ง์ํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ๋๊ตฌ์ด๋ค. TDD๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ค ํ๋๋ก, ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ํ์ง์ ํฅ์์ํค๊ณ ๋ฒ๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐ๊ฒฌํ ์ ์๋ค.
ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(Test-driven development, TDD)
์ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ค ํ๋๋ก, ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋จผ์ ์์ฑํ๊ณ ๊ทธ ํ ์คํธ ์ผ์ด์ค๋ฅผ ํต๊ณผ์ํค๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ๋ก ์ด๋ค. ์ด ๋ฐฉ๋ฒ๋ก ์ ์ฝ๋์ ํ์ง์ ํฅ์์ํค๊ณ ๋ฒ๊ทธ๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ ์ค๋ค.
Kotest๋ TDD๋ฅผ ์ง์ํ๋ค.
Kotest๋ TDD๋ฅผ ์ง์ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค:
1. ๊ฐํธํ ํ ์คํธ ์์ฑ
Kotest๋ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ API๋ฅผ ์ ๊ณตํ์ฌ ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ฝ๊ฒ ๋ง๋ ๋ค. ๋ค์ํ ์คํ์ผ๊ณผ Matchers๋ฅผ ํ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ํ ์คํธํ ์ ์๋ค.
2. ํ ์คํธ ์๋ ์คํ
Kotest๋ ํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋์ผ๋ก ์คํ๋๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด ํ ์คํธ๋ฅผ ์ง์์ ์ผ๋ก ์คํํ๊ณ ์ฝ๋ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์ํฅ์ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์๋ค.
3. ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ์ ํตํฉ
Kotest๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ์์ ํตํฉ์ ์ง์ํ์ฌ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ธก์ ํ๊ณ ํ ์คํธ๋์ง ์์ ์ฝ๋๋ฅผ ์๋ณํ ์ ์๋ค. ์ด๋ฅผ ํตํด ํ ์คํธ์ ์์ฑ๋๋ฅผ ๋์ผ ์ ์๋ค. 4. ๋ชจ์ ๊ฐ์ฒด ๋ฐ ์คํ ์ง์: Kotest๋ MockK์ ๊ฐ์ ๋ชจ์ ๊ฐ์ฒด ๋ฐ ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ํ์ฌ ํ ์คํธ ์ค์ ์ธ๋ถ ์์กด์ฑ์ ๋์ฒดํ ์ ์๋ค. ์ด๋ฅผ ํตํด ํ ์คํธ๋ฅผ ๋์ฑ ๊ฒฉ๋ฆฌ์ํค๊ณ ํ ์คํธ์ ์์ ์ฑ์ ๋์ผ ์ ์๋ค.
TDD์ ํต์ฌ ์์น
TDD์ ํต์ฌ ์์น์ผ๋ก โRed, Green, Refactor"๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ๊ณผ์ ์์ ์ง์ผ์ผ ํ ์ ๊ทผ ๋ฐฉ์์ ๋งํ๋ค. ์ด ์์น์ ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์ฝ๋๋ฅผ ๊ตฌํํ๋ฉฐ ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ ์ผ๋ จ์ ๋จ๊ณ๋ฅผ ๋ํ๋ธ๋ค.
1. Red (๋นจ๊ฐ)
๋นจ๊ฐ ์ํ๋ ํ ์คํธ๊ฐ ์คํจํ ์ํ๋ฅผ ์๋ฏธํ๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ์ ๋นจ๊ฐ ์ํ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. Kotest์์๋ ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์คํํ์ฌ ํ ์คํธ๊ฐ ์คํจํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค. ์ด ๋จ๊ณ์์๋ ํ ์คํธ๊ฐ ์กด์ฌํ์ง ์๊ฑฐ๋ ๊ธฐ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
2. Green (์ด๋ก)
์ด๋ก ์ํ๋ ํ ์คํธ๊ฐ ์ฑ๊ณตํ ์ํ๋ฅผ ์๋ฏธํ๋ค. Red ์ํ์์ ์คํจํ ํ ์คํธ๋ฅผ ํต๊ณผํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค. Kotest์์๋ ์คํจํ ํ ์คํธ๋ฅผ ํต๊ณผํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ ํ๊ณ , ํ ์คํธ๋ฅผ ๋ค์ ์คํํ์ฌ ์ด๋ก ์ํ๋ก ๋ง๋ค์ด์ผ ํ๋ค.
3. Refactor (๋ฆฌํฉํฐ)
๋ฆฌํฉํฐ ๋จ๊ณ๋ ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ณ ํ ์คํธ๋ฅผ ํตํด ์ฝ๋์ ๋์์ ๋ณด์กดํ๋ ๋จ๊ณ์ด๋ค. ์ด๋ก ์ํ์์๋ ํ ์คํธ๋ฅผ ํต๊ณผํ์ง๋ง ์ฝ๋๊ฐ ์ฌ์ ํ ๊ฐ์ ๋ ์ฌ์ง๊ฐ ์๋ค. Kotest์์๋ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ์ฌ ์ฝ๋์ ๊ฐ๋ ์ฑ, ์ ์ง ๋ณด์์ฑ, ์ฑ๋ฅ ๋ฑ์ ํฅ์์ํฌ ์ ์๋ค. ์ด๋ ํ ์คํธ๋ฅผ ํตํด ์ฝ๋ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๊ธฐ์กด ๋์์ด ๋ณํ์ง ์์์์ ํ์ธํด์ผ ํ๋ค.
์ด๋ฌํ โRed, Green, Refactorโ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ฅด๋ฉด์ Kotest๋ฅผ ์ฌ์ฉํ๋ฉด ์ํํธ์จ์ด ๊ฐ๋ฐ ๊ณผ์ ์์ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ์ ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ์ํํ ์ ์๋ค. ํ ์คํธ๊ฐ ์คํจํ ํ ์ฑ๊ณตํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ์ดํ ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ฉด์๋ ํ ์คํธ๋ฅผ ํตํด ์ฝ๋์ ์์ ์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
TDD๋ ์ํํธ์จ์ด์ ์ค๊ณ, ํ์ง, ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋๋ฉฐ, Kotest์ ๊ฐ์ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํจ๊ณผ์ ์ผ๋ก ์ ์ฉํ ์ ์๋ค. TDD๋ฅผ ์ฌ์ฉํ์ฌ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ ๋ Kotest๋ฅผ ํ์ฉํ๋ฉด ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์ ์งํ ์ ์๋ค.