JUnit 테스트 코드 작성
자바 언어에서 사용되는 대표적인 테스트 프레임워크로서
단위 테스트를 위한 도구를 제공하는 'JUnit'에 대해 알아보겠습니다.
JUnit
- JUnit은 자바 언어에서 사용되는 대표적인 테스트 프레임워크이다.
- 가장 큰 특징은 어노테이션 기반의 테스트 방식을 지원한다는 것이다.
- 즉, JUnit을 사용하면 몇 개의 어노테이션만으로 간편하게 테스트 코드를 작성할 수 있다.
- 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을 포함하고 있다.
스프링 부트 테스트 설정
스프링부트는 테스트 환경을 쉽게 설정할 수 있게 '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의 생명주기
테스트 순서에 관여하게 되는 대표적인 어노테이션
- @Test : 테스트 코드를 포함한 메서드를 정의한다.
- @BeforeAll : 테스트를 시작하기 전에 호출되는 메서드를 정의한다.
- @BeforeEach : 각 테스트 메서드가 실행되기 전에 동작하는 메서드를 정의한다.
- @AfterAll : 테스트를 종료하면서 호출되는 메서드를 정의한다.
- @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 호출 ##
테스트 예제로 확인
- @BeforeAll과 @AfterAll 어노테이션이 지정된 메서드는 전체 테스트 동작에서 처음과 마지막에만 각각 수행된다.
- @BeforeEach와 @AfterEach 어노테이션이 지정된 메서드는 각 테스트가 실행될 때 @Test 어노테이션이 지정된 테스트 메서드를 기준으로 실행되는 것을 볼 수 있다.
- test3() 에는 @Disabled 어노테이션을 지정했는데, 이 어노테이션이 지정된 테스트는 실행되지 않는다. 그렇기에 @BeforeEach와 @AfterEach 어노테이션이 실행되지 않는다.
- 테스트 메서드로는 인식되고 있기에, test3() 메서드가 비활성화되었다는 로그가 출력되었다.
반응형
'TEST > JUnit' 카테고리의 다른 글
단위 테스트 방법 [part 3 : 리포지토리(Repository)] (0) | 2023.11.08 |
---|---|
단위 테스트 방법 [part 2 : 서비스(Service)] (0) | 2023.11.08 |
단위 테스트 방법 [part 1 : 컨트롤러(Controller)] (0) | 2023.11.08 |
댓글