<목차>
1. Assertion
2. Jupiter Assertion
3. Jupiter Assertion Methods
테스트 코드 작성에 앞서,
JUnit 라이브러리와 함께 사용할 수 있는 Jupiter Assertion 에 대해 알아보자.
[ Assertion ]
Jupiter Assertion 라이브러리를 알아보기에 앞서, Assertion 의 개념부터 정리해보자.
어설션(Assertion)은 프로그래밍과 소프트웨어 테스트에서 코드의 특정 조건이나 상태를 검증하기 위한 문장을 의미한다.
어설션을 사용하여 프로그램이 예상한 대로 동작하는지 확인하고, 그렇지 않은 경우 오류를 발생시켜 디버깅과 문제 해결을 쉽게 할 수 있다.
<Assertion 의 목적>
- 코드 검증
특정 조건이 참(true)이어야 하는 상황에서 이를 검증한다.예를 들어, 메서드의 입력 파라미터가 유효한지 확인하거나 객체의 상태가 예상된 대로인지 검증하는 용도로 사용한다.
- 디버깅 지원
코드 실행 중 예상치 못한 상태나 값이 발생했을 때 이를 빨리 감지하고 디버깅할 수 있는 기능을 제공한다.어설션 실패 시 적절한 오류 메시지를 출력하여 문제의 원인을 쉽게 파악할 수 있다.
- 문서화
어설션은 코드의 특정 조건이나 가정을 명시적으로 표현하므로, 코드 자체가 문서화의 역할을 할 수 있기에, 코드의 의도를 명확히 알 수 있다.
[Jupiter Assertion]
Jupiter Assertions는 JUnit 5에서 제공하는 어서션 라이브러리이다.
Jupiter Assertions는 테스트 코드에서 조건을 검증하고, 조건이 충족되지 않을 때 테스트를 실패하게 만드는 다양한 메서드를 제공한다.
이러한 Jupiter Assertions 는 다음과 같은 특징을 가지고 있다.
- 유연한 어서션 메서드
- 다양한 데이터 타입과 조건을 검증할 수 있는 메서드를 제공한다.
기본 데이터 타입, 배열, 컬렉션, 예외 등 다양한 상황에 맞는 어서션을 수행할 수 있도록 도와준다.
- 다양한 데이터 타입과 조건을 검증할 수 있는 메서드를 제공한다.
- 커스텀 오류 메시지 지원
- 어서션이 실패할 때 출력할 커스텀 오류 메시지를 제공하여, 문제를 쉽게 파악할 수 있다.
- 람다 표현식 지원
- 실행할 코드 블록을 람다 표현식으로 전달하여, 예외를 던지는 코드 블록을 검증할 수 있다.
[Jupiter Assertion Methods]
다음으로, Jupiter Assertion 이 제공하는 메서드들에 대해 살펴보자.
분류를 나눠보자면, 아래와 같이 나눌 수 있다.
<기본 타입 어서션 메서드>
Method | 설명 |
assertTrue(boolean condition) | 조건이 참인지 확인 |
assertFalse(boolean condition) | 조건이 거짓인지 확인 |
assertTrue(boolean condition, String message) | 조건이 참인지 확인하고 실패 시 메시지 출력 |
assertFalse(boolean condition, String message) | 조건이 거짓인지 확인하고 실패 시 메시지 출력 |
assertEquals(int expected, int actual) | 두 정수가 같은지 확인 |
assertNotEquals(int unexpected, int actual) | 두 정수가 다른지 확인 |
assertEquals(int expected, int actual, String message) | 두 정수가 같은지 확인하고 실패 시 메시지 출력 |
assertNotEquals(int unexpected, int actual, String message) | 두 정수가 다른지 확인하고 실패 시 메시지 출력 |
assertEquals(long expected, long actual) | 두 long 타입 값이 같은지 확인 |
assertNotEquals(long unexpected, long actual) | 두 long 타입 값이 다른지 확인 |
assertEquals(long expected, long actual, String message) | 두 long 타입 값이 같은지 확인하고 실패 시 메시지 출력 |
assertNotEquals(long unexpected, long actual, String message) | 두 long 타입 값이 다른지 확인하고 실패 시 메시지 출력 |
assertEquals(double expected, double actual, double delta) | 두 double 타입 값이 delta 이내로 같은지 확인 |
assertNotEquals(double unexpected, double actual, double delta) | 두 double 타입 값이 delta 이내로 다른지 확인 |
assertEquals(double expected, double actual, double delta, String message) | 두 double 타입 값이 delta 이내로 같고 실패 시 메시지 출력 |
assertNotEquals(double unexpected, double actual, double delta, String message) | 두 double 타입 값이 delta 이내로 다르고 실패 시 메시지 출력 |
assertEquals(Object expected, Object actual) | 두 객체가 같은지 확인 |
assertNotEquals(Object unexpected, Object actual) | 두 객체가 다른지 확인 |
assertNull(Object object) | 객체가 null인지 확인 |
assertNotNull(Object object) | 객체가 null이 아닌지 확인 |
assertSame(Object expected, Object actual) | 두 객체가 동일한 참조를 가리키는지 확인 |
assertNotSame(Object unexpected, Object actual) | 두 객체가 동일한 참조를 가리키지 않는지 확인 |
assertInstanceOf(Class<T> expectedType, Object actual) | 객체가 특정 타입의 인스턴스인지 확인 |
assertNotInstanceOf(Class<?> unexpectedType, Object actual) | 객체가 특정 타입의 인스턴스가 아닌지 확인 |
<배열 어서션 메서드>
배열에 대한 어서션을 사용하여 배열의 크기, 요소, 순서 등을 확인할 수 있다.
** 배열 어서션 메서드는, Arrays.equals() 와 동일하게, 배열 각 원소의 값이 같은지 비교한다.
Method | 설명 |
assertArrayEquals(Object[] expected, Object[] actual) | 두 배열이 동일한지 확인. |
assertArrayEquals(Object[] expected, Object[] actual, String message) | 두 배열이 동일한지 확인하고, 실패 시 커스텀 메시지를 출력 |
assertArrayEquals(byte[] expected, byte[] actual) | 두 byte 배열이 동일한지 확인 |
assertArrayEquals(byte[] expected, byte[] actual, String message) | 두 byte 배열이 동일한지 확인하고, 실패 시 커스텀 메시지를 출력 |
assertArrayEquals(char[] expected, char[] actual) | 두 char 배열이 동일한지 확인 |
assertArrayEquals(char[] expected, char[] actual, String message) | 두 char 배열이 동일한지 확인하고, 실패 시 커스텀 메시지를 출력 |
assertArrayEquals(double[] expected, double[] actual, double delta) | 두 double 배열이 동일한지 확인하며, 각 요소가 delta 이내로 차이 나는 경우 허용 |
assertArrayEquals(double[] expected, double[] actual, double delta, String message) | 두 double 배열이 동일한지 확인하며, 각 요소가 delta 이내로 차이 나는 경우 허용하고, 실패 시 커스텀 메시지를 출력 |
assertArrayEquals(float[] expected, float[] actual, float delta) | 두 float 배열이 동일한지 확인하며, 각 요소가 delta 이내로 차이 나는 경우 허용 |
assertArrayEquals(float[] expected, float[] actual, float delta, String message) | 두 float 배열이 동일한지 확인하며, 각 요소가 delta 이내로 차이 나는 경우 허용하고, 실패 시 커스텀 메시지를 출력 |
assertArrayEquals(int[] expected, int[] actual) | 두 int 배열이 동일한지 확인 |
assertArrayEquals(int[] expected, int[] actual, String message) | 두 int 배열이 동일한지 확인하고, 실패 시 커스텀 메시지를 출력 |
assertArrayEquals(long[] expected, long[] actual) | 두 long 배열이 동일한지 확인 |
assertArrayEquals(long[] expected, long[] actual, String message) | 두 long 배열이 동일한지 확인하고, 실패 시 커스텀 메시지를 출력 |
assertArrayEquals(short[] expected, short[] actual) | 두 short 배열이 동일한지 확인 |
assertArrayEquals(short[] expected, short[] actual, String message) | 두 short 배열이 동일한지 확인하고, 실패 시 커스텀 메시지를 출력 |
<컬렉션 어서션 메서드>
컬렉션의 크기, 내용, 특정 요소의 포함 여부 등을 확인할 수 있다.
Method | 설명 |
assertEquals(Collection<?> expected, Collection<?> actual) | 두 컬렉션이 동일한지 확인 |
assertNotEquals(Collection<?> unexpected, Collection<?> actual) | 두 컬렉션이 다른지 확인 |
assertArrayEquals(Object[] expected, Object[] actual) | 두 배열이 동일한지 확인 |
assertTrue(Collection<?> collection) | 컬렉션이 비어 있지 않은지 확인 |
assertFalse(Collection<?> collection) | 컬렉션이 비어 있는지 확인 |
assertIterableEquals(Iterable<?> expected, Iterable<?> actual) | 두 Iterable 객체가 동일한지 확인 |
assertIterableEquals(Iterable<?> expected, Iterable<?> actual, String message) | 두 Iterable 객체가 동일한지 확인하고, 실패 시 커스텀 메시지를 출력 |
assertDoesNotContain(Collection<?> collection, Object... values) | 컬렉션이 특정 요소를 포함하지 않는지 확인 |
assertContains(Collection<?> collection, Object... values) | 컬렉션이 특정 요소를 포함하는지 확인 |
assertContainsAnyOf(Collection<?> collection, Object... values) | 컬렉션이 주어진 요소들 중 하나를 포함하는지 확인 |
assertDoesNotContain(Collection<?> collection, Object... values) | 컬렉션이 특정 요소를 포함하지 않는지 확인 |
assertContainsExactly(Collection<?> actual, Object... values) | 컬렉션이 주어진 요소들만 포함하고, 순서도 동일한지 확인 |
assertContainsExactlyInAnyOrder(Collection<?> actual, Object... values) | 컬렉션이 주어진 요소들을 포함하고, 순서는 무관하게 정확히 포함하는지 확인 |
assertContainsSequence(Collection<?> collection, Object... values) | 컬렉션이 주어진 요소들의 순서가 포함된 서브시퀀스인지 확인 |
assertContainsSubsequence(Collection<?> collection, Object... values) | 컬렉션이 주어진 요소들을 서브시퀀스 형식으로 포함하는지 확인 |
assertDoesNotContainAll(Collection<?> collection, Object... values) | 컬렉션이 모든 주어진 요소들을 포함하지 않는지 확인 |
assertIsEmpty(Collection<?> collection) | 컬렉션이 비어 있는지 확인 |
assertIsNotEmpty(Collection<?> collection) | 컬렉션이 비어 있지 않은지 확인 |
<예외 어서션 메서드>
코드 블록이 예상된 예외를 발생시키는지 또는 예외가 발생하지 않는지를 검증하는 데 사용한다.
Method | 설명 |
assertThrows(Class<? extends Throwable> expectedType, Executable executable) | 코드 블록이 특정 예외를 발생시키는지 검증 |
assertDoesNotThrow(Executable executable) | 코드 블록이 예외를 발생시키지 않는지 검증 |
assertThrows(Class<? extends Throwable> expectedType, Executable executable, String message) | 코드 블록이 특정 예외를 발생시키는지 검증하고, 실패 시 커스텀 메시지를 출력 |
assertDoesNotThrow(Executable executable, String message) | 코드 블록이 예외를 발생시키지 않는지 검증하고, 실패 시 커스텀 메시지를 출력 |
이러한 Assertion Method 를 사용함에 있어, 알고 있어야 할 내용이 있다.
- 배열의 비교는, 레퍼런스 비교가 아닌 각 원소들의 값을 비교한다.
- 객체의 비교는, 각 객체의 equals() 메서드를 사용하여 비교한다.
- 검증에 실패하는 경우 AssertionError 를 Throw 하여 테스트를 실패하게 만든다.
마지막 검증 실패하는 케이스에 대해 간단한 예를 살펴보자.
기본 타입 어서션 메서드 중, assertTrue() 를 사용한 테스트 메서드이다.
- assertTrue(boolean condition, String message)
- condition 이 false 인 경우, message 가 출력된다.
- "2 < 1" 이라는 조건을 넣었으므로, 테스트에 실패해야 정상이다.
<Test Source>
@Test
public void testAssertions() {
assertTrue(2 < 1, "wrong condition");
}
<Result>

- 위 테스트 실행 결과를 보면, 테스트에 실패하였으며, "wrong condition" 이라는 메시지가 출력된 것을 확인할 수 있다.
- 이렇게 테스트 코드가 실패하면 AssertionFailedError가 발생하며, 실제로는 AssertionError를 사용하여 실패를 보고하지만, 내부적으로는 org.opentest4j의 AssertionFailedError가 사용된다.
'Spring & Spring boot' 카테고리의 다른 글
[Springboot] 테스트 코드 - 6 - Controller Unit Test 컨트롤러 단위 테스트 (0) | 2024.08.07 |
---|---|
[Springboot] 테스트 코드 - 5 - Mockito (0) | 2024.08.06 |
[Springboot] 테스트 코드 - 3 - JUnit5 (1) | 2024.08.06 |
[Springboot] 테스트 코드 - 2 - TDD 테스트 주도 개발이란? (0) | 2024.08.05 |
[Springboot] 테스트 코드 - 1 - 테스트 개요 (0) | 2024.08.04 |