Skip to main content

01A. Kotest ๊ฐœ์š”(overview)

Less than 1 minuteKotlinTestKotestcrashcoursekotlintestkotest

01A. Kotest ๊ฐœ์š”(overview) ๊ด€๋ จ


Kotest ๊ฐœ์š”(overview)

Kotlin์˜ ํ…Œ์ŠคํŒ… ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•œ๋‹ค.

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์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

Kotest | Kotest
Flexible, powerful and elegant kotlin test framework with multiplatform support

๊ทธ ๋ฐ–์—๋„ ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ ๋งŽ์€ ๊ธฐ๋Šฅ๊ณผ 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๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋”์šฑ ํšจ๊ณผ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด์ฐฌํฌ (MarkiiimarK)
Never Stop Learning.