본문 바로가기
스프링/JUnit

[JUnit] Assertion, JUnit 5의 단언문

by 책 읽는 개발자_테드 2020. 12. 2.
반응형

이 글은 인프런 - 더 자바, 애플리케이션을 테스트하는 다양한 방법 강의를 학습하며 정리한 내용입니다.

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 트랜잭션 코드가 있다면 롤백이 안될 수 있다. 

 

 

반응형

댓글