본문 바로가기

SearchDeveloper/애플리케이션테스트

Junit5 Assertions / Assumptions 설명

JUnit5

이 글은 온라인 강의를 듣고 직접 실습해보며 정리한 글입니다. 더 자세한 내용은 아래 강의에서 확인할 수 있습니다.

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

 

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);
}

assumeTrue 불만족

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 설명

 

글 읽어주셔서 언제나 감사합니다. 좋은 피드백, 개선 피드백 너무나도 환영합니다.

 

연관글

https://elsboo.tistory.com/21

 

Junit5 애노테이션 설명

이 글은 온라인 강의를 듣고 해당 내용을 직접 실습해보며 정리한 글입니다. 더 자세한 내용은 아래 강의에서 확인할 수 있습니다. 더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 |

elsboo.tistory.com