[Java] Spring Boot JUnit5 이해하기 : 이론 및 구조

wony·2024년 12월 1일

Java

목록 보기
28/30
  • 항상 Build.gradle에 설치하는 것 이외에는 잘 알아보지 않았다.
  • SpringBoot 환경에서 JUnit에 대해 이해하고 환경을 구성하는 방법에 대해 알아보자!

1) JUnit5

  • Java 언어에서 독립된 단위 테스트를 지원해 주는 프레임워크를 의미합니다.
  • JUnit 5의 경우 'Java8 이상 버전'부터 지원을 하며 JUnit Platform, Jupiter, Vintage 모듈이 결합된 형태를 가지고 있습니다.
  • 단위 테스트(Unit Test)
    • 소프트웨어 개발에서 개별적인 코드 단위를 테스트하는 것을 의미합니다.
    • 코드의 작은 부분을 격리시켜 독립적으로 테스트함으로써 코드의 정확성과 신뢰성을 검증
    • 코드 변경 시 기존 기능에 영향을 주지 않고 코드의 동작을 확인하는데 유용합니다.
  • 단위 테스트의 범위
    • 클래스, 메서드, 함수와 같은 작은 단위의 코드를 격리시켜 독립적으로 테스트
    • 따라서 컨트롤러단이나 서비스단과 같은 구성 요소는 각각 개별적인 단위로 테스트될 수 있습니다.

2) JUnit5 구성요소

  • JUnit5 구성요소
    • JUnit5에서는 Platform, TestEngine Interface, TestEngine, Jupiter, Vintage으로 구성이 되어 있습니다.

1) JUnit Platform

  • 💡 JUnit Platform
    • JUnit 테스트를 실행하는 데 사용되는 실행 환경을 의미합니다.
    • TestEngine Interface를 통하여 다른 TestEngine 구현체들과 상호작용하여 테스트를 실행하고 테스트 결과를 보고하는 역할을 수행하는 Test FrameWork입니다.
  • Test Framework와 TestEngine의 차이는?
    • 테스트 프레임워크는 테스트를 작성하고 실행하기 위한 구조와 규칙을 제공하며 TestEngine은 테스트를 실행하는 엔진으로 테스트를 실제 실행하고 결과를 반환하는 역할을 담당합니다.

2) TestEngine Interface

  • JUnit Platform에서 테스트를 실행하고 결과를 보고하는 데 사용이 되는 인터페이스로 TestEngine에 대한 메서드와 속성을 정의하는 데 사용이 됩니다.

  • TestEngine Interface를 기반으로 TestEngine의 구현체를 구성합니다. 이를 통해 사용자 정의 TestEngine을 만들 수 있습니다.

  • TestEngine Interface의 주요 메서드

메서드리턴 타입설명
discover()void- 테스트를 발견하고 고유한 ID를 부여하는 메서드입니다.
execute()void- 테스트를 실행하는 메서드입니다.
getId()String- 테스트 엔진의 고유 식별자를 반환하는 메서드입니다.
getGroupId()String- 테스트 엔진의 그룹 식별자를 반환하는 메서드입니다.
getVersion()String- 테스트 엔진의 버전을 반환하는 메서드입니다.

3. TestEngine

  • TestEngine Interface의 구현체로 테스트를 실행하는 데 사용이 됩니다.
  • 각각 TestEngine은 특정한 테스트 프레임워크 또는 런처와 통합되어 동작하며, 테스트 수명주기 관리, 테스트 실행, 결과 보고 등의 기능을 제공합니다.

4. JUnit Jupiter

  • JUnit5에서 제공되는 새로운 프레임워크를 의미하여 테스트 작성과 실행을 위한 기능을 어노테이션으로 제공하며 JUnit4 보다 강력하고 유연한 테스트 코드를 작성하도록 제공해줍니다.

  • 주요 어노테이션

