공부하는 스누피

[JUnit5] Spring Boot에서 JUnit5로 테스트하기 본문

Web/Spring

[JUnit5] Spring Boot에서 JUnit5로 테스트하기

커피맛스누피 2021. 10. 7. 14:05

JUnit5란?

JUnit은 자바 Unit Testing 프레임워크로, JUnit5는 이전 버전과는 다르게 3개의 서브 프로젝트로 구성되어 있습니다.

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

 

JUnit Platform

JVM에 테스트용 프레임워크를 실행시키는 기반 역할을 하며, JUnit4 베이스의 테스트 환경(Test Engine)을 제공한다.

JUnit Jupiter

 JUnit5에서 쓰이는 프로그래밍 모델과 확장 모델을 제공합니다. Jupiter 베이스의 테스트 환경(Test Engine)을 제공한다.

JUnit Vintage

JUnit3, JUnit4 베이스의 테스트를 지원한다.

 

환경 요구사항

Java 8 이상 (테스트 대상이 되는 코드는 자바 버전 상관 없음)

 

의존성 추가

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <scope>test</scope>
</dependency>

-> JUnit5를 사용하려면 Jupiter 의존성을 추가해야 함.

 

Assertion

테스트 조건에 맞게 Assertion을 발생 시킬 수 있는 라이브러리가 몇 개 있다.

- Hamcrest : 다양한 언어를 지원한다.
- AssertJ : assertion, 에러 메시지를 제공한다.
- Truth : Guava 팀에서 관리하는 라이브러리로, Google에서 쓰인다.

 

2021년 기준 Hamcrest가 가장 많이 쓰이고 있으나, AssertJ 점유율이 최근 들어 급성장하고 있다고 한다. Hamcrest와 AssertJ는 문법,클래스 구조 면에서 차이가 있다. Hamcrest는 assert를 위한 비교를 메서드 파라미터를 받아 수행하지만, AssertJ는 callback 형태를 사용한다.

Hamcrest: assertThat(a, equalTo(b))
AssertJ: assertThat(a).isEqualTo(b)

AssertJ는 하나의 static class를 import하면 모든 assert문을 쓸 수 있지만, Hamcrest는 각기 다른 class를 가지기 때문에 import 문이 증가한다. 모든 assert 기능이 한 곳에 있기 때문에 AssertJ가 좀 더 쉬운 자동완성 기능을 제공한다.

AssertJ는 Soft Assertion을 제공한다. Soft Assertion은 동시에 여러 개의 테스트를 할 때 assertion이 발생하더라도 테스트를 멈추지 않고 끝까지 수행한다.

 

자주 쓰이는 어노테이션

  • @Test : 테스트를 수행할 메서드 위에 붙인다.
  • @DisplayName : JUnit5에 추가된 어노테이션으로, 테스트 이름을 설정한다.
  • @Transactional : 테스트 완료 후 rollback이 필요할 때 사용한다.
  • @BeforeEach : 각 테스트가 실행되기 전마다 수행하는 메서드에 붙인다.
  • @BeforeAll : 테스트가 실행되기 전 한 번만 수행한다. Test Scope를 클래스로 정하지 않으면 반드시 static method에만 붙여야 한다.
  • @TestInstance : 테스트의 라이프사이클을 설정할 수 있다. 디폴트로 LifeCycle.PER_METHOD로 지정되며, 이 경우 메소드별 한 테스트 인스턴스가 생성된다. LifeCycle.PER_CLASS는 같은 클래스 안에 있는 메서드들이 인스턴스를 공유한다.

LifeCycle.PER_CLASS로 지정하면 @BeforeAll을 static이 아닌 인스턴스 메서드에 붙일 수 있다. 테스트들이 같은 인스턴스를 공유하기 때문이다.

  • @TestMethodOrder : 테스트 순서가 필요할 경우 사용한다. 순서 기준(메서드명 오름차순, @Order 값 기준 등)을 설정할 수 있다.
Comments