이 글은 온라인 강의를 듣고 직접 실습해보며 정리한 글입니다. 더 자세한 내용은 아래 강의에서 확인할 수 있습니다.
더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의 (백기선)
assertEquals
: 값 비교 테스트
assertEquals([나와야 하는 값], [테스트 결과 값], [실패 시 메시지]);
assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값이 " + StudyStatus.DRAFT + " 여야 한다.");
실패 시 메시지 인자를 람다로도 구현할 수 있습니다.
assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 상태값이 " + StudyStatus.DRAFT + " 여야 한다.");
인자를 string 타입으로 넣어주었을 때의 차이
- string 일때는 테스트가 성공하는 실패하든 해당 인자값을 만들기 위해 연산을 수행하지만,
- 람다일때는 테스트가 실패했을 경우에만 해당 연산을 수행합니다.
assertAll
: 여러 assert문 한 번에 실행
@Test
@DisplayName("모든 테스트 한 번에 실행")
void execute_all_test() {
Study study = new Study();
assertAll(
() -> assertNotNull(study),
() -> assertEquals(StudyStatus.END, study.getStatus(), () -> "스터디를 처음 만들면 상태값이 " + StudyStatus.DRAFT + " 여야 한다."),
() -> assertTrue(study.getLimit() > 0, "스터디 인원 수는 0명을 넘어야한다.")
);
}
기본적으로 한 메소드 안에 여러 assert 문이 있어도 위에서 테스트가 깨지면 그 다음 assert는 실행하지 않고 바로 에러를 내뱉습니다. 하지만 assertAll
은 상위 assert문의 에러 여부와 상관없이 모든 assert 문을 실행해줍니다.
assertThrows
: 익셉션 테스트
assertThrows([예상 익셉션 클래스], () -> [테스트 내용]));
@Test
@DisplayName("스터디 생성 - 익셉션 발생 테스트")
void create_study_limit() {
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> new Study(-10));
assertEquals("최소 인원은 0보다 커야 한다.", exception.getMessage());
}
assertTimeout
: 수행 시간 테스트 (제한 시간을 초과해도 테스트가 끝날 때까지 기다린다.)
assertTimeout([제한 시간], () -> [테스트 내용]);
@Test
@DisplayName("타임아웃 테스트")
void create_study_timeout() {
assertTimeout(Duration.ofMillis(100), () -> {
new Study(10);
Thread.sleep(300);
});
}
assertTimeoutPreemptively
: 수행 시간 테스트 (제한 시간을 초과하면 테스트를 종료한다.)
assertTimeoutPreemptively([제한 시간], () -> [테스트 내용]);
@Test
@DisplayName("타임아웃 테스트")
void create_study_timeout() {
assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
new Study(10);
Thread.sleep(300);
});
}
※ 주의 할 점
: assertTimeoutPreemptively
는 독립적인 스레드로 실행하기 때문에 트랜잭션이 포함된 경우 트랜잭션 스레드와 별개로 돌아서 롤백이 안될수도 있습니다. 그러므로 스레드가 필요한 경우는 assertTimeoutPreemptively
보다 assertTimeout
를 사용하는 게 더 안정적입니다.
assumeTrue
: 해당 조건을 만족해야지만 하위 코드 실행
assumeTrue([참이길 원하는 조건문])
@Test
@DisplayName("assume 테스트")
void assume_true() {
String env = System.getenv("PROCESSOR_LEVEL");
System.out.println(env);
assumeTrue("10".equalsIgnoreCase(env)); // 이 조건이 만족해야지만 하위 코드 실행
Study actual = new Study(10);
assertThat(actual.getLimit()).isGreaterThan(0);
}
assumption is not true
: assumeTrue
를 만족하지 않아 테스트 중지
assumeThat
: 조건에 따른 분기 가능
assumingThat([조건], () -> [조건 참일 때 수행할 테스트 내용]);
@Test
@DisplayName("assume 테스트")
void assume_that() {
String env = System.getenv("PROCESSOR_LEVEL");
System.out.println(env);
// env 가 "6" 이면 테스트 블럭 수행
assumingThat("6".equalsIgnoreCase(env), () -> {
Study actual = new Study(10);
assertThat(actual.getLimit()).isGreaterThan(0);
});
// env 가 "8" 이면 테스트 블럭 수행
assumingThat("8".equalsIgnoreCase(env), () -> {
Study actual = new Study(80);
assertThat(actual.getLimit()).isGreaterThan(0);
});
}
Junit5 Assertions / Assumptions 설명
글 읽어주셔서 언제나 감사합니다. 좋은 피드백, 개선 피드백 너무나도 환영합니다.
연관글
'SearchDeveloper > 애플리케이션테스트' 카테고리의 다른 글
TestContainers 설명 (0) | 2022.08.02 |
---|---|
[Postman] Runner 와 newman 으로 response 파일에 쓰기 (0) | 2022.07.24 |
Junit5 애노테이션 설명 (0) | 2022.07.24 |
Mockito 설명 (0) | 2022.07.24 |