어노테이션설명
@Test테스트 메서드를 정의하는 데 사용되는 어노테이션입니다. 이 어노테이션이 지정된 메서드는 JUnit Jupiter에서 테스트로 실행됩니다.
@ParameterizedTest매개변수화된 테스트를 정의하는 데 사용되는 어노테이션입니다. 이 어노테이션이 지정된 메서드는 여러 매개변수를 사용하여 반복적으로 실행됩니다.
@BeforeEach각각의 테스트 메서드가 실행되기 전에 실행되는 코드를 정의하는 데 사용되는 어노테이션입니다.
@AfterEach각각의 테스트 메서드가 실행된 후에 실행되는 코드를 정의하는 데 사용되는 어노테이션입니다.

5. JUnit Vintage

  • JUnit 3,4의 TestEngine을 JUnit5 플랫폼에서 사용할 수 있도록 제공을 합니다.
    • JUnit 5 플랫폼을 사용하여 JUnit 4 테스트를 실행할 수 있으며, JUnit 5의 다양한 기능과 호환성을 유지할 수 있습니다.

6. 구성 요소 별 전반적인 흐름

    1. 사용자는 IDE Tool을 이용하여 테스트 코드를 실행합니다.
    1. 테스트 코드는 JUnit Platform 내에서 수행이 됩니다.
    1. 테스트 코드를 구성하는 메서드나 어노테이션에 대해서는 TestEngine Interface를 이용하여 호출하여 구성합니다.
    1. TestEngine Interface의 실제 구현되는 구현체는 Junit Jupiter, Junit Vintage, Custom Engine을 기반으로 구현이 됩니다.

3) Junit5 주요 어노테이션 & 메서드

1. Junit 5 어노테이션

어노테이션설명
@Test테스트 메소드임을 나타내는 어노테이션
@ParameterizedTest매개변수화된 테스트를 위한 어노테이션
@DisplayName테스트의 표시 이름을 설정하는 어노테이션
@BeforeEach각 테스트 메소드 실행 전에 실행되는 메소드를 정의하는 어노테이션
@AfterEach각 테스트 메소드 실행 후에 실행되는 메소드를 정의하는 어노테이션
@BeforeAll모든 테스트 메소드 실행 전에 실행되는 메소드를 정의하는 어노테이션
@AfterAll모든 테스트 메소드 실행 후에 실행되는 메소드를 정의하는 어노테이션
@Nested중첩된 테스트 클래스를 정의하는 어노테이션
@Tag테스트를 그룹화하기 위한 태그를 지정하는 어노테이션
@Disabled비활성화된 테스트를 나타내는 어노테이션
@Timeout테스트의 제한 시간을 설정하는 어노테이션
@ExtendWith커스텀 확장을 적용하는 어노테이션
@RegisterExtension커스텀 확장을 등록하는 어노테이션
@TempDir테스트용 임시 디렉터리를 생성하는 어노테이션

2. JUnit 5 Assertions 주요 메서드

  • 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예상값과 실제값이 동일하지 않은지 확인합니다.

4) JUnit 라이프 사이클

JUnit 라이프 사이클 수행과정

  • 기본적으로 위에서 아래로 @Test를 선언한 순서에 따라 수행이 됩니다.
  1. [@BeforeAll] JUnit 클래스가 수행되면 최초 한번 @BeforeAll 어노테이션을 선언한 메서드가 실행이 됩니다.

  2. [@BeforeEach] @Test을 찾았다면 테스트 실행 전 `@BeforeEach을 선언한 메서드가 실행됩니다.

  3. [@Test] @Test를 선언한 메서드가 실행됩니다.

  4. [@AfterEach] @Test 실행을 마치면 @AfterEach를 선언한 메서드가 실행됩니다.

  5. @Test 를 선언한 메서드가 있는지 찾으며 존재하면 (2. 과정)을 반복수행하며, 존재하지 않는 경우 (6. 과정)을 수행합니다.

  6. [@AfterAll] 실행할 @Test가 존재하지 않는다면 @AfterAll을 선언한 메서드를 수행합니다.

  7. 테스트를 종료합니다.

profile
안녕하세요. wony입니다.

0개의 댓글