테스트/JUnit

JUnit5 - Java에서의 단위테스트2 - 테스트 반복

ysk(0soo) 2022. 8. 21. 21:37

반복해서 테스트를 하고 싶을 때 다음과 같이 사용할 수 있다.

  • @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());
      }

      img


  • @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면 " "(빈값)
  • @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를 사용해야 한다

####인자 값 조합

@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 여야 한다.

참고

  • 인프런 백기선님 강의 더 자바, 애플리케이션을 테스트하는 다양한 방법