JUnit5

Walker·2022년 1월 20일
0

Tools

목록 보기
2/2

백기선님의 <더 자바, 애플리케이션을 테스트하는 다양한 방법>을 듣고 정리하는 글 입니다.

@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS) 
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class StudyTest {

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
모든 테스트 메소드가 하나의 클래스 안의 값을 공유

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
테스트 메소드 간에 실행 순서를 설정(@Order(1), @Order(2), @Order(3))

@Test
@Order(3)
@EnabledOnOs({OS.WINDOWS, OS.MAC})
@EnabledOnJre(JRE.JAVA_8)
@DisplayName("maked name")
@Tag("fast")
void assertAllTest() {

    Study study = new Study(1);
    String env = "LOCAL";
    
    //이 조건을 넘어가지않으면 아래 테스트가 실행되지 않음 - System.getenv()
    assumeTrue("LOCAL".equalsIgnoreCase(env)); 

    assumingThat("LOCAL".equalsIgnoreCase(env),
        () -> System.out.println("env Local")
    );

    assertAll (
        () -> assertNotNull(study),
        () -> assertEquals(StudyStatus.STARTED, study.getStatus(), () -> "스터디의 초기" + "상태값은"  + "DRAFT여야 한다."), // 문자열 연산을 실패할 때만 하고 싶을 때는 람다식 표현(성능)
        () -> assertTrue(study.getLimit() > 0, "참가자 수는 0보다 커야함")
    );

}

@EnabledOnOs({OS.WINDOWS, OS.MAC})
@EnabledOnJre(JRE.JAVA_8)

특정 환경(MAC, WINDOW, JAVA8...)에서만 테스트가 실행되도록 제한

assertAll (
() -> assertNotNull(study),
() -> assertEquals(StudyStatus.STARTED, study.getStatus(),
() -> "스터디의 초기" + "상태값은" + "DRAFT여야 한다."),
() -> assertTrue(study.getLimit() > 0, "참가자 수는 0보다 커야함")
);

복수의 테스트를 다른 테스트의 실패여부에 관계없이 독립적으로 실행하고 싶을 때는
assertAll()을 사용하는 것이 좋으며 위와 같이 람다식으로 표현하는 것이 실패 메시지를 표현할 때
문자열 연산을 실패할 때만 하게 되어 성능상의 이득을 가져올 수 있다.

@Order(1)
@Test
void duration_test() {
    // 얼마나 초과 되었는지는 확인안됨(assertTimeout()은 가능 - ThreadLocal(transaction에 독립적)에도 안전)
    assertTimeoutPreemptively(Duration.ofSeconds(1), () -> {
    	new Study(10);
    	Thread.sleep(3000);
    });
}

assertTimeoutPreemptively(Duration.ofSeconds(1)
Test의 시간제한을 두고 이를 초과하면 실패하는 테스트로 간주

@DisplayName("반복 테스트")
@RepeatedTest(value = 10, name = "{displayName}, {currentRepetition}/{totalRepetitions}")
void repeatTest(RepetitionInfo repetitionInfo) {
    System.out.println("repeat Test");
    System.out.println("repeatTest : "+ repetitionInfo.getCurrentRepetition());
    System.out.println("repeatTest : "+ repetitionInfo.getTotalRepetitions());
}

동작을 반복하는 경우 각 반복에 이름을 붙일 수도 있다.

@DisplayName("파라미터 테스트")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@ValueSource(strings = {"날씨", "영하", "10도"})
@EmptySource
@NullSource
@NullAndEmptySource
void parameterTest(String message) {
    System.out.println(message);
}

파라미터를 @ValueSource를 통해 주며 반복 할 수도 있고
null(@NullSource)이나 빈값(@EmptySource)의 경우도 확인 할 수 있다.

@BeforeAll
static void beforeAll(){
    System.out.println("before only one");
}

@AfterAll
static void  afterAll() {
    System.out.println("after only one");
}

전체 Test에서 처음과 마지막에 한번씩만 실행된다.

@BeforeEach
void beforeEach() {
    System.out.println("before all each");

@AfterEach
void afterEach() {
    System.out.println("after all each");
}

각 Test 메소드마다 각각 한번씩 처음과 마지막에 실행된다.

junit.jupiter.testinstance.lifecycle.default = per_class 
junit.jupiter.extensions.autodetection.enabled= true
junit.jupiter.conditions.deactivate = org.junit.*DisabledCondition
junit.jupiter.displayname.generator.default = org.junit.jupiter.api.DisplayNameGenerator$ReplaceUnderscores

위와 같은 경로에 junit-platform.properties 파일을 작성하여
매번 annotation을 사용하지 않고 공통적으로 설정을 적용 할 수도 있다.

profile
I walk slowly, but I never walk backward. -Abraham Lincoln-

0개의 댓글