본문 바로가기

Java/Junit 5

Junit 5 – Display names

728x90

이번에는 @DisplayName을 사용하여 테스트에 대한 설명을 설정하는 방법과 @DisplayNameGeneration을 사용하여 테스트의 기본 이름을 생성하는 방법 및 예제를 통해 DisplayNameGenerator를 확장하는 사용자 지정 표시 이름을 만드는 방법을 살펴봅니다.

 

1. @DisplayName

Junit 5에서는  테스트 클래스 및 테스트 메서드에 @DisplayName Annotation을 통해 테스트 결과에 표시되는 이름을 변경할 수 있습니다.

 

우선 @DisplayName Annotation을 사용하지 않았을때의 표시 내용입니다.

Calculator.java 파일은 이전 글에서 만든 것을 사용하겠습니다.

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
package com.tistory.itbaewom.util;
 
public class Calculator {
 
    public static int addition(int num1, int num2) {
        return num1 + num2;
    }
 
    public static int subtraction(int num1, int num2) {
        return num1 - num2;
    }
    
    public static int multiplication(int num1, int num2) {
        return num1 * num2;
    }
 
    public static int division(int num, int by) {
        return num / by;
    }
 
    public static boolean isEvenNumber(int num) {
        return num % 2 == 0;
    }
    
    public static boolean isPrimeNumber(int num) {
        boolean isPrimeNumber = true;
        for (int i = 22 * i < num; i++) {
            if (num % i == 0) {
                isPrimeNumber = false;
                break;
            }
        }
        return isPrimeNumber;
    }
}
cs

 

CalculatorTest.java

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
package com.tistory.itbaewom.util;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
import org.junit.jupiter.api.Test;
 
 
public class CalculatorTest {
 
    @Test
    void test_addition() {
        assertEquals(5, Calculator.addition(32));
    }
 
    @Test
    void test_subtraction() {
        assertEquals(1, Calculator.subtraction(32));
    }
    
    @Test
    void test_multiplication() {
        assertEquals(15, Calculator.multiplication(35));
    }
 
    @Test
    void test_division() {
        assertEquals(5, Calculator.division(255));
    }
 
    @Test
    void test_isEvenNumber() {
        assertFalse(Calculator.isEvenNumber(3));
    }
 
    @Test
    void test_isPrimeNumber() {
        assertTrue(Calculator.isPrimeNumber(13));
    }
}
cs

 

Junit 테스트를 실행했을 때의 표시 결과입니다. 테스트 메서드의 이름이 그대로 표시 됩니다.

 

@DisplayName Annotation을 사용했을때의 표시 내용입니다.

 

Junit5DiplayNameTest.java

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
package com.tistory.itbaewom.displayname;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
 
import com.tistory.itbaewom.util.Calculator;
 
@DisplayName("Calculator Test Case")
public class Junit5DiplayNameTest {
 
    @Test
    @DisplayName("Calculator addition test")
    void test_addition() {
        assertEquals(5, Calculator.addition(32));
    }
 
    @Test
    @DisplayName("Calculator subtraction test")
    void test_subtraction() {
        assertEquals(1, Calculator.subtraction(32));
    }
 
    @Test
    @DisplayName("Calculator multiplication test")
    void test_multiplication() {
        assertEquals(15, Calculator.multiplication(35));
    }
 
    @Test
    @DisplayName("Calculator division test")
    void test_division() {
        assertEquals(5, Calculator.division(255));
    }
 
    @Test
    @DisplayName("Calculator isEvenNumber test")
    void test_isEvenNumber() {
        assertFalse(Calculator.isEvenNumber(3));
    }
 
    @Test
    @DisplayName("Calculator isPrimeNumber test")
    void test_isPrimeNumber() {
        assertTrue(Calculator.isPrimeNumber(13));
    }
}
cs

 

Junit 테스트를 실행했을 때의 표시 결과입니다. @DisplayName Annotation으로 지정한 메세지가 출력됩니다.

 

한글도 가능할까요? Junit5DiplayNameTest.java 파일을 다음과 같이 변경해 봅니다.

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
package com.tistory.itbaewom.displayname;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
 
import com.tistory.itbaewom.util.Calculator;
 
@DisplayName("Calculator Test Case(사칙연산 클래스 테스트)")
public class Junit5DiplayNameTest {
 
    @Test
    @DisplayName("Calculator addition test(덧셈 테스트)")
    void test_addition() {
        assertEquals(5, Calculator.addition(32));
    }
 
    @Test
    @DisplayName("Calculator subtraction test(뺄셈 테스트)")
    void test_subtraction() {
        assertEquals(1, Calculator.subtraction(32));
    }
 
    @Test
    @DisplayName("Calculator multiplication test(곱셈 테스트)")
    void test_multiplication() {
        assertEquals(15, Calculator.multiplication(35));
    }
 
    @Test
    @DisplayName("Calculator division test(나눗셈 테스트)")
    void test_division() {
        assertEquals(5, Calculator.division(255));
    }
 
    @Test
    @DisplayName("Calculator isEvenNumber test(짝수 판단 테스트)")
    void test_isEvenNumber() {
        assertFalse(Calculator.isEvenNumber(3));
    }
 
    @Test
    @DisplayName("Calculator isPrimeNumber test(소수 판단 테스트)")
    void test_isPrimeNumber() {
        assertTrue(Calculator.isPrimeNumber(13));
    }
}
cs

 

Junit 테스트를 실행했을 때의 표시 결과입니다. 한글 메세지도 완벽하게 출력됩니다.

 

2.  @Display Name Generation

