@ParameterizedTestDev/Java2024. 5. 7. 15:21
Table of Contents
문제상황
JUnit을 활용하여 String 메서드의 단위 테스트를 진행하던 중 여러 값을 테스트하려니
다음과 같이 중복 코드가 발생한다.
private Set<Integer> numbers;
@Test
void contains() {
assertThat(numbers.contains(1)).isTrue();
assertThat(numbers.contains(2)).isTrue();
assertThat(numbers.contains(3)).isTrue();
}
해결방안
JUnit의 @ParameterizedTest를 사용하면 아래와 같이 중복 코드를 해결할 수 있다.
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void contains_with_parameterizedTest_ValueSource(int number) {
assertThat(numbers.contains(number)).isTrue();
}
@ValueSource의 배열에서 순차적으로 값을 꺼내어 이를 파라미터로 받고 테스트를 진행한다.
즉 @ValueSource의 배열에 저장된 데이터만큼 해당 단위테스트를 반복 진행한다.
타입으로는 int뿐만 아니라 String, Enum 등 여러 타입을 지정할 수 있다.
더 나아가 만약 입력값마다 각기 다른 기대값이 있어 이를 가지고 테스트를 하는 경우에는
@ValueSource만으로는 한계가 있다.
이때는 다음과 같이 @CsvSource를 통해 입력값과 기대값을 모두 파라미터로 받아 테스트할 수 있다.
@ParameterizedTest
@CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':')
void contains_with_parameterizedTest_CsvSource(int number, Boolean expected) {
assertThat(numbers.contains(number)).isEqualTo(expected);
}
@CsvSource에서 설정한 delmiter를 기준으로 각 데이터의 앞 부분을 입력값, 뒤 부분을 기대값으로 주어,
파라미터로 받고 테스트를 진행했다.
입력으로 Null 값을 넣어주거나 Enum 클래스 활용법 등 자세한 내용은 공식문서에서 확인
https://www.baeldung.com/parameterized-tests-junit-5#sources
'Dev > Java' 카테고리의 다른 글
[Java] Map의 value 값들을 리스트로 반환받기 (0) | 2023.03.11 |
---|---|
[Java] 멀티스레드 (0) | 2022.11.13 |
[Java Exception] NoSuchBeanDefinitionException (0) | 2022.11.05 |
[Java Exception] java.lang.NullPointerException (0) | 2022.10.27 |
[Java] 인터페이스 (0) | 2022.08.06 |
@kjyyjk :: 녕의 학습 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!