이번 포스팅에선 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 보다 더 편하게 테스트할 수 있게 해주는 라이브러리들을 알아보겠습니다.
읽어주셔서 감사합니다.
댓글