본문 바로가기

Java/Junit 5

Junit 5 - 반복 테스트

728x90

 Junit 5에서 반복 테스트 작동 방식, 테스트 케이스 작성 시 @RepeatedTest, RepetitionInfo 사용 방법, 반복 테스트 작성 시 사용자 지정 이름 표시, 테스트 메서드 실행 순서가 반복 테스트에서 작동하는 방식 및 다음을 사용하여 사용자 지정 Annotation을 만드는 방법을 살펴보도록 하겠습니다.

 

1. Junit 5 반복 테스트

 

@RepeatedTest  Annotation이 달린 메서드는 지정된 횟수만큼 반복되어야 하는 테스트 템플릿 메서드임을 알리는 데 사용됩니다.

 

1.1. @RepeatedTest 예제

@RepeatedTest 테스트 메서드는 일반 @Test 메서드와 동일하며 동일한 수명 주기입니다.
@RepeatedTest 테스트 메서드는 private이거나 stattic 이어서는 안 되며 void를 반환해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.tistory.itbaewom.repeated;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.Test;
 
import com.tistory.itbaewom.util.Calculator;
 
public class Junit5RepeatedTestTest {
 
    @RepeatedTest(1)
    static void test_Add() {
        System.out.println("test_Add()");
        assertEquals(5, Calculator.addition(32));
    }
 
    @Test
    void test_Multiply() {
        System.out.println("test_Multiply()");
        assertEquals(15, Calculator.multiplication(35));
    }
 
    @RepeatedTest(3)
    void test_Devide() {
        System.out.println("test_Devide()");
        assertEquals(5, Calculator.division(255));
    }
 
    @RepeatedTest(2)
    void test_IsPrime() {
        System.out.println("test_IsPrime()");
        assertTrue(Calculator.isPrimeNumber(13));
    }
}
cs

 

테스트 수행 결과 입니다.

 

콘솔창에 나타난 결과 입니다.

@RepeatedTest(1) Annotation이 붙은 test_Add() 메서드는 static이라 실행되지 않았습니다.

@RepeatedTest(2), @RepeatedTest(3) 이 붙은 테스트 메서드는 각각 2회 3회 반복 실행되었습니다.

 

 

1.2. @RepeatedTest custom test name 예제

@RepeatedTest 메서드의 맞춤 이름을 구성할 수 있습니다.
다음은 반복 테스트에 대한 사용자 지정 이름을 표시하는 데 사용할 수 있는 표시자입니다. 
또는 RepeatedTest.LONG_DISPLAY_NAME 또는 RepeatedTest.LONG_DISPLAY_NAME을 사용할 수 있습니다.
{displayName}: 테스트 방법의 이름입니다.
{currentRepetition}: 현재 반복 횟수입니다.
{totalRepetitions}: 총 반복 횟수입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.tistory.itbaewom.repeated;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.Test;
 
import com.tistory.itbaewom.util.Calculator;
 
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class Junit5_RepeatedTest_CustomDisplayName_Test {
 
    @Test
    void test_Add() {
        System.out.println("test_Add()");
        assertEquals(5, Calculator.addition(32));
    }
 
    @RepeatedTest(value = 1, name = RepeatedTest.SHORT_DISPLAY_NAME)
    void test_Multiply() {
        System.out.println("test_Multiply()");
        assertEquals(15, Calculator.multiplication(35));
    }
 
    @RepeatedTest(value = 3, name = "{displayName} - {currentRepetition}/{totalRepetitions}")
    void test_Devide() {
        System.out.println("test_Devide()");
        assertEquals(5, Calculator.division(255));
    }
 
    @RepeatedTest(value = 2, name = RepeatedTest.LONG_DISPLAY_NAME)
    void test_IsPrime() {
        System.out.println("test_IsPrime()");
        assertTrue(Calculator.isPrimeNumber(13));
    }
}
cs

 

테스트 수행 결과 입니다.  테스트 메서드 이름을 확장해 보면 실행 결과를 확인이 가능합니다.

 

콘솔창에 나타난 결과 입니다.

 

 

 

2. Junit 5 RepetitionInfo 주입

RepetitionInfo는 반복 테스트의 현재 반복에 대한 정보를 @RepeatedTest, @BeforeEach, @AfterEach 메서드에 주입하는 데 사용됩니다. 

메소드 매개변수가 RepetitionInfo 유형인 경우 JUnit은 현재 반복 테스트에 해당하는 RepetitionInfo 인스턴스를 매개변수 값으로 제공합니다. 

RepetitionInfo는 해당 테스트 메서드가 @RepeatedTest가 아닌 경우 @BeforeEach 또는 @AfterEach 메서드에 삽입할 수 없습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.tistory.itbaewom.repeated;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.RepetitionInfo;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
 
