Spring Boot/JUnit5

[JUint5] 테스트 반복하기

수수한개발자 2022. 7. 22.
728x90

@RepeatedTest

@RepeatedTest(10)
void repeatTest() {
    System.out.println("test");
}

@RepeatedTest(10)을 하면 10번 테스트를 반복할 수 있다.

 

 

반복 횟수 가져오기

@RepeatedTest(10)
void repeatTest(RepetitionInfo repetitionInfo) {
    System.out.println("test" + repetitionInfo.getCurrentRepetition() + "/"+
            repetitionInfo.getTotalRepetitions());
}

 

RepetitionInfo를 인자로 받아서 횟수를 알 수 있다.

repetitionInfo.getCurrentRepetition() : 현재 몇번째인지

repetitionInfo.getTotalRepetitions() : 총 몇번 반복하는지

 

 

반복 마다 테스트 이름 넣기

 

@DisplayName("테스트 반복")
@RepeatedTest(value = 10, name = "{displayName}, {currentRepetition}/{totalRepetitions}")
void repeatTest(RepetitionInfo repetitionInfo) {
    System.out.println("test" + repetitionInfo.getCurrentRepetition() + "/"+
            repetitionInfo.getTotalRepetitions());
}

{displayName} 위의 정의한 테스트이름을 가져온다.

 

 

반복마다 파라미터 값을 넣기 테스트

 

@ParameterizedTest
@ValueSource(strings = {"날씨가", "많이", "더워지고", "있네요."})
void parameterizeTest(String message) {
    System.out.println(message);
}

 

 

파라미터 테스트 이름 정의하기

 

@DisplayName("테스트 파라미너 넣기")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@ValueSource(strings = {"날씨가", "많이", "더워지고", "있네요."})
void parameterizeTest(String message) {
    System.out.println(message);
}

 

빈문자열, 널 넣기

 

@DisplayName("테스트 파라미너 넣기")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@ValueSource(strings = {"날씨가", "많이", "더워지고", "있네요."})
@EmptySource
@NullSource
void parameterizeTest(String message) {
    System.out.println(message);
}

 

 

@DisplayName("테스트 파라미너 넣기")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@ValueSource(strings = {"날씨가", "많이", "더워지고", "있네요."})
@NullAndEmptySource
void parameterizeTest(String message) {
    System.out.println(message);
}

 

@EmptySource : 빈 값을 넣어줌.

@NullSource : 널을 넣어줌.

@NullAndEmptySource : 위의 두개를합쳐 쓸 수 있다.

 

암묵적인 타입변환

 

@DisplayName("테스트 파라미너 넣기")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@ValueSource(ints = {10, 20, 40})
void parameterizeTest(@ConvertWith(StudyConvertor.class) Study study) {
    System.out.println(study);
}

static class StudyConvertor extends SimpleArgumentConverter {

    @Override
    protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException {
        assertEquals(Study.class, targetType, "Can only convert to Study");
        return new Study(Integer.parseInt(source.toString()));
    }
}

 

SimpleArgumentConverter를 상속받아 구현하면 ValueSource 를 int로 한다음에 파라미터를 Study클래스로 받을수 있다.

SimpleArgumentConverter 하나의 인자만 가능하다.

 

https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests-argument-conversion-implicit

 

 

인자 값 조합

 

@DisplayName("테스트 파라미너 넣기")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@CsvSource({"10, '자바 스터디'", "20, 스프링"})
void parameterizeTest(ArgumentsAccessor argumentsAccessor) {
    Study study = new Study(argumentsAccessor.getInteger(0), argumentsAccessor.getString(1));
    System.out.println(study);
}

ArgumentsAccessor 에서 getInteger(0)  첫번째 위치에서 인티저를 가져온다,

ArgumentsAccessor 에서 getString(1)  두 번째 위치에서 스트링을 가져온다,

 

@DisplayName("테스트 파라미너 넣기")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@CsvSource({"10, '자바 스터디'", "20, 스프링"})
void parameterizeTest(@AggregateWith(StudyAggregator.class) Study study) {
    System.out.println(study);
}

static class StudyAggregator implements ArgumentsAggregator {
    @Override
    public Object aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) throws ArgumentsAggregationException {
        return new Study(accessor.getInteger(0), accessor.getString(1));
    }
}

 

ArgumentsAggregator 를 상속받아 만들어준다. ArgumentsAggregator  는 static inner 클래스이거나 public 클래스여야 한다.

728x90

'Spring Boot > JUnit5' 카테고리의 다른 글

[JUnit5] 테스트 순서  (0) 2022.07.22
[JUnit5] 테스트 인스턴스  (0) 2022.07.22
[JUnit5] Assumptions  (0) 2022.07.21
[JUnit5] Assertion  (0) 2022.07.21
[JUnit 5] JUit5  (0) 2022.07.21

댓글