JUnit5 소개

15153 단어 testtest

JUnit

  • JUnit: 자바 개발자가 가장 많이 사용하는 Testing 기반 프레임워크
  • JUnit5: JAVA8 이상부터 지원
  • 테스트 작성자를 위한 API, 테스트 실행을 위한 API가 분리되어 있음
  • 이전 버전인 JUnit4와 비교해서 JUnit5는 3가지 모듈로 구성되어 있음
    • JUnit Platform
      • JVM에서 테스트 프레임워크를 실행하는데 기초를 제공
      • TestEngine API를 제공해 테스트 프레임워크 개발 가능
    • JUnit Jupiter
      • TestEngine API 구현체 (JUnit5에서 제공)
      • JUnit5에서 테스트를 작성하고 확장하기 위한 새로운 프로그래밍 모델과 확장 모델의 조합
      • 테스트 코드 작성 모듈: junit-jupiter-api
      • 테스트 실행 모듈: junit-jupiter engine
    • JUnit Vintage
      • TestEngine API 구현체 (JUnit3, 4에서 제공)
      • 하위 호환성을 위해 JUnit3, JUnit4 기반으로 돌아가는 플랫폼에 테스트 엔진을 제공해줌

JUnit5 구조

위에서 소개한 3가지 모듈을 도식화하면 아래와 같은 형태로 표현된다.

JUnit5 Annotation

Annotations

JUnit5내용JUnit4
@Test테스트 Method임을 선언@Test
@ParameterizedTest매개변수를 받는 테스트
@RepeatedTest반복되는 테스트
@TestFactory@Test로 선언된 정적 테스트가 아닌 동적으로 테스트를 사용
@TestInstance테스트 클래스의 생명 주기를 설정
@TestTemplate공급자에 의해 여러번 호출될 수 있도록 설계된 테스트 케이스 템플릿임을 나타냄
@TestMethodOrder테스트 메소드 실행 순서를 구성
@DisplayName테스트 클래스 or 메소드의 사용자 정의 이름을 선언
@DisplayNameGeneration이름 생성기, 예를 들어 _를 공백 문자로 치환해주는 생성기 new_test -> new test
@BeforeEach각각의 테스트 실행 전 실행할 테스트, 목업 데이터 세팅 용도로 자주 사용@Before
@AfterEach각각의 테스트 실행 후 실행할 테스트@After
@BeforeAll현재 클래스를 실행하기 전 제일 먼저 실행할 테스트,static으로 선언@BeforeClass
@AfterAll현재 클래스 종료 후 실행할 테스트,static으로 선언@AfterClass
@Nested클래스를 정적이 아닌 중첩 테스트 클래스임을 나타냄
@Tag클래스 또는 메소드 레벨에서 태그 선언, 메이븐 사용 시 설정에서 테스트를 태그에 따라 포함하거나 제외 가능
@Disabled이 클래스나 테스트를 사용하지 않음@Ignore
@Timeout테스트 실행 시간을 선언 후 초과되면 실패하도록 설정
@ExtendWith확장을 선언적으로 등록
@RegisterExtension필드를 통해 프로그래밍 방식으로 확장을 등록
@TempDir필드 주입 또는 매개변수 주입을 통해 임시 디렉토리를 제공

Meta Annotation & Compose Annotation

JUnit Jupiter 어노테이션은 메타 어노테이션처럼 사용된다.
즉, 자동으로 메타 어노테이션을 상속하는 자신만의 컴포즈 어노테이션을 정의할 수 있다.
아래 예시를 통해 알아보자.

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
@Test
public @interface FastTest{}

위와 같이 @Tag()@Test어노테이션을 커스텀 컴포즈 어노테이션으로 만들어 아래처럼 사용할 수 있다.

@FastTest
void fastTest(){}

Test Class, Test Method

테스트 클래스
1. 최상위 클래스, static 멤버 클래스, @Nested 클래스에 적어도 한개의 @Test어노테이션이 붙은 테스트 메소드가 포함되어 있는 클래스
2. 테스트 클래스는 abstract이면 안됨
3. 하나의 생성자가 있어야 함, 만들지 않으면 컴파일러 자동 생성

테스트 메소드
@Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate 같은 메타 어노테이션이 붙은 메소드

라이프 사이클 메소드
@BeforeAll, @AfterAll, @BeforeEach, @AfterEach 같은 메타 어노테이션이 붙은 메소드

테스트 메소드와 라이프 사이클 메소드는 테스트할 클래스, 상속한 부모 클래스 또는 인터페이스에 선언된다.
테스트 메소드와 라이프 사이클 메소드는 abstract 선언이 없어야 하고 어떤 값도 리턴되서는 안된다.

Jupiter API : Assertions

org.junit.jupiter.api.Assertions : 값 검증을 위한 클래스, assert로 시작하는 static 메서드 제공

Method Name비고
assertEquals(expected, actual)int, long 등 기본 타입과 Object에 대한 assertEquals 메서드 존재
assertNotEquals(expected, actual)
assertTrue(boolean condition)
assertFalse(boolean condition)
assertNull(Object actual)
assertNotNull(Object actual)
assertAll()assert로 여러 개 검증할 때 사용
assertThrows(ArithmeticException.class() -> divide(100,0))실행한 코드에서 특정 exception이 발생하는지 확인
fail()

Junit5 Assumptions

  • JUnit5에 새로 추가된 기능
  • 특정 조건이 충족되는 경우에만 테스트
    • 특정 profile, OS 에서만 테스트를 실행하는 경우 활용 가능
    • assumeTrue(), assumeFalse(), assumingThat()
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assumptions.*;

public class AssumptionTest {

    @Test
    @DisplayName("MacOs에서 실행")
    void test_Mac() {
        assumeTrue(System.getProperty("os.name").startsWith("Mac"));
        assertEquals(3, 3);
    }

    @Test
    @DisplayName("Window에서 실행")
    void test_window() {
        assumeTrue(System.getProperty("os.name").startsWith("Window"));
        assertEquals(3, 3);
    }

    @Test
    @DisplayName("조건부에서 실행")
    void test_condition() {
        String osName = System.getProperty("os.name");
        assumingThat(
                osName.startsWith("Mac"),
                () -> assertNotEquals(1, 2)
        );
        assertEquals(3, 3);
    }
}


위 예제에서는 OS에 따라 조건별로 테스트를 실행시켜보았다.
OS 뿐만 아니라 원하는 조건을 넣어 위처럼 실행시킬 수 있다.

Reference

JUnit5 기본 사용법
JUnit5 소개

좋은 웹페이지 즐겨찾기