PHpullh
학습 라이브러리/Kotlin/BDD 스타일 테스트 (Given-When-Then)

KOTLIN · 테스트

BDD 스타일 테스트 (Given-When-Then)

Given-When-Then 형식으로 테스트를 구조화하여 비즈니스 요구사항을 명확히 표현합니다.

테스트중급bddgiven-when-thenbehaviorscenario

핵심 설명

Given-When-Then 형식으로 테스트를 구조화하여 비즈니스 요구사항을 명확히 표현합니다.

Kotlin code

// BDD 스타일 DSL
class BddTest(val name: String) {
    private var givenBlock: (() -> Unit)? = null
    private var whenBlock: (() -> Unit)? = null
    private var thenBlock: (() -> Unit)? = null

    fun given(desc: String, block: () -> Unit) { println("  Given: $desc"); givenBlock = block }
    fun whenever(desc: String, block: () -> Unit) { println("  When: $desc"); whenBlock = block }
    fun then(desc: String, block: () -> Unit) { println("  Then: $desc"); thenBlock = block }

    fun run() {
        println("시나리오: $name")
        givenBlock?.invoke()
        whenBlock?.invoke()
        thenBlock?.invoke()
        println("  ✓ 통과
")
    }
}

fun scenario(name: String, block: BddTest.() -> Unit) {
    BddTest(name).apply(block).run()
}

class ShoppingCart {
    private val items = mutableListOf<Pair<String, Int>>()
    fun add(name: String, price: Int) { items.add(name to price) }
    fun total() = items.sumOf { it.second }
    fun itemCount() = items.size
    fun clear() = items.clear()
}

fun main() {
    scenario("장바구니에 상품 추가") {
        val cart = ShoppingCart()
        given("빈 장바구니가 있다") { cart.clear() }
        whenever("상품 2개를 추가한다") {
            cart.add("노트북", 1500000)
            cart.add("마우스", 30000)
        }
        then("총액은 1,530,000원이다") {
            assert(cart.total() == 1530000) { "총액 불일치: ${cart.total()}" }
            assert(cart.itemCount() == 2) { "개수 불일치" }
        }
    }

    scenario("빈 장바구니 총액") {
        val cart = ShoppingCart()
        given("빈 장바구니가 있다") { cart.clear() }
        whenever("아무것도 추가하지 않는다") {}
        then("총액은 0원이다") {
            assert(cart.total() == 0) { "빈 장바구니 총액이 0이 아님" }
        }
    }
}

학습 팁

Kotest의 BehaviorSpec이나 Spek을 사용하면 더 강력한 BDD 테스트 프레임워크를 활용할 수 있습니다.

주의할 점

Given-When-Then의 경계를 모호하게 작성하면 테스트 의도가 불명확해집니다. Given은 전제조건, When은 동작, Then은 검증으로 명확히 구분하세요.

자주 묻는 질문

BDD 스타일 테스트 (Given-When-Then)란 무엇인가요?

Given-When-Then 형식으로 테스트를 구조화하여 비즈니스 요구사항을 명확히 표현합니다.

BDD 스타일 테스트 (Given-When-Then) 학습 시 주의할 점은 무엇인가요?

Given-When-Then의 경계를 모호하게 작성하면 테스트 의도가 불명확해집니다. Given은 전제조건, When은 동작, Then은 검증으로 명확히 구분하세요.