실제 값이 기대한 값과 같은지 확인 | assertEquals(expected, actual) |
값이 null이 아닌지 확인 | assertNotNull(actual) |
다음 조건이 참(true)인지 확인 | assertTrue(boolean) |
모든 구문 확인 | assertAll(executables..) |
예외 발생 확인 | assertThrows(expectedType, executable |
특정 시간 안에 실행이 완료되는지 확인 | assertTimeOut(duration, executable |
@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 + " 상태여야 한다.");
메세지값을 람다를 사용했을 때와 안했을 때의 차이
람다를 사용하지 않았을 때는 테스트코드가 성공하던 말던 메시지 연산을 실행하는데
람다를 사용하면 테스트코드가 실패했을 때만 메시지를 연산하기 때문에 성능면에서 우수하다.
@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() 안에 있는
테스트코드들을 한번에 체크해준다.
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() 메소드를 이용하여 해당 조건을 실행했을 경우 발생할 수 있는 예외를 테스트 할 수 있고
예외가 발생했을 때의 메세지 또한 테스트 할 수 있다.
@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을 사용했을 때는 예상치 못한 결과가 나올 수 있으니 조심해서 써야 한다.