[JUnit5] 테스트에 timeout 걸기(assertTimeout, assertTimeoutPreemptively)

이번 포스팅에는 JUnit 테스트할 때 특정 시간동안 테스트가 끝나지 않으면 테스트를 실패시키는 메소드인 assertTimeout과 assertTimeoutPreemptively 메소드 두개를 알아보겠습니다.

 

assertTimeout(Duration timeout, Executable executable)

- timeout과 실행 인터페이스인 Executable 타입의 인자를 받는다. executable.execute() 메소드로 실행한 다음에 timeout과 실제 실행시간을 비교하여 테스트가 실패했는지 성공했는지 여부를 판단한다.

 

 

 

JUnit 소스 까보기

 

단점 : 만약에 테스트 자체가 굉장히 오래걸리는 부분을 test 해야한다면 제한시간이 있는데도 모든 테스트가 끝날때 까지 기다려야하는 단점이 존재한다. 개발시간과 돌아가야하는 시간은 정해져 있는데 이미 타임아웃이 끝났는데도 남아있는 시간을 기다려야할 이유는 없기 때문에 이러한 점에 대해서는 아쉬운 부분이라고 할 수 있다.

 

assertTimeoutPreemptively(Duration timeout, Executable executable)

- 위의 assertTimeout 메소드의 단점을 해결할 수 있는 메소드이다. 먼저 테스트를 실행하고 테스트가 timeout 땡치는 순간 테스트를 종료시키는 메소드이다. 내부가 살짝 assertTimeout 메소드보다 접해보지 못했던 패턴을 가지고 있지만 충분히 이해할 수 있을 코드였다.

 

 

테스트 실행
테스트 코드
@Test
    void test3() {
        assertAll(
                () -> {
                    assertTimeout(Duration.ofMillis(100), () -> {
                       Thread.sleep(400);
                    });
                },
                () -> {
                    assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
                        Thread.sleep(400);
                    });
                }
        );
    }

위 테스트에서 봐야할 부분은 두 테스트가 모두 끝나는지 총 테스트 시간이 얼마나 걸리는지 확인해야한다.

결과

테스트 결과 두 테스트 모두 에러가 발생했다. 첫번째 테스트는 301ms 때 총 테스트 시간은 559ms 정도로 400ms 정도 Thread를 정지시킨 결과 400 + 100 + a(리소스 해제 등) 정도로 해석하면 첫번째 테스트는 모든 테스트를 수행한 후 결과를 리턴하였고, 두번째 테스트는 테스트 수행중 timeout을 넘었다면 테스트를 끝내는 것으로 볼 수 있다. 

 

사실 더 정확한 테스트를 위해서는 각각 assertAll이 아닌 따로 테스트를 해보아야 할텐데 이것은 여러분의 선택에 맡겨보기로 하겠다.

댓글

Designed by JB FACTORY