테스트 코드에 필요한 라이브러리와 어노테이션

아현·2023년 10월 11일
1

spring test code

목록 보기
2/4
post-thumbnail

이전 포스팅에서는 내가 프로젝트를 하면서 느낀 테스트 코드의 필요성에 대해 나열하면서 테스트 코드 작성에 대한 동기부여를 해보았다.

코드를 보기 앞서 사용할 라이브러리와 어노테이션에 대해 정리해보자.

테스트 코드에 사용할 라이브러리

Junit5

단위 테스트를 위한 테스트 프레임워크이다.

개발자 kent beck가 만든 xUnit중 하나이다.(c언어이면 cUnit, python언어이면 PyUnit 등 여러 언어에 적용됨.)

공식문서를 보면 java 8 이상에 중점을 두고 지원한다고 적혀있기 때문에 java 8 이상부터 사용하자.

Junit5 공식문서

스프링 부트를 통해서 프로젝트를 만들었다면 따로 의존성 주입을 하지 않아도 되지만 만약 단독으로 Junit5를 사용하고 싶으면 추가해줘야 한다.

Gradle 사용시

testImplementation platform('org.junit:junit-bom:5.9.1')
testImplementation 'org.junit.jupiter:junit-jupiter'

Maven 사용시

<dependencies>
    <!-- JUnit 5 BOM -->
    <dependency>
        <groupId>org.junit</groupId>
        <artifactId>junit-bom</artifactId>
        <version>5.9.1</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>

    <!-- JUnit 5 Jupiter Engine -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.9.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

AssertJ

테스트 코드 작성을 원할하게 돕는 테스트 라이브러리이며 Junit과 함께 많이 사용되며 Junit보다 많은 API를 제공한다.

보통 테스트에서 예상 결과와 실제 결과를 비교할 때 사용되며 메서드 체이닝을 지원해서 테스트 코드 가독성을 높이는 장점이 있다.

AssertJ 공식문서

Junit5와 마찬가지로스프링 부트를 통해서 프로젝트를 만들었다면 따로 의존성 주입을 하지 않아도 되지만 만약 단독으로 AssertJ를 사용하고 싶으면 추가해줘야 한다.

Gradle 사용시

testImplementation("org.assertj:assertj-core:3.22.0")

Maven 사용시

    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>

사용할 어노테이션

Junit5 라이브러리에는 여기서 정리한 것 외에도 어노테이션이 있지만 지금 포스팅은 기초적인 테스트 코드 작성방법이기때문에 사용할 어노테이션만 정리하겠다.

Junit 5 어노테이션

@Test: 메소드가 테스트 메소드임을 나타냅니다.

@DisplayName: 테스트 클래스 또는 테스트 메서드에 대한 사용자 정의 표시 이름을 선언합니다

@BeforeEach: 현재 클래스의  , , 또는 메서드 이전에 주석이 달린 메서드가 실행되어야 함을 나타냅니다.
@Test 어노테이션이 달린 메서드가 실행되기전 실행합니다.

@AfterEach: 현재 클래스의  , , 또는 메서드 다음에 주석이 달린 메서드가 실행되어야 함을 나타냅니다 .
@Test 어노테이션이 달린 메서드가 실행된 후 실행합니다.

@BeforeAll: 주석이 달린 메서드가 현재 클래스의 모든 , , 및 메서드 보다 먼저 실행되어야 함을 나타냅니다.
모든 테스트 메서드가 실행되기 전 딱 한번 실행됩니다.

@AfterAll: 현재 클래스의 모든 , , 및 메소드 이후에 주석이 달린 메소드가 실행되어야 함을 나타냅니다 .
모든 테스트 메서드가 실행된 후 딱 한번 실행합니다.

@Disabled: 테스트 클래스나 테스트 메서드를 비활성화하는 데 사용됩니다 .(실행 안함)

@Timeout: 실행이 지정된 기간을 초과하는 경우 테스트, 테스트 팩토리, 테스트 템플릿 또는 수명 주기 메서드를 실패시키는 데 사용됩니다. 기본 단위는 초단위이지만 개발자가 설정할 수 있다.

