뭐라도 끄적이는 BLOG

JUnit5 Assertions 본문

Java/JUnit5

JUnit5 Assertions

Drawhale 2021. 12. 3. 17:08

Assertions은 우리가 실제 테스트에서 검증하고자 하는 내용을 확인하는 메소드들을 모아놓은 클래스 입니다. 주로 import static으로 가지고와 메소드 들을 사용하게 됩니다.

assertEqulas(expected, actual) 실제 값이 기대한 값과 같은지 확인
assertNotNull(actual) 값이 null이 아닌지 확인
assertTrue(boolean) 조건이 참(true)인지 확인
assertAll(executables...) 모든 확은 구문 확인
assertThrows(expectedType, executable) 예외 발생 확인
assertTimeout(duration, executable) 특정 시간 안에 실행이 완료되는지 확인

이모든 메소드들은 Supplier<String> messageSupplier 매개변수가 있는 함수가 오버로딩 되어 있어 테스트가 실패했을 경우 나오는 오류메세지를 입력할 수 있습니다. 이 메세지에 단순이 String을 넣어 사용할 수 있지만 람다식을 사용는 것이 좋습니다. String문자열에서 연산이 들어가 있으면 해당 테스트 메소드를 실행할때마다 연산을 하지만 람다식은 문자열 연산을 최대한 필요한 시점에 하기 때문에 조금더 성능에 유리합니다.

assertEquals로 예를 들어보겠습니다.

//assertEquals(StudyStatus.DRAFT, study.getStatus(), "스터디를 처음 만들면 상태값이 " + StudyStatus.DRAFT + "여야 한다.");
assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 상태값이 " + StudyStatus.DRAFT + "여야 한다.");

assertEquals

assertEquals는 실제 값이 기대한 값과 같은지 확인하는 메소드 입니다. 기대되는 값을 expected에 넣어주고 실제 출력값을 actual에 넣어주어 두 값이 같은지 비교하게 됩니다. 매개변수에 넣는 값의 순서를 뒤바꾸어도 테스트에 상관은 없지만 순서를 맞추어 주는 것이 정석입니다. 이는 이후에 해당 테스트를 다시 볼때도 도움이 많이 됩니다.

@Test
@DisplayName("스터디 만들기")
void study(){
    Study study = new Study();
    assertNotNull(study);
    assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 상태값이 " + StudyStatus.DRAFT + "여야 한다.");
}

 

assertTrue

boolean에 들어간 값이 true인지 확인해 주는 메소드 입니다.

@Test
@DisplayName("스터디 인원 제한")
void studyLimit(){
    Study study = new Study(10);
    assertTrue(study.getLimit() > 0);
}

 

assertAll

한 메소드에 assert메소드가 여러개 있을때 위부터 아래로 차례대로 확인하다가 오류가 생기면 해당 오류를 반환하고 메소드가 종료되어 나머지 assert메소드를 확인할 수 없습니다. 이때 모든 assert메소드들을 확인하기 위한 메소드가 assertAll입니다.

@Test
@DisplayName("스터디 만들고 인원제한 확인하기")
void create_study_and_check_limit_shouldSuccess(){
    Study study = new Study(10);
    assertAll(
            () -> assertNotNull(study),
            () -> assertEquals(StudyStatus.DRAFT, study.getStatus()),
            () -> assertTrue(study.getLimit() > 0)
    );
}

assertTimeout

특정 시간 안에 실행이 완료되는지 확인하는 메소드 입니다.

@Test
@DisplayName("실행 시간 확인")
void check_execute_time_shouldSuccess(){
    assertTimeout(Duration.ofSeconds(10), () -> new Study(10));
}

해당 코드는 코드 블록이 실행되는데 까지 기다렸다가 체크를 하는것이기 때문에 오래 걸리는 코드는 그만큼 시간을 지연할 수 밖에 없습니다. 해당 예시와 같이 10s이 지나는 코드이면 10s이후 실행되는 코드들은 어쩌피 실행되어 봤자 테스트가 실패하기 때문에 굳이 기다릴 필요가 없다고 생각하면 assertTimeoutPreemptively를 사용하면 됩니다.

assertTimeoutPreemptively는 주의할점이 ThreadLocal을 사용하고 있는 코드 블록이라면 예상치못한 결과가 나올수 있습니다.

 

assertThrows

예외 발생 확인하는 메소드입니다.

 

@Test
@DisplayName("스터디 인원제한 설절")
void check_study_shouldFail() {
    Exception exception = assertThrows(IllegalAccessException.class, () -> new Study(-1));
    assertEquals(exception.getMessage(), "limit은 0보다 커야 한다.");
}

exception 메세지를 받아 메세지가 일치하는지도 확인할 수 있습니다.

 

이 외에도 AssertJ, Hemcrest, Truth 등의 라이브러리를 사용할 수도 있습니다. Spring boot에서는 AssertJ와 Hemcrest가 기본적으로 제공되고 있습니다.

 


 

참고 자료

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus

junit.org

 

더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의

자바 프로그래밍 언어를 사용하고 있거나 공부하고 있는 학생 또는 개발자라면 반드시 알아야 하는 애플리케이션을 테스트하는 다양한 방법을 학습합니다., 그냥 개발자를 넘어 '더 나은 개발

www.inflearn.com

 

반응형

'Java > JUnit5' 카테고리의 다른 글

JUnit5 조건에 따라 테스트 실행하기  (0) 2021.12.05
JUnit5 소개  (0) 2021.12.03