본문 바로가기

프로그래밍/Java

junit5 사용하기

JUnit5란?

JUnit은 자바에서 단위테스트를 제공하는 테스트 프레임워크로 테스트를 작성하고 실행할 수 있다.
junit5는 공식 문서에서는 3가지의 서브 프로젝트의 모듈로 구성되어있다고 한다.

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
  • Platform
    JVM에서 테스트 프레임워크를 시작하기 위한 기초 역활
  • Jupiter
    Junit5에서 테스트를 작성과 확장을 위한 새로운 프로그래밍 모델과 확장 모델의 조합
  • Vintage
    하위 버전(JUnit3, JUnit4)을 위한 테스트엔진제공

junit5은 런타임에는 Java 8이상 이 필요하나 이전 버전의 JDK로 컴파일된 코드는 테스트할 수 있다.

테스트 환경 확인

  • Ide: IntelliJ Idea Ultimate
  • oS: Mac OS Big Sur
  • Java8
  • Gradle 6.8

의존성 추가

사용을 위해서는 의존성을 추가해야 한다. Maven Repository에서 의존성을 검색하여 추가할 수 있다. 빌드 도구로는 Gradle을 사용할 것이다.
프로젝트를 아직 생성하지 않았다고 하면 Gradle을 사용하여 프로젝트를 생성할 수 있다.

gradle init

이때 테스팅 프레임워크를 선택할 수 있는데 JUnit Jupiter를 선택하면 의존성이 추가된 채로 프로젝트가 생성된다.

이미 프로젝트가 존재한다고 하면 build.gradle에 아래 내용들을 추가해야 한다.

  • JUnit5를 사용하기 위해 플랫폼 활성화
test {
    useJUnitPlatform()
}
  • JUnit Jupiter 의존성 추가
    Maven Repository에서 JUnit Jupiter APITestEngine을 가져와서 추가하자
dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}

동작확인

간단한 테스트를 작성하여 확인해 볼 수 있다.

class AppTest {
    @Test
    void sumTest() {
        assertEquals(100,Integer.sum(40,60));
    }
}

사진변경후 저장

어노테이션

Jupiter에서는 다양한 어노테이션으로 테스트를 구성하고 프레임워크 확장을 지원한다.
여기에서는 모든 어노테이션을 다루진 않고 자주 사용하였던 어노테이션들을 정리하였다.

Annotation 설명
@Test 테스트 메소드임을 나타냄
junit4와 다르게 옵션과 인자가 없음
@ParameterizedTest 하나의 메소드로 여러가지 파라미터에 대해 테스트
@RepeatedTest 파라미터만큼 테스트를 반복
@TestMethodOrder 테스트 메서드의 실행순서를 구성할때 사용
JUnit4의 @FixMethodOrder
@TestInstance 테스트 인스턴스 생명주기를 구성하는데 사용
@DisplayName 테스트 클래스나 메소드의 이름을 선언
@BeforeEach 현재 클래스에서 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 적힌 각각의 메소드가 실행되기 전에 실행
JUnit4의 @Before
@AfterEach 현재 클래스에서 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 적힌 각각의 메소드가 실행된 후에 실행
JUnit4의 @After
@BeforeAll 현재 클래스에서 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 적힌 모든 메소드가 실행되기 전에 실행
JUnit4의 @BeforeClass
@AfterAll 현재 클래스에서 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 적힌 각각의 메소드가 실행된 후에 실행
JUnit4의 @AfterClass
@Nested 중첩된 테스트 클래스임을 알림
@Tag 테스트 필터링을 위한 태그를 선언
@Disabled 테스트 클래스나 메서드를 비활성화
JUnit4의 @Ignore
@Timeout 주어진 시간을 초과하면 테스트 실패

@BeforeAll과 @BeforeEach는 글로만 보면 헷갈릴 수 있는데 아래의 코드와 실행결과를 보면 느낌이 올 것이다.
@BeforeAll이 붙은 메소드는 static 메소드 여야 한다(클래스의 생명주기를 클래스로 변경해도 된다)

import org.junit.jupiter.api.*;

//@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class BeforeAfterTest {
    @BeforeAll
    static void beforeAll() {
        System.out.println("before all");
    }

    @AfterAll
    static void afterAll() {
        System.out.println("after all");
    }

    @BeforeEach
    void beforeEach() {
        System.out.println("before each");
    }

    @AfterEach
    void afterEach() {
        System.out.println("after each");
    }

    @Test
    void test1() {
        System.out.println("Test 1");
    }

    @Test
    void test2() {
        System.out.println("Test 2");
    }

    @Test
    void test3() {
        System.out.println("Test 3");
    }
}

실행결과

before all
before each
Test 1
after each
before each
Test 2
after each
before each
Test 3
after each
after all

@BeforeEach, @AfterEach: 각 테스트가 시작되기 전후에 매번 실행
@BeforeAll, @AfterAll: 클래스에 존재하는 모든 테스트가 실행되기 전과 후에 실행

참고 문서

Junit 5 User Guide

'프로그래밍 > Java' 카테고리의 다른 글

junit5 @Nested 계층구조로 테스트코드 작성하기  (0) 2021.02.07
어노테이션  (0) 2021.02.05
Enum 클래스  (0) 2021.01.26
멀티쓰레드 프로그래밍  (0) 2021.01.25
예외처리  (0) 2021.01.13