-
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