ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JUnit 5. 반복문
    BackEnd/JUnit 2022. 2. 3. 17:31
    반응형

    @RepeatedTest

      반복 횟수와 반복 테스트 이름을 설정할 수 있으며, RepetitionInfo 타입의 인자를 받을 수 있습니다. @RepeatedTest 애노테이션 안에 value는 반복 횟수를, name은 테스트 이름입니다. 테스트 이름 지정 시 아래와 같이 placeholder를 지정할 수 있습니다.

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

     

    @ParameterizedTest

      테스트에 여러 다른 인자(Argument)를 대입하면서 반복을 실행합니다. 인자 값들의 소스는 아래와 같습니다. 단일 인자 테스트 시 @ValueSource, 다중 인자 테스트 시 @CsvSource를 사용합니다. @NullSource, @EmptySource는 null 값과 빈 값으로 테스트를 추가적으로 실행합니다. 상세 설명은 https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests 참고하시면 됩니다.

    • @ValueSource
    • @NullSource, @EmptySource, @NullAndEmptySource
    • @EnumSource
    • @MethodSource
    • @CsvSource
    • @CvsFileSource
    • @ArgumentSource
        // 단일 인자
        @ParameterizedTest(name = "{index} argument={0}")
        @ValueSource(strings = {"Java", "Spring", "Kafka", "Redis"})
        @NullSource
        @EmptySource
        void parameterizedTest(String argument) {
            System.out.println(argument);
        }

        // 다중 인자
        @ParameterizedTest
        @CsvSource({"1, Java", "2, Spring"})
        void csvSourceTest(Integer index, String language) {
            System.out.println(index + ": " + language);
        }

     

    SimpleArgumentConverter

      인자 값 타입 변환의 경우 SimpleArgumentConverter 상속 받은 구현체를 만들고 @ConvertWith 애노테이션으로 해당 클래스를 지정하면 됩니다.

        // 타입 변환
        @ParameterizedTest
        @ValueSource(ints = {5, 10, 20})
        void typeConverterTest(@ConvertWith(StartConverter.class) Start start) {
            System.out.println(start.getLimit());
        }
    
        static class StartConverter extends SimpleArgumentConverter {
            @Override
            protected Object convert(Object o, Class<?> aClass) throws ArgumentConversionException {
                return new Start(Integer.parseInt(o.toString()));
            }
        }

     

    ArgumentsAccessor / ArgumentsAggregator

      인자 값 조합의 경우 ArgumentsAccessor를 사용하거나 ArgumentsAggregator 인터페이스 구현 후 @AggregateWith 애노테이션으로 지정해주면 됩니다.

        // 인자 값 조합
        @ParameterizedTest
        @CsvSource({"1, Java", "2, Spring"})
        void argumentsAccessorTest(ArgumentsAccessor argumentsAccessor) {
            System.out.println(argumentsAccessor.getInteger(0) + ": " +
                    argumentsAccessor.getString(1));
        }
    
        // 인자 값 조합 (Custom)
        @ParameterizedTest
        @CsvSource({"1, Java", "2, Spring"})
        void aggregateTest(@AggregateWith(StudyAggregator.class) Study study) {
            System.out.println(study);
        }
    
        static class StudyAggregator implements ArgumentsAggregator {
            @Override
            public Object aggregateArguments(ArgumentsAccessor argumentsAccessor, ParameterContext parameterContext) throws ArgumentsAggregationException {
                return new Study(argumentsAccessor.getInteger(0), argumentsAccessor.getString(1));
            }
        }

    [전체 소스코드]

    반응형

    'BackEnd > JUnit' 카테고리의 다른 글

    JUnit 5. 테스트 순서  (0) 2022.02.03
    JUnit 5. 테스트 인스턴스  (0) 2022.02.03
    JUnit 5. Tag  (0) 2022.01.31
    JUnit 5. 조건문  (0) 2022.01.31
    JUnit 5. Assertion  (0) 2022.01.30

    댓글

Designed by Tistory.