Junit5 테스트 반복하기에 대해서 알아보도록 하겠습니다.
이 글은 백기선님 더 자바, 애플리케이션을 테스트하는 다양한 방법을 정리한 글입니다.
더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의
자바 프로그래밍 언어를 사용하고 있거나 공부하고 있는 학생 또는 개발자라면 반드시 알아야 하는 애플리케이션을 테스트하는 다양한 방법을 학습합니다., 그냥 개발자를 넘어 '더 나은 개발
www.inflearn.com
Junit에서 테스트 반복하는 방법은 2가지가 있습니다.
@RepeatedTest와 @ParameterizedTest 이렇게 2가지 방법이 있습니다.
@RepeatedTest
@RepeatedTest는 동일한 테스트 메서드를 여러 번 실행하려는 경우에 사용됩니다.
@DisplayName("반복 테스트")
@RepeatedTest(value = 10, name = "{displayName} {displayName}, {currentRepetition}/{totalRepetitions}")
void repeatTest(RepetitionInfo repetitionInfo){
System.out.println("test " + repetitionInfo.getCurrentRepetition() + "/" + repetitionInfo.getTotalRepetitions());
}
@RepeatedTest는 두 개의 파라미터를 받습니다.
하나는 몇번 반복하는지에 대한 value와 두 번째는 테스트 디스플레이에 나타낼 수 있는 name입니다.
name 에는 {displayName} {currentRepetition} {totalRepetitions}을 사용해서 화면에 나타낼 수 있습니다.
- {displayName} : @DisplayName의 값을 가져옵니다.
- {currentRepetition} : 현재 반복 횟수를 표시합니다.
- {totalRepetitions} : 총 반복 횟수를 표시합니다.
그리고 RepetitionInfo을 인자로 가져올 수 있는데 RepetitionInfo은 마찬가지로 현재 반복 횟수, 총 반복 횟수를 가져올 수 있습니다.
@ParameterizedTest
@ParameterizedTest 동일한 테스트 메서드를 다양한 입력 값으로 여러 번 실행하려는 경우에 사용됩니다.
@ParameterizedTest은 name에 {displayName} {index} {인덱스 번호}을 사용해서 화면에 나타낼 수 있는데
{displayName} : @DisplayName의 값을 가져옵니다.
{index} : 현재 인덱스 값을 가져올 수 있습니다.
{인덱스 번호} : 인덱스 번호의 데이터를 표시할 수 있습니다.
@ParameterizedTest는 동일한 것을 여러 번 실행하기 때문에 인자 값들의 소스를 설정할 수 있습니다.
- @ValueSource
- @NullSource, @EmptySource, @NullAndEmptySource
- @EnumSource
- @MethodSource
- @CsvSource
- @CvsFileSource
- @ArgumentSource
@ValueSource
@ValueSource는 특정 값들을 지정하여 테스트 메서드를 여러 번 실행할 수 있습니다.
@ValueSource에는 Primitive 타입이나 String 및 Class를 넣어 줄 수 있습니다.
@DisplayName("파라미터 String 반복 테스트")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@ValueSource(strings = {"날씨가", "많이", "추워지고", "있습니다."})
void parameterizedTest(String message){
System.out.println(message);
}
@NullSource, @EmptySource, @NullAndEmptySource
@NullSource, @EmptySource, @NullAndEmptySource는 각각 Null, 아무것도 없는 값, Null 하고 아무것도 없는 값을 넣어줍니다.
@NullAndEmptySource에는 @NullSource @EmptySource가 들어있습니다.
@DisplayName("파라미터 Empty Null 반복 테스트")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@ValueSource(strings = {"날씨가", "많이", "추워지고", "있습니다."})
@EmptySource
@NullSource
@NullAndEmptySource
void EmptyNullTest(String message){
System.out.println(message);
}
@EnumSource
@EnumSource는 Enum 타입의 값들을 넣어줍니다.
@DisplayName("Enum 테스트")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@EnumSource(StudyEnum.class)
void EnumTest(StudyEnum studyEnum){
System.out.println(studyEnum);
}
Instance로 받기
인스턴스로 값을 받아 테스트 가능한데 Converter에 대한 구현체가 존재해야 합니다.
하나만 있을 때는 SimpleArgumentConverter 그 이상일 경우에는 ArgumentsAggregator 인터페이스를 구현해서 사용해야 합니다.
먼저 SimpleArgumentConverter을 구현해서 인스턴스로 받아보도록 하겠습니다.
@DisplayName("인스턴스 테스트")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@ValueSource(ints = {10,20,40})
void instanceTest(@ConvertWith(StudyConverter.class) Study study){
System.out.println("study.getLimit() = " + study.getLimit());
}
static class StudyConverter extends SimpleArgumentConverter{
@Override
protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException {
assertEquals(Study.class, targetType, "스터디만 변경 가능합니다.");
return new Study(Integer.parseInt(source.toString()));
}
}
source 오브젝트로 값을 받아 Study를 생성해서 넘겨줍니다.
@CsvSource
@CsvSource는 CSV 형식의 데이터를 사용하여 테스트를 실행합니다.
@CsvSource는 ArgumentsAccessor를 통해서 값을 가져올 수 있습니다.
@DisplayName("csv 반복 테스트")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@CsvSource({"10, '자바 스터디'", "20, '스프링'"})
void csvTest(ArgumentsAccessor argumentsAccessor){
Study study = new Study(argumentsAccessor.getInteger(0), argumentsAccessor.getString(1));
System.out.println("study.getLimit() = " + study.getLimit());
System.out.println("study.getName() = " + study.getName());
}
이보다 더 간결하게 가져오고 싶으면 ArgumentsAggregator 인터페이스를 구현해서 값을 가져올 수 있습니다.
static class StudyAggregator implements ArgumentsAggregator{
@Override
public Object aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) throws ArgumentsAggregationException {
return new Study(accessor.getInteger(0), accessor.getString(1));
}
}
@DisplayName("ArgumentsAggregator 반복 테스트")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@CsvSource({"10, '자바 스터디'", "20, '스프링'"})
void argumentsAggregatorTest(@AggregateWith(StudyAggregator.class) Study study){
System.out.println("study.getLimit() = " + study.getLimit());
System.out.println("study.getName() = " + study.getName());
}
테스트를 반복하는 방법에 대해서 알아보았습니다.
특히 @ParameterizedTest는 파라미터에 따라 테스트 케이스를 다르게 실행할 수 있어 매우 유용하게 사용할 것 같습니다.
감사합니다.
Bongveloper Github Junit5
GitHub - kibongcoders/junit5
Contribute to kibongcoders/junit5 development by creating an account on GitHub.
github.com
출처 :
더 자바, 애플리케이션을 테스트하는 다양한 방법
더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의
자바 프로그래밍 언어를 사용하고 있거나 공부하고 있는 학생 또는 개발자라면 반드시 알아야 하는 애플리케이션을 테스트하는 다양한 방법을 학습합니다., 그냥 개발자를 넘어 '더 나은 개발
www.inflearn.com
'Java > 더 자바, 애플리케이션을 테스트하는 다양한 방법' 카테고리의 다른 글
Junit5 @ExtendWith, @RegisterExtension 확장 모듈 (0) | 2023.09.12 |
---|---|
Junit5 테스트 인스턴스, 테스트 순서 (0) | 2023.09.12 |
Junit5 태깅, 필터링 Tagging, Filtering (0) | 2023.09.11 |
Junit5 조건에 따라 테스트 실행하기 (0) | 2023.09.11 |
Junit5 Assertion (0) | 2023.09.08 |