import com.tistory.itbaewom.util.Calculator;
 
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class Junit5_RepeatedTest_RepetitionInfo_Test {
 
    @BeforeEach
    void beforeEach(TestInfo testInfo, RepetitionInfo repetitionInfo) {
        int currentRepetition = repetitionInfo.getCurrentRepetition();
        int totalRepetitions = repetitionInfo.getTotalRepetitions();
        String methodName = testInfo.getTestMethod().get().getName();
 
        System.out.println(String.format("About to execute repetition %d of %d for %s"
                                         currentRepetition, totalRepetitions, methodName));
    }
 
    @Test
    void test_Add(RepetitionInfo repetitionInfo) {
        System.out.println("test_Add()");
        assertEquals(5, Calculator.addition(32));
    }
 
    @RepeatedTest(1)
    void test_Multiply() {
        System.out.println("test_Multiply()");
        assertEquals(15, Calculator.multiplication(35));
    }
 
    @RepeatedTest(3)
    void test_Devide() {
        System.out.println("test_Devide()");
        assertEquals(5, Calculator.division(255));
    }
 
    @RepeatedTest(2)
    void test_IsPrime(RepetitionInfo repetitionInfo) {
        assertEquals(2, repetitionInfo.getTotalRepetitions());
        System.out.println("test_IsPrime()");
        assertTrue(Calculator.isPrimeNumber(13));
    }
}
cs

 

테스트 수행 결과 입니다.  RepetitionInfo는 해당 테스트 메서드가 @RepeatedTest가 아닌 경우에 위와 같이 에러가 발생합니다.

 

콘솔창에 나타난 결과 입니다.  다음과 같이 메서드를 호출하여 정보를 출력하였습니다.

repetitionInfo.getCurrentRepetition() : 반복되는 횟수
repetitionInfo.getTotalRepetitions() : 전체 반복 횟수
testInfo.getTestMethod().get().getName() : 메서드 이름

 

 

3. Junit 5 반복 테스트 메서드 실행 순서

 

기본적으로 테스트 메서드 순서는 정의되어 있지 않지만 Junit 5 알고리즘은 기본적으로 후속 테스트 실행에 대해 동일한 메서드 순서를 보장합니다.
순서를 제어하려면 @TestMethodOrder로 테스트 클래스에 Annotation을 사용합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.tistory.itbaewom.repeated;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
import org.junit.jupiter.api.MethodOrderer.Alphanumeric;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
 
import com.tistory.itbaewom.util.Calculator;
 
@SuppressWarnings("deprecation")
@TestMethodOrder(Alphanumeric.class)
public class Junit5_RepeatedTest_MethodOrder_Test {
 
    @RepeatedTest(1)
    static void test_Add() {
        System.out.println("test_Add()");
        assertEquals(5, Calculator.addition(32));
    }
 
    @Test
    void test_Multiply() {
        System.out.println("test_Multiply()");
        assertEquals(15, Calculator.multiplication(35));
    }
 
    @RepeatedTest(3)
    void test_Devide() {
        System.out.println("test_Devide()");
        assertEquals(5, Calculator.division(255));
    }
 
    @RepeatedTest(2)
    void test_IsPrime() {
        System.out.println("test_IsPrime()");
        assertTrue(Calculator.isPrimeNumber(13));
    }
}
cs

 

 

테스트 수행 결과 입니다.  메서드 명이 Alphanumeric.class에따라 영문자 오름차순이 실행 순서가 되었습니다.

 

 

콘솔창에 나타난 결과 입니다.  

 

 

 

4.  Junit 5 사용자 정의 RepeatedTest Annotation 만들기

 

 

인터페이스 만들기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.tistory.itbaewom.repeated;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
import org.junit.jupiter.api.RepeatedTest;
 
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@RepeatedTest(value = 3, name = "{displayName} - {currentRepetition}/{totalRepetitions}")
public @interface MyRepeatedTest {
 
}
cs

 

인터페이스를 사용한 클래스 만들기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.tistory.itbaewom.repeated;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
import com.tistory.itbaewom.util.Calculator;
 
public class Junit5_RepeatedTest_CustomAnnotation_Test {
 
    @MyRepeatedTest
    static void test_Add() {
        System.out.println("test_Add()");
        assertEquals(5, Calculator.addition(32));
    }
 
    @MyRepeatedTest
    void test_Multiply() {
        System.out.println("test_Multiply()");
        assertEquals(15, Calculator.multiplication(35));
    }
 
    @MyRepeatedTest
    void test_Devide() {
        System.out.println("test_Devide()");
        assertEquals(5, Calculator.division(255));
    }
 
    @MyRepeatedTest
    void test_IsPrime() {
        System.out.println("test_IsPrime()");
        assertTrue(Calculator.isPrimeNumber(13));
    }
}
cs

 

 

테스트 수행 결과 입니다.  

 

 

콘솔창에 나타난 결과 입니다.  

 

728x90

'Java > Junit 5' 카테고리의 다른 글

Junit 5 - timeouts  (0) 2023.03.14
Junit 5 - 조건부 테스트 실행  (0) 2023.03.09
Junit 5 - @Disabled  (0) 2023.03.09
Junit 5 - Assumptions  (0) 2023.03.08
Junit 5 – @TestInstance  (0) 2023.03.08