본문 바로가기
Java

[Java] JUnit 5 사용법 (10) - Assertions, Assumptions

by 노력남자 2022. 9. 6.
반응형

이번 포스팅에선 JUnit 을 사용하면서 간단하지만 제일 중요한 기능인 Assertions, Assumptions에 대해 알아보겠습니다.

 

JUnit 5에서 기본적으로 제공해주는 Assertions, Assumptions를 알아보고 다른 라이브러리는 어떤 것들이 있는지 알아보겠습니다.

 

JUnit 5 Assertions

 

Assertion이 한글 뜻으로 주장이라는 뜻인데 테스트가 원하는 결과를 제대로 리턴하는지 에러는 발생하지 않는지 확인할 때 사용하는 메소드를 말합니다.

 

각 메소드의 인자는 별도로 표기하지 않겠습니다. 워낙 많은 인자들이 있어서 표기하지 않았습니다.

 

메소드명 설명
fail 무조건 실패 (레거시에 사용하면 좋다.)
assertTrue 조건이 성공이면 True
assertFalse 조건이 실패면 True
assertNull 조건이 Null이면 True
aseertNotNull 조건이 Not Null이면 True
assertEquals(expected, actual) expected와 actual이 동일하면 True
assertArrayEquals 두 Array가 동일하면 True
assertIterableEquals 두 Iterable이 동일하면 True
assertLinesMatch 두 Stream이 동일하면 True
assertNotEquals expected와 actual이 다르면 True
assertSame 동일한 Object면 True
assertNotSame 다른 Object면 True
assertAll 여러 Assertion이 True면 True
assertThrows 예상한 에러가 발생하면 True
assertDoesNotThrow 에러가 발생하지 않으면 True
assertTimeout 테스트가 지정한 시간보다 오래 걸리지 않으면 True

지정한 시간보다 오래 걸려도 테스트가 끝날 때까지 대기
assertTimeoutPreemptively 테스트가 지정한 시간보다 오래 걸리지 않으면 True

지정한 시간보다 오래 걸린 경우 바로 테스트 종류

 

예시

 

모든 메소드를 테스트하진 않고 자주 사용하는 메소드들만 예시로 들었습니다.

 

package com.effortguy.junit5;

import org.junit.jupiter.api.Test;

import static java.time.Duration.ofSeconds;
import static org.junit.jupiter.api.Assertions.*;

public class AssertionsDemo {

    @Test
    void testAssertTrue() {
        assertTrue(1 == 1);
    }

    @Test
    void testAssertFalse() {
        assertFalse(1 != 1);
    }

    @Test
    void testAssertNull() {
        assertNull(null);
    }

    @Test
    void testAssertNotNull() {
        assertNotNull(1);
    }

    @Test
    void testAssertEquals() {
        assertEquals(1, 0 + 1);
    }

    @Test
    void testAssertThrows() {
        assertThrows(ArithmeticException.class, () -> {int i = 1/0;});
    }

    @Test
    void testAssertTimeout() {
        String actualResult = assertTimeout(ofSeconds(1), () -> {
            Thread.sleep(2000);
            return "a result";
        });

        assertEquals("a result", actualResult);
    }

    @Test
    void testAssertTimeoutPreemptively() {
        String actualResult = assertTimeoutPreemptively(ofSeconds(1), () -> {
            Thread.sleep(2000);
            return "a result";
        });

        assertEquals("a result", actualResult);
    }
}

 

결과

 

 

assertTimeout

 

org.opentest4j.AssertionFailedError: execution exceeded timeout of 1000 ms by 1008 ms (초과시간)

 

assertTimeoutPreemptively

 

org.opentest4j.AssertionFailedError: execution timed out after 1000 ms (1초가 지나니깐 바로 테스트 종료)

 

 

JUnit 5 Assumptions

 

assumption은 한글로 추정이라는 뜻으로 메소드별 조건을 만족할 경우 진행시키고 아닌 경우 스킵하는 메소드입니다.

 

테스트 if 라고 생각하시면 될 거 같습니다.

 

메소드명 설명
assumeTrue 테스트가 실패하면 에러 발생
assumeFalse 테스트가 성공하면 에러 발생
assumingThat(boolean, executable) 첫 번째 인자가 True면 두 번째 인자로 들어온 함수 실행

첫 번째 인자 값이 false 인 경우에도 테스트를 스킵하지 않고 다음 코드를 진행합니다.

 

예제

 

package com.effortguy.junit5;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assumptions.*;

public class AssumptionsDemo {

    @Test
    public void testAssumeTrue() {
        assumeTrue(true);
        // remainder of test
    }

    @Test
    public void testAssumeTrue2() {
        assumeTrue(false);
        // remainder of test
    }

    @Test
    public void testAssumeFalse() {
        assumeFalse(false);
        // remainder of test
    }

    @Test
    public void testAssumingThatTrue() {
        assumingThat(true, () -> {
            //실행 O
            System.out.println("success");
        });
    }

    @Test
    public void testAssumingThatFalse() {
        assumingThat(false, () -> {
            //실행 X
            System.out.println("success");
        });
    }
}

 

결과

 

 

Assertions vs Assumptions

 

처음에 Assertions와 Assumptions를 정리할 때 도대체 뭔 차이인지 갸우뚱했는데 실행해보니 이해가 갔습니다.

 

Assertions : 개발자가 테스트하고 싶은 인자값을 넣었을 때 예상한 결과가 나오는지 테스트 해볼 경우 사용

 

예 : "A"를 넣으면 "B"가 나온다

 

Assumtptions : 개발자가 인자값을 정확히 모를 때 if 와 같은 용도로 사용

 

예 : 현재 테스트 환경이 "DEV"라면 테스트를 진행해라.

 

 

다음 포스팅에선 JUnit 5의 Assertions, Assumptions 보다 더 편하게 테스트할 수 있게 해주는 라이브러리들을 알아보겠습니다.

 

읽어주셔서 감사합니다.

반응형

댓글