반응형
이 글은 인프런 - 더 자바, 애플리케이션을 테스트하는 다양한 방법 강의를 학습하며 정리한 내용입니다.
www.inflearn.com/course/the-java-application-test
JUnit 5의 단언문 Assertion
메소드를 사용해서 테스트에서 검증하고자하는 내용을 확인하는 기능이다.
JUnit 5의 단언문들
단언문들을 설명하기 위해 다음의 Study 클래스를 테스트합니다.
public class Study {
private StudyStatus studyStatus = StudyStatus.DRAFT;
private int limit;
public Study(int limit){
this.limit = limit;
}
public StudyStatus getStatus(){
return this.studyStatus;
}
public int getLimit() {
return limit;
}
}
public enum StudyStatus {
DRAFT, STARTED, ENDED
}
assertNotNull(actual)
값이 null이 아닌지 확인한다.
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study() {
Study study = new Study(10);
assertNotNull(study);
}
}
assertEquals(expect, actual)
실제 값이 기대한 값과 같은지 확인한다.
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study() {
Study study = new Study(10);
assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값이 DRAFT.");
}
}
assertTrue(boolean)
다음 조건이 참(true)인지 확인한다.
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study() {
Study study = new Study(-10);
assertTrue(study.getLimit() >0, "스터디 최대 참가 가능 인원으 0보다 커야함.")
}
}
assertAll(executable...)
모든 확인 구문들을 테스트한다.
아래와 같이 여러개의 단언문을 사용할때, 앞선 테스트가 실패하면 다음 테스트는 실행되지 않는다. 때문에 다음 테스트가 실패했는 지 알 수 없다.
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study() {
Study study = new Study(-10);
assertEquals(StudyStatus.ENDED, study.getStatus(), ()->"스터디를 처음 만들면 상태값이 DRAFT.");
assertTrue(study.getLimit() >0, "스터디 최대 참가 가능 인원으 0보다 커야함.");
}
}
결과
이럴때 assertAll을 사용하면 전체 테스트의 결과를 전부 확인할 수 있다.
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study() {
assertAll(
() -> assertEquals(StudyStatus.ENDED, study.getStatus(), ()->"스터디를 처음 만들면 상태값이 DRAFT."),
() -> assertTrue(study.getLimit() >0, "스터디 최대 참가 가능 인원으 0보다 커야함.")
);
}
}
assertThrows(expectedType, executable)
예외 발생 확인한다.
Study 클래스를 다음과 같이 변경하고,
public class Study {
private StudyStatus studyStatus = StudyStatus.DRAFT;
private int limit;
public Study(int limit){
if(limit < 0){
throw new IllegalArgumentException("limit은 0보다 커야한다.");
}
this.limit = limit;
}
public StudyStatus getStatus(){
return this.studyStatus;
}
public int getLimit() {
return limit;
}
}
아래와 같이 코드를 작성하자.
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study() {
assertThrows(IllegalArgumentException.class, ()->new Study(-10));
}
}
결과
assertTimeout(duration, executable)
특정 시간 안에 실행이 완료되는지 확인한다.
두번째 매개변수의 람다문이 종료되야 테스트가 끝난다.
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study() {
assertTimeout(Duration.ofMillis(100), () -> {
new Study(10);
Thread.sleep(300);
});
}
}
assertTimeoutPreemptively(duration, executable)
특정 시간 안에 실행이 완료되는지 확인한다.
class StudyTest {
@Test
@DisplayName("스터디 만들기")
void create_new_study() {
assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
new Study(10);
Thread.sleep(300);
});
}
}
첫 번째 매개변수에 지정한 시간이 지나면 테스트가 종료되기 때문에 assertTimeout보다 시간 효율적으로 사용할 수 있다. 하지만 두 번쨰 매개변수인 람다문을 별도에 Thread에서 사용하므로 주의해서 사용해야한다. 예를들어 DB 트랜잭션 코드가 있다면 롤백이 안될 수 있다.
반응형
'스프링 > JUnit' 카테고리의 다른 글
[Junit] MockMvc 객체란? (0) | 2021.04.29 |
---|---|
[JUnit] JUnit 5로 자바 단위 테스트 시작하기 (0) | 2021.04.27 |
[JUnit] JUnit5 테스트를 반복 실행하는 방법(@RepeaedTest, @ParameterizedTest) (0) | 2020.12.15 |
[JUnit] JUnit5 테스트 이름 표시하기 (0) | 2020.12.14 |
[JUnit] @Tag, 테스트의 태깅과 필터링 (0) | 2020.12.03 |
댓글