이번 포스팅에선 JUnit 5로 테스트할 때 나오는 테스트명을 변경하는 법에 대해 알아보겠습니다.
잠깐! 혹시 Gradle을 사용하고 계시다면 아래 작업을 먼저 해주세요.
IntelliJ에선 Gradle 프로젝트일 경우 기본적으로 Gradle test runner를 사용하는데 @DisplayName 관련된 작업들을 지원하지 않는다고 합니다.
그래서 IntelliJ Test Runner로 변경하는 작업이 필요합니다.
Ctrl + Shift + a -> "Build, " 입력 후 "Build, Execution, Deployment" 엔터 -> 하위 메뉴 "Gradle" 선택 -> Run tests using 값을 Gradle에서 intelliJ IDEA로 변경 -> OK 클릭
@DisplayName
Test Results에 나오는 테스트 클래스, 메소드 이름을 정할 수 있는 어노테이션
파라미터명 | 타입 | 설명 |
value | String | 테스트명 (한글, 특수문자, 이모지 등 다양한 문자 가능 |
예시
어떤 설정도 안하고 그냥 테스트를 돌리면 Test Results에 아래와 같이 코딩한 클래스명, 메소드명이 나옵니다.
class DisplayNameAnnotation {
@Test
void test() {
}
}
@DisplayName을 사용하면 코딩한 이름이 아닌 내가 원하는 이름으로 변경할 수 있습니다.
package com.effortguy.junit5;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@DisplayName("A special test case")
class DisplayNameAnnotation {
@Test
@DisplayName("Custom test name containing spaces")
void testWithDisplayNameContainingSpaces() {
}
@Test
@DisplayName("╯°□°)╯")
void testWithDisplayNameContainingSpecialCharacters() {
}
@Test
@DisplayName("😱")
void testWithDisplayNameContainingEmoji() {
}
}
결과
@DisplayNameGeneration
@DisplayName 처럼 별도의 이름을 주는 것이 아닌 코딩한 클래스, 메소드 이름을 이용해 변형시키는 어노테이션입니다.
파라미터명 | 타입 | 설명 |
value | Class<? extends DisplayNameGenerator> | 정의된 DisplayNameGenerator 중 하나 사용 |
위 파라미터 값은 DisplayNameGenerator 클래스에 사용할 수 있는 방법이 내부 클래스로 정의되어있습니다.
클래스명 | 설명 |
Standard | 기존 클래스, 메소드 명을 사용합니다. (기본값) |
Simple | 괄호를 제외시킵니다. |
ReplaceUnderscores | _(underscore) 를 공백으로 바꿉니다. |
IndicativeSentences | 클래스명 + 구분자(", ") + 메소드명으로 바꿉니다. (@IndicativeSentencesGeneration 를 이용해서 구분자를 커스텀하게 변경할 수 있습니다. |
예시
@Nested는 inner class를 테스트할 수 있게 해주는 어노테이션입니다. 자세한 사용법은 추후에 알아보겠습니다.
(위에 쓴 DisplayNameGenerator 순서대로 코딩했더니 실행 순서가 꺼꾸로 나와서 코딩을 꺼꾸로 했습니다.)
package com.effortguy.junit5;
import org.junit.jupiter.api.*;
public class DisplayNameGenerationAnnotation {
@Nested
@DisplayNameGeneration(DisplayNameGenerator.IndicativeSentences.class)
class DNGAIndicativeSentences {
@Test
void test_display_name_generation() {
}
}
@Nested
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class DNGAReplaceUnderscores {
@Test
void test_display_name_generation() {
}
}
@Nested
@DisplayNameGeneration(DisplayNameGenerator.Simple.class)
class DNGASimple {
@Test
void test_display_name_generation() {
}
}
@Nested
@DisplayNameGeneration(DisplayNameGenerator.Standard.class)
class DNGAStandard {
@Test
void test_display_name_generation() {
}
}
}
결과
IndicativeSentences 는 테스트 결과에 클래스명이 엄청 길게 나왔는데 그 이유는 outer class + "$" + inner class 로 나오기때문입니다.
@IndicativeSentencesGeneration
IndicativeSentences의 구분자를 커스텀하게 사용할 수 있게해줍니다.
파라미터명 | 타입명 | 설명 |
separator | String | 구분자 (기본값 : ", ") |
generator | Class<? extends DisplayNameGenerator> | 정의된 DisplayNameGenerator 중 하나 사용 |
예시
구분자를 " -> " 로 변경하는 코드입니다.
@IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class)
public class IndicativeSentencesGenerationAnnotation {
@Test
void test_display_name_generation() {
}
}
결과
@DisplayNameGeneration를 기본값으로 설정하기
테스트 클래스를 생성할 때마다 @DisplayNameGeneration을 명시해줘야 하는데 이를 편하게 기본값으로 설정할 수 있습니다.
1. test 아래 resources 폴더를 만든 후 junit-platform.properties 파일 생성
만약, 위 이미지와 같이 resources 폴더에 표시가 없다면 아래 작업 추가로 해주세요.
ctrl + alt + shift + s -> Modules -> test -> resources -> Test Resources 클릭 -> OK
2. junit.jupiter.displayname.generator.default에 원하는 DisplayNameGenerator 추가
junit.jupiter.displayname.generator.default = org.junit.jupiter.api.DisplayNameGenerator$ReplaceUnderscores
3. @DisplayNameGenerator 없이도 properties에 명시된 방법이 default로 실행됩니다.
package com.effortguy.junit5;
import org.junit.jupiter.api.Test;
public class DisplayNameGenerationDefault {
@Test
void test_display_name_generator_default() {
}
}
@DisplayNameGeneration 적용 순서
만약, @DisplayName, @DisplayNameGeneration, default 값 설정이 다 되어있으면 뭐가 먼저 적용될까요?
적용 순서는 다음과 같습니다.
(1) @DisplayName
(2) @DisplayNameGeneration
(3) properties에 명시한 default 값
(4) 1, 2, 3 중 아무것도 없으면 DisplayNameGenerator.Standard.class
다음 포스팅에선 필터링 테스트를 할 수 있게 해주는 @tag에 대해서 알아보겠습니다.
읽어주셔서 감사합니다.
참고
https://junit.org/junit5/docs/current/user-guide/#writing-tests-display-name-generator
댓글