티스토리 뷰

 

1. @RepeatedTest

  - 테스트를 반복해서 실행할 때 사용.

  - 반복 횟수(value)와 반복 테스트 이름(name)을 설정할 수 있다

  • displayName : @DisplayName 어노테이션으로 설정한 이름 가져오기
  • currentRepetition : 현재 반복 횟수
  • totalRepetitions : 전체 반복 횟수

  - RepetitionInfo 타입의 인자를 받을 수 있다.

@DisplayName("스터디 만들기")
//    @RepeatedTest(value = 10, name = "{displayName}, {currentRepetition}/{totalRepetitions}")
@RepeatedTest(value = 10, name = RepeatedTest.LONG_DISPLAY_NAME)
void repeatTest(RepetitionInfo repetitionInfo) {
    System.out.println("repetitionInfo = " + repetitionInfo.getCurrentRepetition() + "/" +
            repetitionInfo.getTotalRepetitions());
}

>> 실행 결과

 

@RepeatedTest 의 name 에서 displayName이 실행 결과에 표시되지 않을 때

다음과 같이 설정을 바꿔준다.

Build and run using, Run tests using 을 intelliJ로 설정

 

 

2. @ParameterizedTest

1) @ValueSource

  - 프로퍼티 : ints, strings, booleans ...

  - 파라미터를 인자로 받아서 파라미터 각각 테스트를 반복 실행할 때 사용

@DisplayName("이름 출력")
@ParameterizedTest(name = "{index} {displayName} name={0}")
@ValueSource(strings = {"mandy", "kessun", "hongseok"})
void parameterzedTest(String name) {
    System.out.println("name = " + name);
}

>> 실행 결과

(1) @ConvertWith

  - 파라미터를 인스턴스의 멤버변수에 할당해서 반복 테스트할 때 사용

  - custom converter 를 만들어 @ValuSource 파라미터를 인스턴스의 멤버변수에 할당하기

 

SimpleArgumentConverter 를 상속받는 StudyConverter를 만들고

매개변수 source 를 통해 study 인스턴스를 만들어 반환하도록 정의한다.

(limit 를 파라미터로 받는 생성자 사용)

테스트 메소드에서는 @ConverWith 어노테이션에 converter를 설정

 

StudyConverter 에서

source 는 @ValuSource를 통해 넘어오는 파라미터이고

targerType Class 는 @ConverWith 어노테이션이 붙은 클래스 Study 이다.

 

파라미터가 1개일 때 사용

@DisplayName("스터디 만들기")
@ParameterizedTest(name = "{index} {displayName} name={0}")
@ValueSource(ints = {10, 20, 30})
void parameterzedTest(@ConvertWith(StudyConverter.class) Study study) {
    System.out.println("limit = " + study.getLimit());
}

static class StudyConverter extends SimpleArgumentConverter {

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

>> 실행 결과

 

3) @CsvSource

  - 한 번에 여러개의 파라미터를 받는 테스트를 반복할 때 사용

  - Integer 값과 String 값을 받아 Study 인스턴스의 limit 와 name 필드에 각각 할당하기

 

(1) Integer, String 각각 파라미터로 받기

@DisplayName("스터디 만들기")
@ParameterizedTest(name = "{index} {displayName} name={0}")
@CsvSource({"10, '자바 스터디", "20, '스프링"})
void parameterzedTest(Integer limit, String name) {
    Study study = new Study(limit, name);
    System.out.println(study);
}

 

(2) ArgumentAccessor 사용

@DisplayName("스터디 만들기")
@ParameterizedTest(name = "{index} {displayName} name={0}")
@CsvSource({"10, '자바 스터디", "20, '스프링"})
void parameterzedTest(ArgumentsAccessor argumentsAccessor) {
    Study study = new Study(argumentsAccessor.getInteger(0), argumentsAccessor.getString(1));
    System.out.println(study);
}

(3) @AggregateWith (custom Aggregator 를 만들어 사용)

  - ArgumentsAggregator 인터페이스를 구현하는 StudyAggregator 를 만들고

  - 매개변수 accessor 에서 @CsvSource 의 파라미터를 꺼내 Study 인스턴스를 만들고 반환한다.

  - 테스트 메소드에서 @AggregateWith 로 Aggregator 클래스를 매핑한다.

@DisplayName("스터디 만들기")
@ParameterizedTest(name = "{index} {displayName} name={0}")
@CsvSource({"10, '자바 스터디", "20, '스프링"})
void parameterzedTest(@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));
    }
}

>> 실행 결과

 

 

4) @NullSource, @EmptySource, @NullAndEmptySource

  - @NullSource : 파라미터에 null을 추가

  - @EmptySource : 파라미터에 빈 값을 추가

  - @NullAndEmptySource : @NullSource와 @EmptySourc를 조합한 composed annotation

@DisplayName("이름 출력")
@ParameterizedTest(name = "{index} {displayName} name={0}")
@ValueSource(strings = {"mandy", "kessun", "hongseok"})
//    @NullSource
//    @EmptySource
@NullAndEmptySource
void parameterzedTest(String name) {
    System.out.println("name = " + name);
}

>> 실행 결과

 

 

 

 

 

출처

https://www.inflearn.com/course/the-java-application-test 더 자바, 애플리케이션을 테스트하는 다양한 방법(백기선)

728x90