JUnit5 테스트 코드 반복 - @RepeatedTest

테스트 코드를 반복하여 실행하는 방법. @RepeatedTest 사용법

반복 테스트

@RepeatedTest 로 메소드를 어노테이션을 지정하면 value 지정된 횟수만큼 테스트가 반복된다.

package com.devkuma.junit5.repeated;

import org.junit.jupiter.api.RepeatedTest;

public class RepeatedMethodTest {

    @RepeatedTest(3)
    void test() {
        System.out.println("test");
    }
}

터미널 실행 결과:

test
test
test

IDE 실행 결과:

test() ✔
├─ repetition 1 of 3 ✔
├─ repetition 2 of 3 ✔
└─ repetition 3 of 3 ✔

반복되는 각 테스트의 표시 이름은 repetition <현재 반복 횟수> of <총 반복 횟수>가 된다.

테스트의 표시되는 이름 지정

@RepeatedTest에 속성 name으로 반복 테스트의 표시되는 이름을 지정할 수 있다.

테스트의 표시되는 이름의 지정에서는 전용의 플레이스홀더가 제공되어, 반복의 정보를 표시명에 반영할 수 있다. 플레이스홀더을 종류는 아래와 같다.

  • displayName
    • 테스트 메소드 표시 이름
    • 기본값은 테스트 메소드의 이름
    • @DisplayName가 지정되면 그 쪽이 사용
  • currentRepetition
    • 현재 반복 횟수
    • 값은 1부터 시작
  • totalRepetitions
    • 총 반복 횟수

기본 표시 되면 이름 미리 정의된 표시 이름 패턴이 @RepetedTest에 제공됨

package com.devkuma.junit5.repeated;

import org.junit.jupiter.api.RepeatedTest;

public class RepeatedNameTest {

    @RepeatedTest(
            name = "displayName={displayName}, currentRepetition={currentRepetition}, totalRepetitions={totalRepetitions}",
            value = 3
    )
    void test() {
        System.out.println("test");
    }

}

터미널 실행 결과:

test
test
test

IDE 실행 결과:

test() ✔
├─ displayName=test(), currentRepetition=1, totalRepetitions=3 ✔
├─ displayName=test(), currentRepetition=2, totalRepetitions=3 ✔
└─ displayName=test(), currentRepetition=3, totalRepetitions=3 ✔

반복 정보를 테스트 메소드에서 받기

@RepeatedTest로 주석이 달린 테스트 메소드는 현재 반복 정보를 담고 있는 RepetitionInfo 객체를 인수로 수신할 수 있다.

RepetitionInfo 객체 메소드는 2개가 있다.

  • getCurrentRepetition()
    • 현재 반복 횟수를 반환한다.
    • 값은 1부터 시작한다.
  • getTotalRepetitions()
    • 총 반복 횟수를 반환한다.

RepetitionInfo 객체는 @BeforeEach, @AfterEach에서도 받을 수 있다.
단, @Test 선언한 일반 테스트 메소드가 섞여 있으면, RepetitionInfo를 해결할 수 없으므로 런타임 오류가 발생한다.

package com.devkuma.junit5.repeated;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.RepetitionInfo;

public class RepetitionInfoTest {
    @BeforeEach
    void before(RepetitionInfo repetitionInfo) {
        printRepetitionInfo("before", repetitionInfo);
    }

    @RepeatedTest(3)
    void test(RepetitionInfo repetitionInfo) {
        printRepetitionInfo("  test", repetitionInfo);
    }

    @AfterEach
    void after(RepetitionInfo repetitionInfo) {
        printRepetitionInfo("after", repetitionInfo);
    }

    private void printRepetitionInfo(String method, RepetitionInfo repetitionInfo) {
        int currentRepetition = repetitionInfo.getCurrentRepetition();
        int totalRepetitions = repetitionInfo.getTotalRepetitions();

        System.out.printf("%s (%d/%d)%n", method, currentRepetition, totalRepetitions);
    }
}

터미널 실행 결과:

before (1/3)
- test (1/3)
after (1/3)
before (2/3)
- test (2/3)
after (2/3)
before (3/3)
- test (3/3)
after (3/3)



최종 수정 : 2022-12-11