Spring Boot JUnit5 적용하기

harry
직방 기술 블로그

--

안녕하세요.

며칠 전 직방 패스 서비스에서 개발 의도대로 동작하지 않는 것이 발견되었고 확인해보니 테스트 코드가 작성되어있지 않았습니다. (점점 테스트코드의 중요성이 느껴지네요..)

누락된 테스트 코드를 작성하면서 JUnit 에 대해 정리를 하고 여러분들과 공유하면 좋을 것 같다는 생각이 들었습니다.

이번 시간에는 테스트코드 중 가장 많이 사용했고 기본이라고 생각되는 JUnit 어노테이션에 대해 정리하는 시간을 가져보겠습니다.

JUnit 이란?

java의 단위 테스트(Unit Test)를 수행할 수 있도록 지원해주는 프레임워크 입니다.

단위 테스트란?

  • 소스코드의 특정 모듈이 의도된 대로 작동 하는지 검증하는 절차
  • 모든 함수와 메소드에 대한 Test case 를 작성하는 절차

JUnit5 구성요소

JUnit5 는 크게 세가지의 모듈로 구성되어있습니다.

  • JUnit Flatform
    JVM에서 테스트 프레임워크를 실행하는데 기초를 제공합니다.
    테스트를 하기 위한 TestEngine API 제공합니다.
  • JUnit Jupiter
    JUnit 5에서 테스트를 작성하고 확장하기 위한 프로그래밍 모델과 확장 모델의 조합입니다.
  • JUnit Vintage
    이전 버전(JUnit3 & JUnit4) 기반의 테스트를 실행하기 위한 엔진을 제공 해줍니다.

JUnit5 시작하기

https://start.spring.io 에서 프로젝트 생성.

spring boot 2.2.x 이상 버전 이라면 기본적으로 JUnit5가 제공됩니다. (참고)

프로젝트 생성 후 build.gradle 파일을 확인해보면 아래와 같이 자동으로 생성되어있습니다.

JUnit5 기본 어노테이션

@Test
@Test가 선언 된 메소드는 테스트를 수행하는 메소드가 됩니다.

@DisplayName
클래스명 또는 메서드명 대신 노출 할 이름을 지정합니다.

테스트를 실행하면 지정한 DisplayName 이 표출됩니다.

@BeforeAll
@BeforeAll 붙인 메서드는 해당 테스트 클래스를 초기화 할 때 한번만 수행 됩니다.
static 메소드로 선언해야 합니다.

@BeforeEach
각각 테스트 메소드가 실행 되기 전에 수행 됩니다.

@AfterEach
각각 테스트 메소드가 실행 된 후에 수행 됩니다.

@AfterAll
@AfterAll 붙인 메서드는 해당 클래스의 모든 테스트가 실행 된 후 한번만 수행 됩니다.
static 메소드로 선언해야 합니다.

아래는 테스트 실행 결과 입니다.
@BeforeAll 메소드는 최초에 한 번 실행 되었으며, @BeforeEach 와 @AfterEach 는 각각의 @Test 메소드 시작과 끝에 실행되었습니다. 끝으로 @AfterAll 메소드가 수행되었습니다.

@Disabled
지정 된 클래스나 메소드는 실행되지 않습니다.

JUnit5 어노테이션을 이용한 실제 구현 코드

사용자가 신규예약을 요청한 시간에 다른 예약이 존재하는지 체크하는 테스트 코드입니다.

테스트 코드 시나리오

  • 10시~12시 예약이 존재
  • 9시~10시 예약은 가능.
  • 11~13시 예약은 불가능.

마치며

지금까지 가장 기본이라고 생각되는 JUnit 어노테이션을 정리해보았습니다.

다음 시간에는 기본 어노테이션 외에 다른 어노테이션과 테스트 메소드의 수행 결과를 판별 할 수 있는 Assert(단정문) 메소드에 대해 정리해보겠습니다.

감사합니다.

--

--