JUnit Jupiter는 @DisplayNameGeneration Annotation을 통해 표시 이름 생성기를 만들어 사용할 수 있습니다. @DisplayName Annotation을 통해 제공된 값은 항상 DisplayNameGenerator에서 생성된 표시 이름보다 우선합니다.

 

우선 표시되는 DisplayName을 만들어 줄 클래스를 만들어 야 합니다. DisplayNameGenerator.Standard 클래스를 상속받아 만듭니다.

 

MyDisplayNameGenerator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.tistory.itbaewom.displayname;
 
import java.lang.reflect.Method;
import org.junit.jupiter.api.DisplayNameGenerator;
 
public class MyDisplayNameGenerator extends DisplayNameGenerator.Standard {
    @Override
    public String generateDisplayNameForClass(Class<?> testClass) {
        return super.generateDisplayNameForClass(testClass);
    }
 
    @Override
    public String generateDisplayNameForNestedClass(Class<?> nestedClass) {
        return super.generateDisplayNameForNestedClass(nestedClass) + "...";
    }
 
    @Override
    public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) {
        return testClass.getSimpleName() + "클래스의 " + testMethod.getName() + " 메서드 테스트 실행!!";
    }
}
 
cs

 

3개의 메서드가 있는데 각각 다음의 역할을 합니다.

  • public String generateDisplayNameForClass(Class<?> testClass) : 클래스 이름에 사용했을 때
  • public String generateDisplayNameForNestedClass(Class<?> nestedClass) : 내부클래스에 사용했을 때
  • public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) : 메서드이름에  사용했을 때

 

다음으로 Junit5DiplayNameGeneratorTest.java 파일을 다음과 같이 작성합니다.

 

Junit5DiplayNameGeneratorTest.java

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
package com.tistory.itbaewom.displayname;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.Test;
 
import com.tistory.itbaewom.util.Calculator;
 
@DisplayNameGeneration(MyDisplayNameGenerator.class)
public class Junit5DiplayNameGeneratorTest {
 
    @Test
    void test_addition() {
        assertEquals(5, Calculator.addition(32));
    }
 
    @Test
    void test_subtraction() {
        assertEquals(1, Calculator.subtraction(32));
    }
 
    @Test
    void test_multiplication() {
        assertEquals(15, Calculator.multiplication(35));
    }
 
    @Test
    void test_division() {
        assertEquals(5, Calculator.division(255));
    }
 
    @Test
    void test_isEvenNumber() {
        assertFalse(Calculator.isEvenNumber(3));
    }
 
    @Test
    void test_isPrimeNumber() {
        assertTrue(Calculator.isPrimeNumber(13));
    }
}
cs

 

테스트 수행 결과 입니다.

 

이번에는 Junit에서 제공하는 클래스를 이용하는 방법을 실습해 보도록 하겠습니다.

 

@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) Annotation을 이용해 테스트를 수행해 보도록 하겠습니다.

 

Junit5_DiplayName_Generator_Test2.java

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
package com.tistory.itbaewom.displayname;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
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.Test;
 
import com.tistory.itbaewom.util.Calculator;
 
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class Junit5_DiplayName_Generator_Test2 {
 
    @Test
    void test_addition() {
        assertEquals(5, Calculator.addition(32));
    }
 
    @Test
    void test_subtraction() {
        assertEquals(1, Calculator.subtraction(32));
    }
 
    @Test
    void test_multiplication() {
        assertEquals(15, Calculator.multiplication(35));
    }
 
    @Test
    void test_division() {
        assertEquals(5, Calculator.division(255));
    }
 
    @Test
    void test_isEvenNumber() {
        assertFalse(Calculator.isEvenNumber(3));
    }
 
    @Test
    void test_isPrimeNumber() {
        assertTrue(Calculator.isPrimeNumber(13));
    }
}
cs

 

테스트 수행 결과 입니다. 클래스 이름과 메서드 이름에 포함된 _(밑줄)이 모두 공백으로 치환되어 나타납니다.

 

3. 기본 또는 전역 표시 이름 생성기 설정

Junit 5 테스트 사례에 명시적으로 @DisplayName 주석을 사용하지 않는 경우 기본적으로 사용할 수 있는 기본 DisplayNameGenerator를 설정할 수도 있습니다.

기본적으로 사용하려는 DisplayNameGenerator의 정규화된 클래스 이름을 지정하려면 junit.jupiter.displayname.generator.default 구성 매개변수를 설정해야 합니다.  DisplayNameGenerator를 구현하는 맞춤 클래스의 정규화된 이름을 지정할 수 있습니다.

 

src/test/resources의 junit-platform.properties 파일에 지정합니다.


# junit.jupiter.displayname.generator.default = org.junit.jupiter.api.DisplayNameGenerator$ReplaceUnderscores
junit.jupiter.displayname.generator.default = com.tistory.itbaewom.displayname.MyDisplayNameGenerator

 

4. DisplayName 적용 우선 순위

테스트 클래스 또는 메서드의 표시 이름은 다음 우선 순위 규칙에 따라 결정됩니다.

1. @DisplayName 주석 값(있는 경우)
2. @DisplayNameGeneration 주석에 지정된 DisplayNameGenerator 호출(있는 경우)
3. 존재하는 경우 구성 매개변수를 통해 구성된 기본 DisplayNameGenerator 호출
4. org.junit.jupiter.api.DisplayNameGenerator.Standard를 호출

 

728x90

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

Junit 5 - Assumptions  (0) 2023.03.08
Junit 5 – @TestInstance  (0) 2023.03.08
Junit 5 Gradle Projec  (0) 2023.03.06
Junit 5 Maven Project  (0) 2023.03.06
Junit 5 이란?  (0) 2023.03.06