JUnit5

Sixhustle·2021년 11월 30일
0

Spring

목록 보기
7/10

1. What is JUnit 5?

JUnit

JUnit은 자바 프로그래밍 언어용 유닛 테스트 프레임워크이다.

JUnit5


<사진 출처 : beomseok95.tistory.com/303>

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

Java 8부터 지원하며, 이전 버전으로 작성된 테스트 코드여도 컴파일이 정상적으로 지원된다.
Spring Boot 2.2.x 이후 버전에서는 JUnit5를 기본적으로 제공하고 있습니다.

JUnit Platform

테스트를 발견하고 테스트 계획을 생성하는 TestEngine 인터페이스를 가지고 있습니다.
Platform은 TestEngine을 통해서 테스트를 발경하고 ,실행하고 ,결과를 보고합니다.

JUnit Jupiter

TestEngine의 실제 구현체는 별도 모듈입니다.
모듈 중 하나가 jupiter-engine입니다. 이 모듈은 jupiter-api를 사용해서 작성한 테스트 코드를 발견하고 실행합니다.
Jupiter API는 JUnit 5에 새롭게 추가된 테스트 코드용 API로서, 개발자는 Jupiter API를 사용해서 테스트 코드를 작성할 수 있습니다

JUnit Vintage

기존에 JUnit 4 버전으로 작성한 테스트 코드를 실행할 때에는 vintage-engine 모듈을 사용합니다.


Gradle 설정

//   service.gradle
testCompile(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: "${springVersion}") {
  exclude(module: 'junit')
  exclude(module: 'junit-vintage-engine')
}

...

test {
   useJUnitPlatform()
}
  1. exclude(module: 'junit') : spring-boot-starter-test는 JUnit4에 대한 의존성이 있어 exclude(spring-boot 2.2.x 버전부터는 JUnit5 제공)
  2. exclude(module: 'junit-vintage-engine') : JUnit5만을 사용할 것이기 때문에, 하위 버전 호환성을 모듈 exclude
  3. gradle 4.6 부터 JUnit 테스트를 기본 지원. 활성화를 위해 useJUnitPlatform()을 선언

2. Annotations

JUnit4JUnit5
@BeforeClass@BeforeAll
@Before@BeforeEach
@After@AfterEach
@AfterClass@AfterAll
@Ignore@Disabled

@DisplayName

사용자 지정 표시 이름을 선언

@DisplayNameGeneration

테스트 이름 생성 방법을 설정

GeneratorDescription
Standard메소드 이름과 괄호를 그대로 표시(default)
Simple메소드에 파라미터가 없다면, 메소드 이름 뒤의 괄호 제거
ReplaceUnderScores_를 ""로 대체
IndicativeSentences클래스 이름과 메소드 이름을 이어서 표시

Sample Code(Java)

@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class Test {
   @Test
   @DisplayName("Name for test")
   public void test() {
   }
   
   @Test
   public void test_name() {
   }   
}

@ParameterizedTest

Test method에 parameter를 선언하여, 하나의 Test를 다른 parameter 값으로 여러 번 실행

@ValueSource

  1. 단일 배열을 source로 지정
  2. 하나의 parameter만 받는 테스트에 사용
  3. short, byte, int, long, float, double, char, boolean, String 등

@MethodSource

  1. 하나 이상의 팩토리 메서드 지정
  2. 팩토리 메서드는 static이어야 하고, static을 지우기 위해선 @TestInstance(Lifecycle.PER_CLASS) 선언 필요

Sample Code

@ParameterizedTest
@ValueSource(strings = {"hello", "world"}
public void test() {
}

@ParameterizedTest
@MethodSource("parametersForTest")
public void parametersForTest() {
}

private static Stream<Arguments> parametersForTest() {
   return Stream.of(
      Arguments.of("hello", "world"),
      Arguments.of("hello1", "world1")
   );
}

4. Reference

  1. JUnit Guide
  2. JUnit 5 알아보기
  3. JUnit 5 공식 가이드 문서 정리
  4. https://howtodoinjava.com/junit5/junit-5-test-lifecycle/

0개의 댓글