테스트 케이스란?

내가 작성한 코드가 예상한대로 잘동작하는지 예상되는 값을 부여하여 어플리케이션 빌드시 동작을 검증하는 기능


테스트 케이스 꼭 작성해야하는 이유

어플리케이션을 개발하다보면 시간이 흐를수록 처음 작성했던 코드와는 다르게
기능추가, 의존성 추가, 라이브러리 변경 등 많은 변경이 일어나게됩니다.
하지만 그때마다 기존 기능들을 다시 테스트하고 검증하는 일은 많은 시간과 혹시모를 실수가 발생하게됩니다.


Junit5

Java에서 흔히 사용하는 테스트 라이브러리 이며, Spring Framework에서도 기본으로 탑재되어있습니다.
현재 Junit5가 최신이며 이번 포스트에서는 Junit5의 간단한 사용법을 알아보도록 하겠습니다.


테스트에 앞서 작성한 간단한 Service, Dto등은 Github을 참고바랍니다.

Sample source


Junit5 라이브러리 추가하기

우선 프로젝트에 라이브러리를 추가합니다.(Gradle을 사용하였습니다.)

testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0'

테스트 케이스 작성하기

테스트 수행전 객체 생성 및 데이터 생성

테스트 수행전 필요한 객체 초기화 및 데이터 초기화등을 @BeforeAll, @BeforeEach등을 사용하면됩니다.

//각 테스트 수행전에 한번만 수행.(<-> @AfterAll)
@BeforeAll
static void init() {
    System.out.println("테스트 시작전 한번만 실행");
}

//각 테스트 수행전에 매번 수행.(<-> @AfterEach)
@BeforeEach
void setUp() {
    System.out.println("setUp");

    itemDto = new ItemDto();
    itemDto.setId(1L);
    itemDto.setName("테스트 상품");
    itemDto.setPrice(5000);

    orderDto = new OrderDto();
    orderService = new OrderService();
}

예상한 값이 맞는지 확인

@Test : 테스트를 진행할 메소드임을 표시(@Disable로 테스트를 무시할수 있습니다.)
@DisplayName(“주문생성 테스트”) : 테스트 수행결과의 제목

기본적인 assertEquals, assertTrue, assertNotNull등을 사용할수 있고
assertAll을 사용하면 보다 세밀하게 테스트 케이스를 설정할수있습니다.
assertAll(String heading, Executable… executables)

@Test
@DisplayName("주문생성 테스트")
void orderCreate() {
    Long userId = 1000L;
    Integer amount = 2;
    OrderDto orderDto = orderService.orderCreate(userId, itemDto, amount);

    assertAll("check order",
            () -> assertEquals(userId, orderDto.getUserId()),
            () -> assertEquals(amount, orderDto.getAmount()),
            () -> {
                assertAll("check status and date",
                        () -> assertEquals(OrderStatus.REQUEST, orderDto.getStatus()),
                        () -> assertNotNull(orderDto.getOrderDate())
                );
            });
}

예상한 Exception을 throw하는지 확인

해당 메소드가 특정상황에서 Exception을 의도한대로 발생하는지 확인하고
Exception 메세지가 정의한대로 발생하는지 체크하는 방법입니다.

@Test
@DisplayName("╯°□°)╯ 완료된 주문을 수량을 변경했을때 throw 체크 테스트")
void orderUpdateAmount() {
    orderDto.setStatus(OrderStatus.COMPLETE);
    Exception exception = assertThrows(OrderException.class, () -> orderService.orderUpdateAmount(orderDto, 3));

    String expectedMessage = String.format("%s,\norderDto = { %s }", "주문정보 갱신에 실패하였습니다.\n주문상태가 \"주문 요청\"이 아닙니다.", orderDto.toString());
    assertEquals(expectedMessage, exception.getMessage());
}

추가적인 정보는 공식 document를 참고하시면
더욱 많은 정보를 얻을수 있습니다.
Junit5 Document User guide