korean IT student

JUnit 5 란? 본문

back-end/SPRING

JUnit 5 란?

현창이 2021. 8. 20. 16:00

junit 5 공식 문서를 참고하여 정리하였습니다.

 

What is JUnit 5?

  • 문서에서 JUnit 5는 세 가지 다른 하위 프로젝트의 여러 모듈로 구성됩니다.
    JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
  • JUnit  Platform : 테스트를 발견하고 테스트 계획을 생성하는 TestEngine API를가지고 있습니다. Platform은 TestEngine을 통해서 테스트를 발견하고 ,실행하고 ,결과를 보고합니다.
  • JUnit Jupiter : TestEngine의 실제 구현체는 별도 모듈입니다. 모듈 중 하나가 jupiter-engine입니다. 이 모듈은 jupiter-api를 사용해서 작성한 테스트 코드를 발견하고 실행합니다. Jupiter API는 JUnit 5에 새롭게 추가된 테스트 코드용 API로서, 개발자는 Jupiter API를 사용해서 테스트 코드를 작성할 수 있습니다
  • JUnit Vintage : 기존에 JUnit 4 버전으로 작성한 테스트 코드를 실행할 때에는 vintage-engine 모듈을 사용합니다.

JUnit 5를 실행하기 위해서는 자바 8 이상이 필요합니다.

Annotations

 - JUnit Jupiter는 테스트와 확장된 기능을 제공하기 위해 여러가지 어노테이션들을 제공한다

@Test 테스트 메소드임을 알림
Junit 4와는 다르게 속성을 정의 X
이는 Jupiter에선 이미 해당 어노테이션들이 존재하기 때문
@ParameterizedTest 여러가지 매개변수를 통해 다양한 테스트 진행
@RepeatedTest 반복 횟수만큼 테스트를 진행
@TestFactory 동적 테스트를 위한 테스트 팩토리
@TestTemplate 일반 테스트가 아닌 테스트 케이스의 템플릿
@TestMethodOrder 테스트 메서드의 실행 순서를 구성하는데 사용(Junit 4의 @FixMethodOrder와 유사)
@TestInstance 테스트 인스턴스 생명주기를 구성하는데 사용
@DisplayName 테스트 클래스 혹은 메소드에 대한 이름을 선언
@DisplayNameGeneration 테스트 클래스에 대한 Display name generator를 선언
@BeforeEach 현재 클래스에서 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 적힌 각각의 메소드들 보다 먼저 실행
(JUnit 4의 @Before와 동일)
@AfterEach 현재 클래스에서 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 적힌 각각의 메소드들 보다 나중에 실행
(JUnit 4의 @After와 동일)
@BeforeAll 현재 클래스에서 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 적힌 모든 메소드들 보다 먼저 실행
(JUnit 4의 @BeforeClass와 동일)
@AfterAll 현재 클래스에서 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 적힌 모든 메소드들 보다 나중에 실행
(JUnit 4의 @AfterClass와 동일)
@Nested 중첩된 테스트 클래스임을 알림
각 클래스의 테스트 인스턴스 생명주기를 사용하지 않는 한 @BeforeAll과 @AfterAll 메소드는 사용 X
@Tag 테스트 필더링을 위한 테그를 선언하는데 사용
@Disabled 테스트 클래스 혹은 메소드를 비활성하는데 사용(JUnit 4의 @Ignore와 유사)
@Timeout 주어진 시간을 초과할 경우, 테스트 실패를 나타내기 위해 사용
@ExtendWith 확장을 선언적으로 등록하는데 사용
@RegisterExtension 필드를 통해 프로그래밍 방식으로 확장을 등록하는데 사용
@TempDir 필드 주입 또는 매개변수 주입을 통해 임시 디렉토리를 제공하는데 사용

 

Assertions

- JUnit Jupiter comes with many of the assertion methods that JUnit 4 has and adds a few that lend themselves well to being used with Java 8 lambdas. All JUnit Jupiter assertions are static methods

- Assertions는 만약 성공하지 않으면 테스트를 실패처리를 하기 위해서 사용합니다.

@Test
void testAssertions() {

  // 기본
  assertEquals(2, calculator.add(1,1));
  assertEquals(5, calculator.mul(2,5), "실패 메시지(optional)");
  
  // 그룹
  // assertion Group은 JUnit5에 추가된 기능으로 동시에 Assertion 구문을 실행시킬 수 있는 그룹을 만드는 것
  assertAll(() -> assertEquals(3, calculator.sub(5,2)),
            () -> assertEquals(1, claculator.div(5,5)));
  
  // 의존
  // 코드 블럭안에서 만약 assertion 구문이 실패하면 아래 순차에 있는 코드는 실행되어지지 않습니다.
  assertAll(() -> {
             assertAll(() -> assertTrue(),
                       () -> assertTrue());
           },
           // 앞의 functional 코드에 상관없이 실행됩니다. 즉, 독립적으로 실행됩니다.
           () -> {
             assertAll(() -> assertEquals(),
                       () -> assertEquals());
           });
  
  // 예외
  // exception이 발생할 수 있는 부분을 람다식을 이용하여 감쌈으로써 exception이 발생하는 지점을 특정하여 테스트가 가능
  Exception e = assertThrows(ArithmeticException.class, () -> calculator.div(1, 0));
  assertEquals("/ by zero", e.getMessage());
  
  // 제한시간
  assertTimeout(ofMinutes(2), () -> {
    // 2분 미만의 로직만 통과
  });
  
}

Assumptions

- 특정 상황에서만 test문을 실행하고자 할때, 반대로 특정 상황에서만 실행하지 않고자할 때 사용하는 키워드

 

@Test
void testOnlyOnDev() {
  assumeTrue("DEV".equals(System.getenv("ENV")));
  
  DEV 환경에서만 테스트할 코드;
}

@Test
void testAllEnv() {
  assumeTrue("DEV".equals(System.getenv("ENV")),
             () -> {
               DEV 환경에서 테스트할 코드;
             });

  모든 환경에서 테스트할 코드;
}

 

 

 

[참고]

- https://junit.org/junit5/docs/current/user-guide/#overview

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus

junit.org

- https://sabarada.tistory.com/80

Comments