TEST/JUnit

JUnit 테스트 코드의 설명과 예제

블로그 주인장 2023. 11. 7.

JUnit 테스트 코드 작성

자바 언어에서 사용되는 대표적인 테스트 프레임워크로서

단위 테스트를 위한 도구를 제공하는 'JUnit'에 대해 알아보겠습니다.

 


JUnit


  1. JUnit은 자바 언어에서 사용되는 대표적인 테스트 프레임워크이다.
  2. 가장 큰 특징은 어노테이션 기반의 테스트 방식을 지원한다는 것이다.
  3. 즉, JUnit을 사용하면 몇 개의 어노테이션만으로 간편하게 테스트 코드를 작성할 수 있다.
  4. JUnit을 활용하면 단정문(assert)을 통해 테스트 케이스의 기댓값이 정상적으로 도출되었는지 검토할 수 있다

 

JUnit의 세부 모듈

1️⃣ JUnit Platform

  • JVM에서 테스트를 시작하기 위한 뼈대 역할을 한다.
  • 테스트를 발견하고 테스트 계획을 생성하는 테스트 엔진(TestEngine)의 인터페이스를 가지고 있다.
  • 테스트 엔진은 테스트를 발견하고 테스트를 수행하고, 그 결과를 보고하는 역할을 한다.
  • 각종 IDE와의 연동을 보조하는 역할을 수행한다.
  • TestEngine API, Console Launcher, JUnit 4 Based Runner 등이 포함되어 있다.

2️⃣ JUnit Jupiter

  • 테스트 엔진의 API의 구현체를 포함하고 있다.
  • JUnit 5에서 제공하는 Jupiter 기반의 테스트를 실행하기 위한 테스트 엔진을 가지고 있다.
  • 테스트의 실제 구현체는 별도의 모듈의 역할을 수행하는데, 그 중 하나가 Jupiter Engine 이다.
  • Jupiter Engine은 Jupiter API를 활용해서 작성한 테스트 코드를 발견하고 실행하는 역할을 수행한다.

3️⃣ JUnit Vintage

  • JUnit 3, 4에 대한 테스트 엔진 API를 구현하고 있다.
  • 기존에 작성된 JUnit 3, 4 버전의 테스트 코드를 실행할 때 사용되며 Vintage Engine을 포함하고 있다.

JUnit 5 모듈 구조

 

스프링 부트 테스트 설정


스프링부트는 테스트 환경을 쉽게 설정할 수 있게 'spring-boot-starter-test'를 지원한다.

해당 프로젝트를 사용하려면 의존성을 추가해야한다.

 

Maven(pom.xml)

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

 

Gradle(build.gradle)

dependencies {
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

 

spring-boot-starter-test  제공 라이브러리

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

 

JUnit의 생명주기


테스트 순서에 관여하게 되는 대표적인 어노테이션

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

 

테스트 생명주기 예시

package com.springboot.test;

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
    @DisplayName("Test Case 2!!")
    void test2() {
        System.out.println("## test2 시작 ##");
        System.out.println();
    }

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

 

 

테스트 콘솔 로그

## BeforeAll Annotation 호출 ##

## BeforeEach Annotation 호출 ##

## test1 시작 ##

## AfterEach Annotation 호출 ##

## BeforeEach Annotation 호출 ##

## test2 시작 ##

## AfterEach Annotation 호출 ##


void com.springboot.test.TestLifeCycle.test3() is @Disabled

## AfterAll Annotation 호출 ##

 

테스트 예제로 확인

  1. @BeforeAll과 @AfterAll 어노테이션이 지정된 메서드는 전체 테스트 동작에서 처음과 마지막에만 각각 수행된다.
  2. @BeforeEach와 @AfterEach 어노테이션이 지정된 메서드는 각 테스트가 실행될 때 @Test 어노테이션이 지정된 테스트 메서드를 기준으로 실행되는 것을 볼 수 있다.
  3. test3() 에는 @Disabled 어노테이션을 지정했는데, 이 어노테이션이 지정된 테스트는 실행되지 않는다. 그렇기에 @BeforeEach와 @AfterEach 어노테이션이 실행되지 않는다.
  4. 테스트 메서드로는 인식되고 있기에, test3() 메서드가 비활성화되었다는 로그가 출력되었다.
반응형

댓글