Given - When - Then

312·2024년 5월 27일

패턴 알아보기

목록 보기
1/2



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

Given은 테스트를 시작하기 전 주어진 환경을 의미한다.
단순하게 테스트케이스부터 테스트 객체를 초기화하는 전 과정이 포함된다.

위 코드에서 클래스를 만들고 sumNumbers함수 선언, CsvSource로 테스트 케이스를 선언하는 전 과정까지를 Given으로 분류할 수 있다.

When

When은 테스트 하고자 하는 유닛의 실행을 의미한다.
일반적으로 가장 짧으며 실행 부분을 담당한다.

위 코드에서 successfail을 하는 과정이다.

Then

Then은 테스트 결과에 대한 검증이다.
예상되는 결과값에 맞는 데이터가 나왔는지 확인하는 테스트 코드를 작성하는 가장 큰 역할을 담당한다.

위 코드에서 assertEqualsassertThrows로 예상하는 결과가 나타났는지 확인하는 부분이다.

Why Given-When-Then?

그동안 테스트 코드를 작성할 때, 유닛마다 적용하기 부분이 있어 통일된 기준에 맞춰 관리하기 어려운 부분이 있었다.

그러나 유닛마다 통합된 기준의 적용이 어려운 부분을 감안하고 Given-When-Then패턴을 통해 이러한 형식을 유지하는 방향으로 테스트 코드를 작성했고, 나름 통합된 기준을 제시할 수 있게 되었다..!

profile
안드로이드 개발자 이상일입니다.

0개의 댓글