

TDD의 핵심요소인 테스트코드는 작성할 때 각 유닛에 대해 어떻게 작성해야 하는지 고민하게 된다.
이러한 테스트 코드를 작성할 때 Given-When-Then 패턴을 통해 틀을 잡을 수 있다.
간단한 예제를 통해 알아보도록 하자.
TestCode.kt
@Nested
@DisplayName("숫자의 합이 50 이하여야 한다")
inner class SumValue{
fun sumNumbers(numA, numB): Int{
val result = numA + numB
if (result > 50) throw IllegalStateException()
return numA + numB
}
// 성공
@ParameterizedTest
@CsvSource("20, 20, 40")
fun success(inputA, inputB, output) {
val result = sumNumbers(inputA, inputB)
assertEquals(output, result)
}
// 실패
@ParameterizedTest
@CsvSource("20, 40")
fun fail(inputA, inputB){
assertThrows<IllegalStateException> {
val result = sumNumbers(inputA, inputB)
}
}
Given은 테스트를 시작하기 전 주어진 환경을 의미한다.
단순하게 테스트케이스부터 테스트 객체를 초기화하는 전 과정이 포함된다.
위 코드에서 클래스를 만들고 sumNumbers함수 선언, CsvSource로 테스트 케이스를 선언하는 전 과정까지를 Given으로 분류할 수 있다.
When은 테스트 하고자 하는 유닛의 실행을 의미한다.
일반적으로 가장 짧으며 실행 부분을 담당한다.
위 코드에서 success와 fail을 하는 과정이다.
Then은 테스트 결과에 대한 검증이다.
예상되는 결과값에 맞는 데이터가 나왔는지 확인하는 테스트 코드를 작성하는 가장 큰 역할을 담당한다.
위 코드에서 assertEquals나 assertThrows로 예상하는 결과가 나타났는지 확인하는 부분이다.
그동안 테스트 코드를 작성할 때, 유닛마다 적용하기 부분이 있어 통일된 기준에 맞춰 관리하기 어려운 부분이 있었다.
그러나 유닛마다 통합된 기준의 적용이 어려운 부분을 감안하고 Given-When-Then패턴을 통해 이러한 형식을 유지하는 방향으로 테스트 코드를 작성했고, 나름 통합된 기준을 제시할 수 있게 되었다..!