JUnit5를 이용한 TDD 프로그래밍

tdd 관련 포스팅

  1. 테스트 주도 개발 by 켄트백 리뷰
  2. TDD, Refactoring, Clean Code 강의 리뷰
  3. 단위테스트 작성

TDD를 위한 Junit5 gradle 세팅은 위 문서에서 확인하면 된다.

이번 포스팅에서는 Junit5에서 유용하게 쓰이는 기능들에 대해 포스팅 하려 한다.

@DisplayName

@DisplayName 어노테이션은 각 테스트가 어떤 역할을 하는지 명시적으로 표현이 가능하다.

    @Test
    @DisplayName("MyTestClass")
    public class DisplayNameTest {
    }

@ParameterizedTest

@ParameterizedTest 어노테이션은 한 번에 여러가지의 테스트 케이스를 테스트 하기 위해 사용한다.

ValueSource

    @ParameterizedTest
    @ValueSource(strings = {
            "6 * 1",
            "2 * 3",
            "3 + 3"
    })
    void operateTest(String input) {
        assertThat(Calculator.calculate(input)).isEqualTo(6);
    }

CsvSource

    @ParameterizedTest
    @CsvSource(value = {
            "+:PLUS",
            "-:MINUS",
            "*:MULTIPLY",
            "/:DIVIDE"
    }, delimiter = ':')
    void getOperatorTest(String symbol, Operator operator) {
        assertThat(Operator.getOperator(symbol)).isEqualTo(operator);
    }

assertAll

assertAll는 모든 테스트 코드가 pass일 경우 pass한다.

    @Test
    void checkAll() {
        assertAll(
                () -> assertThat(1).isEqualTo(1),
                () -> assertThat(2).isEqualTo(2),
                () -> assertThat(3).isEqualTo(3),
                () -> assertThat(4).isEqualTo(4),
                () -> assertThat(5).isEqualTo(5)
        );
    }

allSatisfy

assertAll의 경우는 여러가지의 테스트 코드에 대한 확인이 필요한 것인데 Collection의 형태로 반환되는 method에 대한 테스트 코드 작성이 필요한 경우가 있다. 이럴 때는 forEach처럼 allSatisfy를 사용해 주면 좋다.

    @Test
    void getAllTest() {
        assertThat(Numbers.getAll())
                .allSatisfy(number -> assertThat(number.isUnsigned()).isFalse());
    }

assertThrows, assertThatThrownBy, assertThatExceptionOfType

테스트 중 특정한 Exception이 발생하는 지 확인할 때 사용할 수 있다.

    @Test
    void checkAll() {
        assertThrows(RuntimeException.class, () -> Program.run());
    }
    @Test
    void checkAll() {
        assertThatThrownBy(() -> Program.run())
                .isExactlyInstanceOf(RuntimeException.class);
    }

    @Test
    void checkAll() {
        assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> Program.run());
    }