7.3 JUnit의 동작 방식

김찬미·2024년 6월 18일
0

스프링 부트의 테스트 설정

스프링 부트는 테스트 환경을 쉽게 설정할 수 있게 spring-boot-starter-test 프로젝트를 지원한다. 이 프로젝트를 사용하려면 아래와 같이 pom.xml 파일에 관련 의존성을 추가해야 한다.

<dependencies>
    ... 생략 ...
    <dependency>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

예제에서 추가한 라이브러리는 아래와 같은 의존성을 가지고 있다.

스프링 부트에서 제공하는 spring-boot-starter-test 라이브러리는 JUnit, Mockito, assertJ 등의 다양한 테스트 도구를 제공한다. 또한 자동 설정을 지원하므로 편리하게 쓸 수 있다. spring-boot-starter-test 라이브러리에서 제공하는 대표적인 라이브러리는 다음과 같다.

spring-boot-starter-test의 라이브러리

  • JUnit 5 : 자바 애플리케이션의 단위 테스트를 지원한다.
  • Spring Test & Spring Boot Test : 스프링 부트 애플리케이션에 대한 유틸리티와 통합 테스트를 지원한다.
  • AssertJ : 다양한 단정문(assert)을 지원하는 라이브러리이다.
  • Hamcrest : Matcher를 지원하는 라이브러리이다.
  • Mockito : 자바 Mock 객체를 지원하는 프레임워크이다.
  • JSONassert : JSON용 단정문 라이브러리이다.
  • JsonPath : JSON용 XPath를 지원한다.

JUnit의 생명주기

JUnit의 동작 방식을 확인하기 위해 생명주기를 알아보자. 생명주기와 관련되어 테스트 순서에 관여하게 되는 대표적인 어노테이션은 다음과 같다.

테스트 순서와 관련된 어노테이션

  • @Test: 테스트 코드를 포함한 메서드를 정의
  • BeforeAll: 테스트를 시작하기 전에 호출되는 메서드를 정의
  • BeforeEach: 각 테스트 메서드가 실행되기 전에 동작하는 메서드를 정의
  • AfterAll: 테스트를 종료하면서 호출되는 메서드를 정의
  • AfterEach: 각 테스트 메서드가 종료되면서 호출되는 메서드를 정의

이러한 어노테이션의 동작을 알아보기 위해 예제와 같이 코드를 작성해보자.

테스트 생명주기 예제

TestLifeCycle 클래스

import org.junit.jupiter.api.*;

public class TestLifeCycle {

    @BeforeAll
    static void beforeAll() {
        System.out.println("## BeforeAll Annotation 호출 ##");
        System.out.println();
    }

    @AfterAll
    static void afterAll() {
        System.out.println("## AfterAll Annotation 호출 ##");
        System.out.println();
    }

    @BeforeEach
    void beforeEach() {
        System.out.println("## BeforeEach Annotation 호출 ##");
        System.out.println();
    }

    @AfterEach
    void afterEach() {
        System.out.println("## AfterEach Annotation 호출 ##");
        System.out.println();
    }

    @Test
    void test1() {
        System.out.println("## test1 시작 ##");
        System.out.println();
    }

    @Test
    void test2() {
        System.out.println("## test2 시작 ##");
        System.out.println();
    }

    @Test
    void test3() {
        System.out.println("## test3 시작 ##");
        System.out.println();
    }
    
}

콘솔 로그 출력

## BeforeAll Annotation 호출 ##

## BeforeEach Annotation 호출 ##

## test1 시작 ##

## AfterEach Annotation 호출 ##

## BeforeEach Annotation 호출 ##

## test2 시작 ##

## AfterEach Annotation 호출 ##

## AfterAll Annotation 호출 ##

위 클래스 예제를 실행하면 아래와 같이 콘솔 로그에 결과가 출력된다.

@BeforAll@AfterAll 어노테이션이 지정된 메서드는 전체 테스트 동작 에서 처음과 마지막에만 각각 수행된다. @BeforEach@AfterEach 어노테이션이 지정된 메서드는 각 테스트가 실행될 때 @Test 어노테이션이 지정된 테스트 메서드를 기준으로 실행되는 것을 볼 수 있다. 또한 test3() 에는 @Disabled 어노테이션을 지정했는데, 이 어노테이션이 지정된 테스트는 실행되지 않는 것을 볼 수 있다.

profile
백엔드 개발자

0개의 댓글

관련 채용 정보