인프런의 "더 자바, 애플리케이션을 테스트하는 다양한 방법”을 보고 정리한 것임

1. @RepeatedTest

  • 반복 횟수와 반복 테스트 이름을 설정할 수 있다.
    • {displayName}
      - @DisplayName로 선언된 이름을 가지고 옴
    • {currentRepetition}
      - 현재 반복되어 지는 번호
    • {totalRepetitions}
      - 전체 반복하는 횟수
  • RepetitionInfo 타입의 인자를 받을 수 있다.
    @DisplayName("반복 테스트")
    @RepeatedTest(value = 10, name = "{displayName}, {currentRepetition} / {totalRepetitions}")
    void repeatTest(RepetitionInfo info) {
        System.out.println("test " + info.getCurrentRepetition() + "/" + info.getTotalRepetitions());
    }

2. @ParameterizedTest

  • 테스트에 여러 다른 매개변수를 대입해가며 반복 실행한다.
    • {displayName}
      - @DisplayName로 선언된 이름을 가지고 옴
    • {index}
      - 현재 반복되어 지는 번호
    • {arguments}
      - 전달되는 파라미터 값
    • {0}, {1}, ...
      - 전달되는 파라미터 값의 인덱스 번호
    @DisplayName("Parameter 반복 테스트")
    @ParameterizedTest(name = "{index} {displayName} stringVal = {0}")
    @ValueSource(strings = {"11111111", "22222222222", "3333333333", "444444444444"})
    void stringValueSourceTest(String s) {
        System.out.println(s);

    }

3. 인자(Parameter) 값에 관련된 Annotation

  • @ValueSource
    • 지정한 배열을 파라미터 값으로 순서대로 넘겨줌
    • 테스트 메소드 실행 당 하나의 인수(argument)만을 전달할 때 사용됨
    • 리터럴 값의 배열을 테스트 메소드에 전달
      • 리터럴 값(literal vales)이란?
        - 변수에 넣는 변하지 않는 데이터를 의미
        - 보통은 기본형의 데이터를 의미하지만, 특정 객체(Immutable class , VO class)에 한에서는 리터럴이 될 수 있음
        - short, byte, int, long, float, double, char, java.lang.String, java.lang.Class
  • @NullSource, @EmptySource, @NullAndEmptySource
    • @NullSource
      • null을 인자로 추가
    • @EmptySource
      • 빈 문자열을 인자로 추가
    • @NullAndEmptySource
      • null과 빈 문자열 모두를 인자로 추가
  • @CsvSource
    • 기본 구분자로는 콤마(',')
    • delimiter 을 직접 정의함으로써 구분자를 지정

4. 인자 값 타입 변환

            @DisplayName("Custom(domain 객체) Parameter 반복 테스트")
            @ParameterizedTest(name = "{index} {displayName} stringVal = {0}")
            @ValueSource(ints = {10, 20, 30})
            void convertValueSourceTest(@ConvertWith(StudyConverter.class) Study study) {
                System.out.println(study.getLimit());

            }

            // public 클래스 혹은 static 인너클래스로 작성해야함
            static class StudyConverter 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()));
                }
            }

5. 인자 값 조합

  • ArgumentsAccessor
    • 두개 이상의 인자값을 받을 수 있음
    @DisplayName("Parameter 반복 테스트")
    @ParameterizedTest(name = "{index} {displayName} stringVal = {0}")
    @CsvSource({"10, '자바 스터디'", "20, '스프링'"})
    void convertCvsTest(ArgumentsAccessor argumentsAccessor) {
        Study study = new Study(argumentsAccessor.getInteger(0),
                argumentsAccessor.getString(1));
        System.out.println(study);

    }
  • 커스텀 Accessor
    • AgumentsAggregator 인터페이스 구현
      • 반드시 static inner class 거나 public class 여야 함
      • @AggregateWith 활용하여 구현한 class를 입력
            @DisplayName("Parameter 반복 테스트")
            @ParameterizedTest(name = "{index} {displayName} stringVal = {0}")
            @CsvSource({"10, '자바 스터디'", "20, '스프링'"})
            void convertCvsTest(@AggregateWith(StudyArgregator.class) Study study) {
                System.out.println(study);

            }

            // public 클래스 혹은 static 인너클래스로 작성해야함
            static class StudyArgregator implements ArgumentsAggregator {
                @Override
                public Object aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) throws ArgumentsAggregationException {
                    Study study = new Study(accessor.getInteger(0),
                            accessor.getString(1));
                    return study;
                }
            }
profile
고우고우~

0개의 댓글