본문 바로가기
Java

[Java] JUnit 5 사용법 (3) - Test Results 테스트명 바꾸기 (@DisplayName, @DisplayNameGeneration, @IndicativeSentencesGeneration)

by 노력남자 2022. 9. 6.
반응형

이번 포스팅에선 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

반응형

댓글