이번에는 @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 = 2; 2 * 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(3, 2));
}
@Test
void test_subtraction() {
assertEquals(1, Calculator.subtraction(3, 2));
}
@Test
void test_multiplication() {
assertEquals(15, Calculator.multiplication(3, 5));
}
@Test
void test_division() {
assertEquals(5, Calculator.division(25, 5));
}
@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(3, 2));
}
@Test
@DisplayName("Calculator subtraction test")
void test_subtraction() {
assertEquals(1, Calculator.subtraction(3, 2));
}
@Test
@DisplayName("Calculator multiplication test")
void test_multiplication() {
assertEquals(15, Calculator.multiplication(3, 5));
}
@Test
@DisplayName("Calculator division test")
void test_division() {
assertEquals(5, Calculator.division(25, 5));
}
@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(3, 2));
}
@Test
@DisplayName("Calculator subtraction test(뺄셈 테스트)")
void test_subtraction() {
assertEquals(1, Calculator.subtraction(3, 2));
}
@Test
@DisplayName("Calculator multiplication test(곱셈 테스트)")
void test_multiplication() {
assertEquals(15, Calculator.multiplication(3, 5));
}
@Test
@DisplayName("Calculator division test(나눗셈 테스트)")
void test_division() {
assertEquals(5, Calculator.division(25, 5));
}
@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(3, 2));
}
@Test
void test_subtraction() {
assertEquals(1, Calculator.subtraction(3, 2));
}
@Test
void test_multiplication() {
assertEquals(15, Calculator.multiplication(3, 5));
}
@Test
void test_division() {
assertEquals(5, Calculator.division(25, 5));
}
@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(3, 2));
}
@Test
void test_subtraction() {
assertEquals(1, Calculator.subtraction(3, 2));
}
@Test
void test_multiplication() {
assertEquals(15, Calculator.multiplication(3, 5));
}
@Test
void test_division() {
assertEquals(5, Calculator.division(25, 5));
}
@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를 호출
'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 |