안녕하세요. 이번 포스팅은 JUnit5가 제공하는 Assertions 클래스에 대해 알아보겠습니다.
Assertions 클래스는 테스트 코드를 작성하고 검증하고자 하는 값을 확인하는 메서드를 모아놓은 클래스입니다.
아래의 패키지에 속한 클래스입니다.
package org.junit.jupiter.api.Assertions
Assertions 클래스의 메서드는 모두 static 키워드가 붙은 정적 메서드입니다.
따라서 아래처럼 import를 하고 메서드를 직접 사용할 수도 있습니다.
자세한 건 아래 예제에서 참고해주세요.
import static org.junit.jupiter.api.Assertions.*;
Assertions 클래스가 제공하는 대표적인 정적 메서드를 아래 예제 코드를 통해 알아보겠습니다.
class AssertionsTest {
/**
* assertNotNull은 파라미터의 값이 null이 아니면 테스트가 통과됩니다.
* null인 경우 테스트가 실패됩니다.
*/
@Test
void assertNotNullTest() {
Study study = new Study();
assertNotNull(null);
}
/**
* assertEquals는 첫 번째 파라미터가 예상값, 두 번째 파라미터가 결과값을 나타내며
* 예상값과 결과값이 일치하면 테스트가 통과됩니다.
* 테스트 실패 시 출력할 메시지를 설정할 수도 있습니다. 람다식으로도 표현가능합니다.
*/
@Test
void assertEqualsTest() {
int num = 100;
assertEquals(200, num + 100);
assertEquals(200, num + 101, "테스트 실패 시 해당 메시지가 출력됩니다.");
assertEquals(200, num + 101, () -> "테스트 실패 시 해당 메시지가 출력됩니다.");
}
/**
* assertTrue는 파라미터가 true면 테스트가 통과됩니다.
* 테스트 실패 시 출력할 메시지를 설정할 수도 있습니다. 람다식으로도 표현가능합니다.
*/
@Test
void assertTrueTest() {
assertTrue(100 > 50);
assertTrue(100 > 200, "테스트 실패 시 해당 메시지가 출력됩니다.");
assertTrue(100 > 200, () -> "테스트 실패 시 해당 메시지가 출력됩니다.");
}
/**
* JUnit5에서는 테스트 실패 시 테스트가 종료되어 다음 라인의 테스트는 진행하지 않습니다.
* 하지만 assertAll 메서드는 테스트가 실패해도 모든 테스트를 실행할 수 있습니다.
*/
@Test
void assertAllTest() {
assertAll(
() -> assertTrue(100 > 200, "테스트 실패 1"),
() -> assertTrue(200 > 300, "테스트 실패 2"),
() -> assertTrue(300 > 400, "테스트 실패 3")
);
}
/**
* assertThrows는 테스트 실행 시 어떠한 타입의 예외가 발생하는지 검증합니다.
*/
@Test
void assertThrowsTest() {
Study study = new Study();
assertThrows(IllegalArgumentException.class, () -> study.throwIllegalArgumentException("IllegalArgumentException 발생!"));
}
/**
* assertTimeout는 테스트 실행 시 예상한 시간 내에 테스트가 종료되면 테스트가 통과됩니다.
* 예상한 시간을 초과하면 테스트가 실패됩니다.
*/
@Test
void assertTimeoutTest() {
// 아래 예제는 100 밀리세컨 내에 테스트가 종료하지 않으므로 실패됩니다.
assertTimeout(Duration.ofMillis(100), () -> {
new Study();
Thread.sleep(300);
});
}
/**
* 그런데 만약 해당 테스트가 1시간이 걸린다면 assertTimeout은 1시간을 기다린 이후에 걸린 밀리세컨과 100 밀리세컨을 비교하여 테스트 통과여부를 결정합니다.
* 테스트 시간이 오래 걸리는 경우에는 비효율적인데요.
* assertTimeoutPreemptively는 설정한 시간이 지났을 때 진행중인 테스트가 종료될 때까지 기다리지 않고 바로 테스트를 실패처리합니다.
*/
@Test
void assertTimeoutPreemptivelyTest() {
assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
new Study();
Thread.sleep(300);
});
}
}
참고
백기선님의 더 자바, 애플리케이션을 테스트하는 다양한 방법을 듣고 정리한 내용입니다.