Testing Codes/JUnit5

[JUnit5] @ParameterizedTest와 @CsvSource같이 사용해 다양한 입력값이 필요한 상황 테스트 하기

@ValueSource를 사용한 @ParameterizedTest의 한계

이전 글에서는 SimpleMultiplier 객체에 대해 @ParameterizedTest와 @ValueSource를 사용해 다양한 Input 값이 있을 때 Output 값이 정확히 나오는지 테스트를 진행했다. 

class SimpleMultiplier() {
    fun multiplyAll(vararg numbers: Int): Int {
        return numbers.fold(1) { acc, number ->
            acc * number
        }
    }
}
class SimpleMultiplierTest {
    lateinit var simpleMultiplier: SimpleMultiplier

    @BeforeEach
    fun setUp() {
        simpleMultiplier = SimpleMultiplier()
    }

    @ParameterizedTest
    @ValueSource(
        ints = [3, -3, 0]
    )
    fun `test multiply with inputs`(input: Int) {
        // When
        val result = simpleMultiplier.multiplyAll(2, input)

        // Then
        if (input == 0) {
            assertEquals(0, result)
        } else {
            assertEquals(2 * input, result)
        }
    }
}

하지만, 이 테스트는 약간 불편한 점이 있다. Input은 마음대로 줬지만, Output 값은 자신이 직접 계산을 해서 넣어야 한다는 점이다. 이러한 문제를 해결하기 위해서 Input 값과 Output 값을 한 번에 지정할 수 있는 @CsvSource나 @CsvSourceFile 를 사용할 수 있다.

 

 

@CsvSource와 @ParameterizedTest 함께 사용하기 

CscSource는 이름과 같이 Csv 형태의 값을 파싱해서 사용할 수 있는 파라미터이다. CscSource는 가변 인자로 값들을 받으며, ','을 구분자로 활용해 이 값들은 순차적으로 파싱해서 입력값으로 넣는다. 예를 들어 위의 테스트는 다음과 같이 바뀔 수 있다.

class SimpleMultiplierTest {
    lateinit var simpleMultiplier: SimpleMultiplier

    @BeforeEach
    fun setUp() {
        simpleMultiplier = SimpleMultiplier()
    }

    @ParameterizedTest
    @CsvSource(
        "3, 6",
        "-3, -6",
        "0, 0"
    )
    fun `test multiply with inputs`(input: Int, output: Int) {
        // When
        val result = simpleMultiplier.multiplyAll(2, input)

        // Then
        assertEquals(output, result)
    }
}

이 CsvSource의 각 라인의 첫 값은 input이 되며 둘째 값은 output이 된다. 따라서 테스트를 실행해보면 다음과 같은 결과가 나온다.

그림1. CsvSource를 사용한 테스팅

CsvSource를 사용한 테스트가 이전에 다룬 ValueSource를 사용하는 것보다 더욱 직관적인 것을 확인할 수 있다.

 

@CsvSource 사용해 셋 이상의 값 입력 받기

CsvSource를 사용하면 셋 이상의 값도 입력 받을 수 있다. 앞의 예제의 첫 곱하기 값이 2로 고정되어 있었는데, 이 값 또한 입력 받도록 변경하면 다음과 같아진다.

@ParameterizedTest
@CsvSource(
    "3, 6, 18",
    "-3, 6, -18",
    "0, 6, 0"
)
fun `test multiply with multiple inputs`(input1: Int, input2: Int, output: Int) {
    // When
    val result = simpleMultiplier.multiplyAll(input1, input2)

    // Then
    assertEquals(output, result)
}

테스트를 실행하면 다음과 같은 결과가 나오는 것을 볼 수 있다.

그림2. CsvSource에서 셋 이상의 값 입력 받기

이렇게 CsvSource를 사용하면 테스트를 더욱 간결하게 만들 수 있다.

 

정리

CsvSource는 ParameterizedTest에 둘 이상의 입력 값이 필요할 때 사용할 수 있는 좋은 선택지 중 하나로, CsvSource를 사용하면 여러 상황에 대한 테스트를 간결하게 만들 수 있다. 

반응형

 

이 글의 저작권은 Dev World 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.

 

 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com