JUnit5 - Assertion

현시기얌·2021년 8월 22일
0

JUnit5

목록 보기
2/8

Assertion

실제 값이 기대한 값과 같은지 확인assertEquals(expected, actual)
값이 null이 아닌지 확인assertNotNull(actual)
다음 조건이 참(true)인지 확인assertTrue(boolean)
모든 구문 확인assertAll(executables..)
예외 발생 확인assertThrows(expectedType, executable
특정 시간 안에 실행이 완료되는지 확인assertTimeOut(duration, executable

assertEquals(기대값, 실제값, 메시지(Supplier)

    @Test
    @DisplayName("테스트 제목 만들기 \uD83D\uDE31")
    void create1_this_underscore_maybe_delete() {
        //given
        final Study study = new Study();
        //then
        assertNotNull(study);
  	assertEquals(StudyStatus.DRAFT, study.getStatus(),
                () -> "스터디를 처음 만들면 " +  StudyStatus.DRAFT + " 상태여야 한다.");
   	assertEquals(StudyStatus.DRAFT, study.getStatus(),
                "스터디를 처음 만들면 " +  StudyStatus.DRAFT + " 상태여야 한다.");

메세지값을 람다를 사용했을 때와 안했을 때의 차이

람다를 사용하지 않았을 때는 테스트코드가 성공하던 말던 메시지 연산을 실행하는데
람다를 사용하면 테스트코드가 실패했을 때만 메시지를 연산하기 때문에 성능면에서 우수하다.

assertAll(excutables..)

  @Test
    @DisplayName("테스트 제목 만들기 \uD83D\uDE31")
    void create1_this_underscore_maybe_delete() {
        //given
        final Study study = new Study(StudyStatus.ENDED, -10);
        //then
        assertNotNull(study);
        //기대값, 실제값, 메세지(Supplier)
        assertEquals(StudyStatus.DRAFT, study.getStatus(),
                () -> "스터디를 처음 만들면 " +  StudyStatus.DRAFT + " 상태여야 한다.");
        assertTrue(study.getLimit() > 0, () -> "스터디 최대 참석 가능 인원은 0보다 커야 한다.");
    }

위의 코드와 같이 테스트를 실행하는데 assertTrue() 테스트는 assertEquals() 테스트가 성공일 때만 체크 가능하다.
따라서 assertEquals() 테스트가 실패했을 경우에는 assertTrue()가 테스트 되지 않고 실행이 종료되는데

      assertAll(
                () ->   assertNotNull(study),
                () ->   assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 " +  StudyStatus.DRAFT + " 상태여야 한다."),
                () ->   assertTrue(study.getLimit() > 0, () -> "스터디 최대 참석 가능 인원은 0보다 커야 한다.")
        );

이 때 테스트할 코드들을 excutable 타입으로 만들어 assertAll() 메소드 안에 넣어주면 assertAll() 안에 있는
테스트코드들을 한번에 체크해준다.

실행결과

AssertThrows(expectedType, executable)

Study 클래스

public class Study {

    private StudyStatus status;
    private int limit;

    public Study(StudyStatus status, int limit) {
        this.status = status;
        if (limit < 0) {
            throw new IllegalArgumentException("limit은 0보다 커야한다.");
        }
        this.limit = limit;
    }

    public StudyStatus getStatus() {
        return status;
    }

    public int getLimit() {
        return limit;
    }
}

테스트 코드

    @Test
    void assertThrowsTest() {
        final IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
                () -> new Study(StudyStatus.DRAFT, -10));

        assertEquals("limit은 0보다 커야한다.", exception.getMessage());

    }

assertThrows() 메소드를 이용하여 해당 조건을 실행했을 경우 발생할 수 있는 예외를 테스트 할 수 있고
예외가 발생했을 때의 메세지 또한 테스트 할 수 있다.

assertTimeout(duration, executable)

   @Test
    void timeOutTest() {
        assertTimeout(Duration.ofSeconds(10), () -> new Study(StudyStatus.DRAFT, 10));
    }

Duration 클래스를 이용하여 해당 조건 실행 시 시간이 얼마나 걸렸는지 테스트할 수 있다.

    @Test
    void timeOutTest2() {
        assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
            new Study(StudyStatus.DRAFT, 10);
            Thread.sleep(300);
        });
    }

assertTimeout() 메소드는 기대 시간이 1초고 해당 조건 실행 시간이 3초였다고 가정한다면 해당 조건이 모두 끝난 후에 테스트가 종료된다. 즉 1초만 테스트하고 종료하고 싶었는데 3초까지 기달려야 한다는 단점이 있다.
이때 위의 코드처럼 assertTimeoutPreemptively() 메소드를 사용하면 기대 시간이 끝나면 바로 테스트가 종료 될 수 있도록 한다.
하지만 ThreadLocal을 사용했을 때는 예상치 못한 결과가 나올 수 있으니 조심해서 써야 한다.

profile
현시깁니다

0개의 댓글