@Nested 와 @DisplayName

Jay·2023년 8월 27일

Spring

목록 보기
13/17

@Nested

@Nested 클래스로 비슷한 함수를 묶어 알아보기 쉽게함

Junit 5 User Guide - Nested Test 를 보면 좋은 예제를 제공

public class DisplayNameTest {

    @Test
    public void testAsuccess() { /* */ }

    @Test
    public void testAfail() { /* */ }

    @Test
    public void test1success() { /* */ }

    @Test
    public void test1success() { /* */ }

    @Test
    public void test2success() { /* */ }

    @Test
    public void test2fail() { /* */}
}
public class DisplayNameTest {

    @Nested
    class testA {

        @Test
        public void success() {/* */ }

        @Test
        public void fail() {/* */ }
    }

    @Nested
    class testNumber {

        @Nested
        class test1 {

            @Test
            public void success() {/* */ }

            @Test
            public void fail() {/* */ }
        }

        @Nested
        class test2 {

            @Test
            public void success() {/* */ }

            @Test
            public void fail() {/* */ }

        }
    }
}

전체적인 코드의 양은 늘어났지만 계층적인 구조가 되어 훨씬 알아보기 편해졌다

게다가 클래스로 구분되어 있으니 success 와 fail 을 중복으로 사용해도 전혀 문제가 없다

!https://github.com/ParkJiwoon/PrivateStudy/blob/master/images/nested-display-name-1.png?raw=true

테스트 결과에서도 비슷한 테스트끼리 묶고 결과를 좀더 심플하게 표현

@DisplayName

@Nested 클래스로 계층을 나누어도 여전히 함수명은 알아보기 어렵다.

JUnit 5 User Guide - Display Names 에 나와있는 예제를 보면 함수명이 길어지니 한눈에 들어오지 않지만 @DisplayName 어노테이션을 사용하면 간단하게 표현할 수 있다.

@DisplayName 은 @Nested 클래스와 함께 쓰면 더 빛을 발한다.

public class DisplayNameTest {

    @Nested
    @DisplayName("A 테스트")
    class testA {

        @Test
        @DisplayName("성공")
        public void success() {/* */ }

        @Test
        @DisplayName("실패")
        public void fail() {/* */ }
    }

    @Nested
    @DisplayName("숫자")
    class testNumber {

        @Nested
        @DisplayName("1 테스트")
        class test1 {

            @Test
            @DisplayName("성공")
            public void success() {/* */ }

            @Test
            @DisplayName("실패")
            public void fail() {/* */ }
        }

        @Nested
        @DisplayName("2 테스트")
        class test2 {

            @Test
            @DisplayName("성공")
            public void success() {/* */ }

            @Test
            @DisplayName("실패")
            public void fail() {/* */ }

        }
    }
}

!https://github.com/ParkJiwoon/PrivateStudy/blob/master/images/nested-display-name-2.png?raw=true

DisplayName 을 쓰기로 결정한이유

  • 한글로 작성해도 언더바를 작성해야 해서 가독성이 좋지 않음
  • @Nested 와 함께 쓰려면 클래스를 작성해야 하는데 한글명으로 만드는 것보단 @DisplayName 을 쓰는게 깔끔함
  • 드문 일이지만 외국인과 협업해야하는데 테스트코드명이 전부 한글로 되어 있으면 당황하겠죠? (이러면 DisplayName 도 한글로 못적을 것 같지만..)
  • 가장 주목해야 할 점은 JUnit 개발자들은 영어가 모국어 수준일텐데도 @DisplayName 어노테이션을 추가했다는 점

테스트 결과에서 한글이 제대로 나오지 않는다면?

  1. Preferences > Build, Execution, Deployment > Build Tools > Gradle 로 이동
  2. Run tests using 을 IntelliJ IDEA 로 변경
  3. Apply and OK 후 적용 안되면 인텔리제이 재시작

!https://github.com/ParkJiwoon/PrivateStudy/blob/master/images/nested-display-name-3.png?raw=true

0개의 댓글