JUnit5 기초

Kichang Kwon·2022년 3월 29일
0

TDD

목록 보기
1/1

JUnit5 모듈 구성

JUnit5 는 세 개의 서브 프로젝트로 구성되어 있다.

JUnit Platform

JUnit Platform은 JVM에서 테스트 프레임워크를 구동하기 위한 런처와 테스트 엔진을 위한 API를 제공한다.

JUnit Jupiter

JUnit Jupiter는 테스트를 작성하고 확장하기 위한 새로운 프로그래밍 모델과 확장 모델의 조합이다.

JUnit Vintage

JUnit Vintage는 JUnit3 및 JUnit4 기반 테스트를 실행하기 위한 엔진을 제공한다.

Test Annotation and Test Method

JUnit 코드의 기본 구조는 간단하다. 테스트로 사용할 클래스를 만들고 메서드에 @Test 어노테이션을 붙이면 된다. 이때 private를 붙이지 않도록 한다.

import static org.junit.jupiter.api.Assertions.assertEquals;
import example.util.Calculator;
import org.junit.jupiter.api.Test;

class MyFirstJUnitJupiterTests {

    private final Calculator calculator = new Calculator();

    @Test
    void addition() {
        assertEquals(2, calculator.add(1, 1));
    }
}

Assertions 클래스가 제공하는 주요 단언 메서드

MethodDescription
assertEquals(expected, actual)실제 값이 기대하는 값(첫 번째 인자)과 같은지 검사
assertNotEquals(unexpected, actual)실제 값이 특정 값과 같이 않은지 검사
assertSame(Object expected, Obejct actual)두 객체가 동일한 객체인지 검사 (expected.equals(actual))
assertNotSame(Object expected, Obejct actual)두 객체가 동일하지 않은 객체인지 검사
assertTrue(boolean condition)값이 true인지 검사
assertFalse(boolean condition)값이 false인지 검사
assertNull(Object actual)값이 null인지 검사
assertNotNull(Obejct actual)값이 null이 아닌지 검사
fail()테스트를 실패 처리

Assertions 클래스가 제공하는 예외 발생 검사 메서드

MethodDescription
assertThrows(Class<T> expectedType, Executable executable)executable을 실행한 결과로 지정한 타입의 예외가 발생하는지 검사
assertDoesNotThrow(Executable executable)executable을 실행한 결과로 예외가 발생하지 않는지 검사
예시
@Test
void exceptionTesting() {
    Exception exception = assertThrows(ArithmeticException.class, () ->
        calculator.divide(1, 0));
    assertEquals("/ by zero", exception.getMessage());
}
assert 메서드의 연속 실행

assert 메서드는 실패하면 다음 코드를 실행하지 않고 바로 예외를 발생한다. 모든 검증을 실행하고 그중에 실패한 것이 있는지 확인하고 싶은 경우 assertAll() 메서드를 사용한다. 실패한 코드가 있으면 그 목록을 모아서 에러 메시지로 보여준다.

@Test
void groupedAssertions() {
    assertAll("person",
        () -> assertEquals("Jane", person.getFirstName()),
        () -> assertEquals("Doe", person.getLastName())
    );
}

Test Lifecycle

JUnit은 각 테스트 메서드를 실행하기 전에 각 테스트 클래스의 새 인스턴스를 만듭니다. 이는 개별 테스트 메서드를 격리하여 실행할 수 있도록 하고, 변경 가능한 테스트 인스턴스 상태로 인한 예기치 않은 부작용을 피하기 위해서이다. 이 생명 주기는 JUnit Jupiter의 기본 동작이며 이전 버전의 JUnit과 유사하다.
(@Disabled, @DisabledOnOs 등의 비활성화 어노테이션을 붙여도 동일하게 새로운 인스턴스를 생성한다.)

LifeCycle Method

@BeforeEach : 현재 클래스의 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 붙어있는 테스트 메소드가 실행되기 전 실행한다. JUnit4의 @Before 어노테이션과 같은 역할을 한다.

@AfterEach : 현재 클래스의 @Test, @RepeatedTest, @ParameterizedTest, @TestFactory가 붙어있는 테스트 메소드가 실행되고 난 후 실행한다. JUnit4의 @After 어노테이션과 같은 역할을 한다.

@BeforeAll : 클래스의 모든 테스트 메서드를 실행하기 전에 한 번만 실행된다.

@AfterAll : 클래스의 모든 테스트 메서드를 실행한 후에 한 번만 실행된다.

주의점

테스트 메서드가 서로 실행 순서 의존에 의존하지 않고 같은 필드를 공유해서 사용하지 않도록 작성한다. 각 테스트 메서드는 서로 독립적으로 동작해야 한다. JUnit은 테스트 메서드의 실행 순서를 지정하는 방법을 제공하고 있지만 메서드 간에 의존이 생기면 유지보수가 어렵게 된다.

JUnit5 User Guide
JUnit5 사용가 가이드 번역(민동현-Dream Comtrue)

profile
한 줄 소개

0개의 댓글