1. 문제 정의
테스트 코드를 작성하다 보면 반복되는 코드들이 쌓이는 것을 알 수 있습니다.
Set Collection 의 학습 테스트를 예시로 들어보겠습니다.
@Test
void numbersTest() {
// given
Set<Integer> numbers = Set.of(1, 2, 3);
// when, then
assertThat(numbers).contains(1);
assertThat(numbers).contains(2);
assertThat(numbers).contains(3);
}
위 테스트 코드의 문제점은 assertThat().contains(); 가 반복된다는 것입니다.
이러한 코드의 중복을 어떻게 줄일 수 있을까요?
2. @ParameterizedTest
위와 같은 문제를 해결하기 위해 @ParameterizedTest를 활용할 수 있습니다.
2 - 1 @ValueSource
@ParameterizedTest
@ValueSource( ints = {1, 2, 3})
void numbersTest(int number) {
// given
Set<Integer> numbers = Set.of(1, 2, 3);
// when, then
assertThat(numbers).contains(number);
}
이처럼 @ParameterizedTest와 @ValueSoucre를 활용하여 코드의 중복을 줄일 수 있습니다.
하지만 위의 코드에서도 true 인지만 테스트 할 수 있다는 것입니다.
이러한 문제를 해결하기 위해서 @CsvSource를 사용할 수 있습니다.
2 - 2 @CsvSource
@ParameterizedTest
@CsvScource({"1:true", "2,true", "3,true", "4,false", "5,false"}, delimiter = ':')
void numbersTest(int number, String expected) {
// given
Set<Integer> numbers = Set.of(1, 2, 3);
// when, then
assertThat(numbers.contains(number)).isEqualTo(expected);
}
이처럼 csv 형식을 사용해서 테스트 코드를 개선할 수 있습니다.
3. 마무리
@ParameterizedTest를 사용하면 여러 개의 테스트를 할 수 있습니다.
한 개의 인수가 필요할 시 @ValueSoucre를 사용하고,
한 개의 인수와 그에 대한 결과값을 기대한다면 @CsvSoucre를 사용할 수 있습니다.
'Java' 카테고리의 다른 글
어떻게 JVM은 메모리를 관리할까 (0) | 2024.01.13 |
---|---|
디미터의 법칙 (0) | 2023.11.14 |
Spring Test - H2 적용하기 (0) | 2023.10.31 |
Java Record (0) | 2023.10.23 |
== & Equals (0) | 2023.10.15 |