대량 데이터에 대한 테스트 필요성
모든 클래스가 클린 아키텍처를 기반으로 만들어지면 좋겠지만, 프로그램이 복잡해지고 많은 요구사항이 들어갈 수록 클래스의 함수가 점점 복잡해질 수 있다. 이런 경우 수 많은 테스트 케이스가 생기게 되는데, 이런 테스트를 위해 @ParameterizedTest와 @CsvFileSource를 함께 사용해 테스트를 진행할 수 있다.
csv파일 준비하기
테스트를 위한 csv파일은 src/test/resources 경로에 넣으면 된다. SimpleMultiplierTestCase.csv 파일을 다음과 같이 만들어 resources 폴더 아래에 넣도록 하자.
그러면 CsvFileSource를 사용해 테스트 하기 위한 준비가 마쳐진다. 개인적으로 CsvFileSource를 사용할 때 마지막에 인자로 이유를 적어주는 것이 좋다고 생각한다. 이렇게 적어주는 이유는 테스트를 실행했을 때 보여진다. 이어서 테스트를 진행해보자.
@CsvFileSource 사용해 테스트 하기
CsvFileSource를 사용해 테스트를 진행 하기 위한 과정은 간단하다. CsvFileSource는 테스트 대상 파일 경로를 배열로 받는다. 이 배열의 값에 아까 만든 SimpleMultiplierTestCase.csv의 경로인 "src/test/resources/SimpleMultiplierTestCase.csv"을 넣으면 된다. 또한 몇몇 csv는 헤더가 존재해 numLinesToSkip을 통해 몇 개의 라인을 생략할 것인지 지정이 가능하다. SimpleMultiplierTestCase.csv파일은 헤더가 없으므로 0을 사용해 첫 라인부터 바로 읽을 수 있도록 설정하고, delimiter은 ','으로 설정해 각 라인의 값이 ','을 통해 구분될 수 있도록 만든다.
@ParameterizedTest
@CsvFileSource(
files = ["src/test/resources/SimpleMultiplierTestCase.csv"],
numLinesToSkip = 0,
delimiter = ','
)
fun `test multiply with inputs`(input1: Int, input2: Int, output: Int, reason: String) {
// When
val result = simpleMultiplier.multiplyAll(input1, input2)
// Then
assertEquals(output, result)
}
모든 준비가 마쳐졌으니, 테스트를 실행해보자.
테스트를 실행하면 다음과 같은 결과가 나온다. csv 파일의 각 인자값이 어떻게 들어갔는지가 테스트 결과에 표시되는 것을 볼 수 있다. 마지막에 이 테스트가 이렇게 실행되는 이유를 써줌으로써 무엇을 테스트하고자 했는지 알려줄 수 있다.
정리
@ParameterizedTest와 @CsvFileSource를 함께 사용하면, 복잡한 로직이 들어 있는 함수에 대해 다양한 엣지 케이스에 대한 테스트를 진행할 수 있어 매우 유용하다.