본문 바로가기

ComputerScience/Java

[Java] JUnit5

JUnit

JUnit은 자바 언어에서 사용되는 대표적인 테스트 프레임워크로서 단위 테스트를 위한 도구를 제공합니다.

또한 단위 테스트뿐만 아니라 통합 테스트를 할 수 있는 기능도 제공합니다.

JUnit의 가장 큰 특징은 어노테이션 기반의 테스트 방식을 지원한다는 것입니다.

또한 JUnit을 활용하면 assert문을 통해 테스트 케이스의 기댓값이 정상적으로 돌출됐는지 검토할 수 있다는 장점이 있습니다.

JUnit의 세부 모듈

JUnit Platform

JUnit Platform은 JVM에서 테스트를 시작하기 위한 뼈대 역할을 합니다.

테스트를 발견하고 테스트 계획을 생성하는 테스트 엔진(TestEngine)의 인터페이스를 가지고 있습니다. 테스트 엔진은 테스트를 발견하고 테스트를 수행하며, 그 결과를 보고하는 역할을 수행합니다. 또한 각종 IDE와의 연동을 보조하는 역할을 수행합니다.(IDE 콘솔 출력 등). Platform에는 TestEngine API, Console Launcher, JUnit 4 Based Runner 등이 포함돼 있습니다.

 

JUnit Jupiter

테스트 엔진 API의 구현체를 포함하고 있으며, JUnit 5에서 제공하는 Jupiter 기반의 테스트를 실행하기 위한 테스트 엔진을 가지고 있습니다. 테스트의 실제 구현체는 별도 모듈의 역할을 수행하는데, 그중 하나가 Jupiter Engine입니다. Jupiter Engine은 Jupiter API를 활용해서 작성한 테스트 코드를 발견하고 실행하는 역할을 수행합니다. 

 

JUnit Vintage

JUnit 3, 4에 대한 테스트 엔진 API를 구현하고 있습니다. 기존에 작성된 JUnit 3, 4버전의 테스트 코드를 실행할 때 사용되며 Vintage Engine을 포함하고 있습니다.

 

이러한 JUnit은 하나의 Platform 모듈을 기반으로 Jupiter와 Vintage 모듈이 구현체의 역할을 수행합니다.

이미지 출처: https://goodgid.github.io/Junit5-Intro-Structure/#google_vignette

JUnit의 생명주기

  • @Test: 테스트 코드를 포함한 메서드를 정의합니다.
  • @BeforeAll: 테스트를 시작하기 전에 호출되는 메서드를 정의합니다.
  • @BeforeEach: 각 테스트 메서드가 실행되기 전에 동작하는 메서드를 정의합니다.
  • @AfterAll: 테스트를 종료하면서 호출되는 메서드를 정의합니다.
  • @AfterEach: 각 테스트 메서드가 종료되면서 호출되는 메서드를 정의합니다.
@SpringBootTest
public class MyServiceTest {

    @Autowired
    private MyService myService;

    @BeforeAll
    public static void beforeAll() {
        System.out.println("BeforeAll is called (only once before all tests in class)");
    }

    @BeforeEach
    public void beforeEach() {
        System.out.println("BeforeEach is called (before each test)");
    }

    @Test
    public void testMyService() {
        System.out.println("Test is running...");
        // Perform your test logic here
        String result = myService.doSomething();
        // assert result
    }

    @AfterEach
    public void afterEach() {
        System.out.println("AfterEach is called (after each test)");
    }

    @AfterAll
    public static void afterAll() {
        System.out.println("AfterAll is called (only once after all tests in class)");
    }
}
BeforeAll is called (only once before all tests in class)
BeforeEach is called (before each test)
Test is running...
// Your test logic and assertions
AfterEach is called (after each test)
// (Repeat for another test)
BeforeEach is called (before each test)
Test is running...
// Your test logic and assertions
AfterEach is called (after each test)
AfterAll is called (only once after all tests in class)

@BeforeAll과 @AfterAll 어노테이션이 지정된 메서드는 전체 테스트 동작에서 처음과 마지막에는 각각 수행됩니다. 

@BeforeEach와 @AfterEach 어노테이션이 지정된 메서드는 각 테스트가 실행될 때 @Test 어노테이션이 지정된 테스트 메서드를 기준으로 실행되는 것을 볼 수 있습니다. 

@Disabled 

이 어노테이션은 JUnit 테스트에서 특정 테스트를 비활성화하고 싶을 때 사용합니다. @Disabled를 사용하면 해당 테스트 메서드는 테스트 실행 시 건너뜁니다. 이를 통해 일시적으로 테스트를 중단하거나, 아직 구현되지 않은 기능에 대한 테스트를 제외할 수 있습니다.

@DisplayName

이 어노테이션은 테스트 클래스나 테스트 메서드에 대한 사용자 친화적인 이름을 지정할 수 있습니다. @DisplayName을 이용하면 테스트 결과를 보다 쉽게 이해할 수 있게 됩니다. 이 이름은 테스트 결과 보고서에 사용되며, IDE에서도 확인이 가능합니다.

@DisplayName("User Management Tests")
public class UserManagementTest {

    @Test
    @DisplayName("Test Create User")
    public void testCreateUser() {
        // ... your test logic
    }

    @Test
    @DisplayName("Test Update User")
    public void testUpdateUser() {
        // ... your test logic
    }
}
Test Create User - PASSED (assuming the test passes)
Test Update User - PASSED (assuming the test passes)

참고 자료

  • 스프링 부트 핵심 가이드 "스프링 부트를 활용한 애플리케이션 개발 실무" , 장정우, 2022