@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이 된다. 따라서 테스트를 실행해보면 다음과 같은 결과가 나온다.
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)
}
테스트를 실행하면 다음과 같은 결과가 나오는 것을 볼 수 있다.
이렇게 CsvSource를 사용하면 테스트를 더욱 간결하게 만들 수 있다.
정리
CsvSource는 ParameterizedTest에 둘 이상의 입력 값이 필요할 때 사용할 수 있는 좋은 선택지 중 하나로, CsvSource를 사용하면 여러 상황에 대한 테스트를 간결하게 만들 수 있다.