반복해서 테스트를 하고 싶을 때 다음과 같이 사용할 수 있다.
@RepeatedTest
반복 횟수와 반복 테스트 이름을 설정할 수 있다.
@RepeatedTest(value, name ) 옵션들
- {displayName}
- {currentRepetition}
- {totalRepetitions}
RepetitionInfo 타입의 인자를 받을 수 있다.
@RepeatedTest(10) void repeatTest(RepetitionInfo repetitionInfo) { System.out.println("반복 테스트 " + repetitionInfo.getCurrentRepetition() + " \n" + // 현재 반복 횟수 repetitionInfo.getTotalRepetitions()); // 총 반복 횟수(10) }
어노테이션의 name속성에 다음과 같이 이름도 줄 수 있다
@DisplayName("반복 테스트 ") @RepeatedTest(value = 10, name = "{displayName}, ! {currentRepetition} / {totalRepetition}") void repeatTest(RepetitionInfo repetitionInfo) { System.out.println("반복 테스트 " + repetitionInfo.getCurrentRepetition() + " \n" + repetitionInfo.getTotalRepetitions()); }
@ParameterizedTest
테스트에 여러 다른 매개변수를 대입해가며 반복 실행한다.
@ParameterizedTest(name = "")의 옵션들
- {displayName}
- {index}
- {arguments}
- {0}, {1}, ...
@ParameterizedTest @ValueSource(strings = {"날씨가", "많이", "추워지고", "있습니다."}) void parameterizedTest(String message) { System.out.println(message); // 날씨가 \n 많이 \n 추워지고 \n 있습니다. \n }
- ValueSource의 인자를 하나씩 루프를 돌며 출력
JUnit 5 테스트 반복하기 2부
인자 값들의 소스
- 인자 값은 객체로도 받을 수 있다.(ex Study, User, UserDto 등)
- 인자 값(위 예제에서는 String message)에 어노테이션 이름에 맞는 값을
인자
에 넣어줌- Null 이면 Null, Empty면
" "(빈값)
- Null 이면 Null, Empty면
- @ValueSource
- @NullSource, @EmptySource, @NullAndEmptySource
- @EnumSource
- @MethodSource
- @CvsSource
- @CvsFileSource
- @ArgumentSource
인자 값 타입 변환
- 암묵적인 타입 변환
- 레퍼런스 참고
- 명시적인 타입 변환
- SimpleArgumentConverter 상속 받은 구현체 제공
- @ConvertWith
static class StudyConverter extends SimpleArgumentConverter {
@Override
protected Object convert(Object o, Class<?> aClass) throws ArgumentConversionException {
assertEquals(Study.class, aClass, "Can only convert to Study");
return new Study(Integer.parseInt(o.toString()));
}
@DisplayName("컨버터 테스트")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@ValueSource(ints = {10, 20, 40})
void parameterizedTest2(@ConvertWith(StudyConverter.class) Study study) {
System.out.println(study.getLimit());
}
}
SimpleArgumentConverter를 상속받은 컨버터 클래스를 정의하고
@ConvertWith 어노테이션과 함께 사용할 수 있다.
- ArgumentConverter는 하나의 인자값에만 사용 가능!
- 여러개의 인자값을 사용할려면
ArgmentsAccessor
를 사용해야 한다
####인자 값 조합
- ArgumentsAccessor
- 커스텀 Accessor
- ArgumentsAggregator 인터페이스 구현
- @AggregateWith
@DisplayName("컨버터 테스트")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@CsvSource({"10, '자바 스터디'", "20, 스프링"}) // '' 공백을 포함한 문자열을 넣을때 사용
void parameterizedTest3(ArgumentsAccessor argumentsAccessor) {
Study study = new Study(argumentsAccessor.getInteger(0), argumentsAccessor.getString(1));
System.out.println(study);
}
ArgumentsAccessor로 부터 인자를 받아 new 인스턴스를 만들어주기도 귀찮다면 ?
Custom한
Aggregator
를 만들면 된다. (ArgumentsAggregator 인터페이스를 구현 )@AggregateWith
어노테이션을 사용해서 인자로 받는다
//Aggregator 인터페이스 구현
static class StudyAggregator implements ArgumentsAggregator {
@Override
public Object aggregateArguments(ArgumentsAccessor argumentsAccessor,
ParameterContext parameterContext)
throws ArgumentsAggregationException {
return new Study(argumentsAccessor.getInteger(0), argumentsAccessor.getString(1));
}
@DisplayName("컨버터 테스트")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@CsvSource({"10, '자바 스터디'", "20, 스프링"})
// '' 공백을 포함한 문자열을 넣을때 사용
void parameterizedTest4(@AggregateWith(StudyAggregator.class) Study study) {
System.out.println(study);
}
}
- ArgumentsAggregator를 구현한 클래스의 제약조건
- 반드시
static inner class
이거나public class
여야 한다.
- 반드시
참고
- 인프런 백기선님 강의 더 자바, 애플리케이션을 테스트하는 다양한 방법
'테스트 > JUnit' 카테고리의 다른 글
Spring Boot JPA Test @DataJpaTest 기본 설정 (3) | 2022.08.27 |
---|---|
JUnit5 - Java에서의 단위테스트5 Mock, Mockito, Stup (0) | 2022.08.21 |
JUnit5 - Java에서의 단위테스트4 Mock, Mockito (0) | 2022.08.21 |
JUnit5 - Java에서의 단위테스트3 - 테스트 인스턴스들 (0) | 2022.08.21 |
JUnit5 - Java에서의 단위테스트 1 (0) | 2022.08.21 |