- Java 언어에서 독립된 단위 테스트를 지원해 주는 프레임워크를 의미합니다.
- JUnit 5의 경우 'Java8 이상 버전'부터 지원을 하며 JUnit Platform, Jupiter, Vintage 모듈이 결합된 형태를 가지고 있습니다.
- 단위 테스트(Unit Test)
- 소프트웨어 개발에서 개별적인 코드 단위를 테스트하는 것을 의미합니다.
- 코드의 작은 부분을 격리시켜 독립적으로 테스트함으로써 코드의 정확성과 신뢰성을 검증
- 코드 변경 시 기존 기능에 영향을 주지 않고 코드의 동작을 확인하는데 유용합니다.
- 단위 테스트의 범위
- 클래스, 메서드, 함수와 같은 작은 단위의 코드를 격리시켜 독립적으로 테스트
- 따라서 컨트롤러단이나 서비스단과 같은 구성 요소는 각각 개별적인 단위로 테스트될 수 있습니다.
- JUnit5 구성요소
- JUnit5에서는 Platform, TestEngine Interface, TestEngine, Jupiter, Vintage으로 구성이 되어 있습니다.
- 💡 JUnit Platform
- JUnit 테스트를 실행하는 데 사용되는 실행 환경을 의미합니다.
- TestEngine Interface를 통하여 다른 TestEngine 구현체들과 상호작용하여 테스트를 실행하고 테스트 결과를 보고하는 역할을 수행하는 Test FrameWork입니다.
JUnit Platform에서 테스트를 실행하고 결과를 보고하는 데 사용이 되는 인터페이스로 TestEngine에 대한 메서드와 속성을 정의하는 데 사용이 됩니다.
TestEngine Interface를 기반으로 TestEngine의 구현체를 구성합니다. 이를 통해 사용자 정의 TestEngine을 만들 수 있습니다.
TestEngine Interface의 주요 메서드
메서드 리턴 타입 설명 discover() void- 테스트를 발견하고 고유한 ID를 부여하는 메서드입니다. execute() void- 테스트를 실행하는 메서드입니다. getId() String- 테스트 엔진의 고유 식별자를 반환하는 메서드입니다. getGroupId() String- 테스트 엔진의 그룹 식별자를 반환하는 메서드입니다. getVersion() String- 테스트 엔진의 버전을 반환하는 메서드입니다.
JUnit5에서 제공되는 새로운 프레임워크를 의미하여 테스트 작성과 실행을 위한 기능을 어노테이션으로 제공하며 JUnit4 보다 강력하고 유연한 테스트 코드를 작성하도록 제공해줍니다.
주요 어노테이션
| 어노테이션 | 설명 |
|---|---|
| @Test | 테스트 메서드를 정의하는 데 사용되는 어노테이션입니다. 이 어노테이션이 지정된 메서드는 JUnit Jupiter에서 테스트로 실행됩니다. |
| @ParameterizedTest | 매개변수화된 테스트를 정의하는 데 사용되는 어노테이션입니다. 이 어노테이션이 지정된 메서드는 여러 매개변수를 사용하여 반복적으로 실행됩니다. |
| @BeforeEach | 각각의 테스트 메서드가 실행되기 전에 실행되는 코드를 정의하는 데 사용되는 어노테이션입니다. |
| @AfterEach | 각각의 테스트 메서드가 실행된 후에 실행되는 코드를 정의하는 데 사용되는 어노테이션입니다. |
- 사용자는 IDE Tool을 이용하여 테스트 코드를 실행합니다.
- 테스트 코드는 JUnit Platform 내에서 수행이 됩니다.
- 테스트 코드를 구성하는 메서드나 어노테이션에 대해서는 TestEngine Interface를 이용하여 호출하여 구성합니다.
- TestEngine Interface의 실제 구현되는 구현체는 Junit Jupiter, Junit Vintage, Custom Engine을 기반으로 구현이 됩니다.
| 어노테이션 | 설명 |
|---|---|
| @Test | 테스트 메소드임을 나타내는 어노테이션 |
| @ParameterizedTest | 매개변수화된 테스트를 위한 어노테이션 |
| @DisplayName | 테스트의 표시 이름을 설정하는 어노테이션 |
| @BeforeEach | 각 테스트 메소드 실행 전에 실행되는 메소드를 정의하는 어노테이션 |
| @AfterEach | 각 테스트 메소드 실행 후에 실행되는 메소드를 정의하는 어노테이션 |
| @BeforeAll | 모든 테스트 메소드 실행 전에 실행되는 메소드를 정의하는 어노테이션 |
| @AfterAll | 모든 테스트 메소드 실행 후에 실행되는 메소드를 정의하는 어노테이션 |
| @Nested | 중첩된 테스트 클래스를 정의하는 어노테이션 |
| @Tag | 테스트를 그룹화하기 위한 태그를 지정하는 어노테이션 |
| @Disabled | 비활성화된 테스트를 나타내는 어노테이션 |
| @Timeout | 테스트의 제한 시간을 설정하는 어노테이션 |
| @ExtendWith | 커스텀 확장을 적용하는 어노테이션 |
| @RegisterExtension | 커스텀 확장을 등록하는 어노테이션 |
| @TempDir | 테스트용 임시 디렉터리를 생성하는 어노테이션 |
- JUnit Assertions
- 단위 테스트에서 다양한 유형의 검사를 수행하기 위한 Assertions 메서드를 제공합니다.
- 모두 import org.junit.jupiter.api.Assertions 패키지를 임포트해서 사용합니다.
| 메서드 | 구분 | 설명 |
|---|---|---|
| assertEquals(expected, actual) | JUnit 4~ | 예상값과 실제값이 동일한지 확인합니다. |
| assertArrayEquals(expected, actual) | JUnit 4~ | 예상 배열과 실제 배열이 동일한지 확인합니다. |
| assertNull(object) | JUnit 4~ | 객체가 null인지 확인합니다. |
| assertNotNull(object) | JUnit 4~ | 객체가 null이 아닌지 확인합니다. |
| assertSame(expected, actual) | JUnit 4~ | 예상값과 실제값이 같은 객체인지 확인합니다. |
| assertNotSame(expected, actual) | JUnit 4~ | 예상값과 실제값이 다른 객체인지 확인합니다. |
| assertTrue(condition) | JUnit 4~ | 조건이 참인지 확인합니다. |
| assertFalse(condition) | JUnit 4~ | 조건이 거짓인지 확인합니다. |
| assertAll(Executable... executables) | JUnit 5 | 모든 단언문(assertion)이 성공하는지 확인합니다. |
| assertNotEquals(Object unexpected, Object actual) | JUnit 5 | 예상값과 실제값이 동일하지 않은지 확인합니다. |
JUnit 라이프 사이클 수행과정
[@BeforeAll] JUnit 클래스가 수행되면 최초 한번 @BeforeAll 어노테이션을 선언한 메서드가 실행이 됩니다.
[@BeforeEach] @Test을 찾았다면 테스트 실행 전 `@BeforeEach을 선언한 메서드가 실행됩니다.
[@Test] @Test를 선언한 메서드가 실행됩니다.
[@AfterEach] @Test 실행을 마치면 @AfterEach를 선언한 메서드가 실행됩니다.
@Test 를 선언한 메서드가 있는지 찾으며 존재하면 (2. 과정)을 반복수행하며, 존재하지 않는 경우 (6. 과정)을 수행합니다.
[@AfterAll] 실행할 @Test가 존재하지 않는다면 @AfterAll을 선언한 메서드를 수행합니다.
테스트를 종료합니다.