@BeforeAll, @AfterAll 어노테이션은 메서드에 static이 있어야 한다!

어렵지 않는 내용으로 코드로 직접 실행해보자.

다른 로직없이 System.*out*.println()로 실행결과만 보여주는 테스트 코드와 결과화면이다.

class Test {
    @BeforeEach
    void 비포이치() {
        System.out.println("BeforeEach 실행");
    }

    @BeforeAll
    static void 비포올() {
        System.out.println("BeforeAll 실행");
    }

    @AfterEach
    void 애프터이치() {
        System.out.println("AfterEach 실행");
    }
    @AfterAll
    static void 애프터올() {
        System.out.println("AfterAll 실행");
    }

    @DisplayName("JUnit 5 어노테이션 연습을 위한 테스트1이다.")
    @org.junit.jupiter.api.Test
    void 테스트1() {
        System.out.println("test1 실행");
    }

    @DisplayName("JUnit 5 어노테이션 연습을 위한 테스트2이다.")
    @org.junit.jupiter.api.Test
    void 테스트2() {
        System.out.println("test2 실행");
    }

    @Disabled
    @DisplayName("테스트3은 실행될 수 없다.")
    @org.junit.jupiter.api.Test
    void 테스트3() {
        System.out.println("test3 실행");
    }

//    @DisplayName("DispalyName을 사용하지 않으면 메서드이름이 표시이름이 됩니다.")
		@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
    @org.junit.jupiter.api.Test
    void 테스트4() {
        System.out.println("Timeout 어노테이션 실행");
    }
}

테스트 결과

왼쪽부분은 표시이름, 오른쪽은 테스트 결과 화면이 나온다.

설명한데로 @BeforeAll, @AfterAll 어노테이션이 붙은 static 메서드는 모든 테스트코드에 실행되기전과 실행된 후 한번씩 실행되었고, @BeforeEach, @AfterEach 어노테이션은 각각 @Test 어노테이션이 붙어있는 메서드가 실행되기 전,후에 실행되었다.

Test3은 @Disabled 어노테이션이 있어 아에 실행되지 않았고, @BeforeEach, @AfterEach 어노테이션도 실행되지 않았다.

@Timeout의 기본 단위는 초이지만, unit으로 단위를 선택할 수 있다.

@DisplayName을 작성한 테스트는 왼쪽 표시이름에 개발자가 작성한 문장이 나오고 @DisplayName이 없는 테스트는 테스트 메서드 이름이 표시이름이 된다.

메서드 이름도 중요하지만 어떤 테스트인지 @DisplayName에 문장으로 작성하여 다른 사람이 봐도 잘 이해되게 하자!

Junit 4와 Junit 5의 어노테이션 차이

구름 부트캠프에서 인프런에서 영한님의 강의를 봤다면 Junit 4 어노테이션이 더 친숙할 것이기 때문에 헷갈릴 것이다. 밑에 푤를 보면 별 차이가 없어 헷갈리지 않을 것이다. Junit 4에서 없었던 어노테이션이 Junit 5가 되면서 추가된 어노테이션과 이해하기 편하게 기능은 같지만 단어가 달라진 점만 있다.

밑의 표는 4와 5 어노테이션 중 변경되거나 추가된 어노테이션만 추가한 것이다.

Junit 4Junit 5설명
없음@DisplayName5에서 추가
@Before@BeforeEach단어 변경(기능 같음)
@After@AfterEach단어 변경(기능 같음)
@BeforeClass@BeforeAll단어 변경(기능 같음)
@AfterClass@AfterAll단어 변경(기능 같음)
@Ignore@Disabled단어 변경(기능 같음)

더 변경된 어노테이션이 있지만 내 기억에 의존해 영한님 강의에서 사용된 어노테이션과 위에서 언급한 어노테이션만 정리했다. 이정도면 기초적인 테스트 코드를 작성할 때 어노테이션은 헷갈리지 않을 것이다.

이 포스트는 Practical Testing: 실용적인 테스트 가이드 강의를 참고하여 작성했습니다.

profile
개발 정말 잘하고 싶다

0개의 댓글