카테고리 없음

Junit 5의 기본 문법과 구조

0and24 2024. 11. 29. 15:54

출처: https://www.linkedin.com/pulse/junit-5-parameterized-tests-mois%C3%A9s-de-brito-e-silva-vidal/

1️⃣ JUnit이란?

JUnit은 Java의 단위 테스트를 위한 프레임워크입니다.
테스트 코드를 작성하고 실행해서 코드가 제대로 작동하는지 확인하는 도구입니다.

  • 단위 테스트(Unit Test): 코드의 작은 단위(메서드, 클래스 등)를 테스트하는 것
  • JUnit 5는 JUnit Jupiter, JUnit Platform, JUnit Vintage 세 가지 구성 요소로 이루어져 있습니다.

2️⃣ JUnit 테스트 작성하기

기본 테스트 구조

JUnit 테스트는 테스트 메서드를 @Test로 표시하고, 예상 결과를 확인하기 위해 Assertions 클래스를 사용합니다.

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {

    @Test
    void additionTest() {
        int result = 2 + 3; // 테스트할 코드
        assertEquals(5, result); // 결과 확인
    }
}

 

  • @Test: 테스트 메서드를 표시합니다.
  • assertEquals(expected, actual): 기대값과 실제값이 같은지 확인합니다.

3️⃣ JUnit 주요 어노테이션

JUnit에는 다양한 어노테이션이 있습니다. 대표적인 것들을 살펴봅시다.

3.1. 테스트 메서드 어노테이션

  • @Test: 테스트 메서드를 표시합니다.
  • @DisplayName: 테스트의 이름을 지정합니다.
@Test
@DisplayName("2 + 3은 5입니다")
void additionTest() {
    assertEquals(5, 2 + 3);
}

3.2. 테스트 전후 어노테이션

  • @BeforeEach: 각 테스트 전에 실행됩니다. (테스트 준비)
  • @AfterEach: 각 테스트 후에 실행됩니다. (정리 작업)
  • @BeforeAll: 모든 테스트 전에 한 번 실행됩니다. (static 메서드여야 함)
  • @AfterAll: 모든 테스트 후에 한 번 실행됩니다. (static 메서드여야 함)
import org.junit.jupiter.api.*;

class LifeCycleTest {
    @BeforeAll
    static void setupAll() {
        System.out.println("모든 테스트 전에 실행");
    }

    @BeforeEach
    void setupEach() {
        System.out.println("각 테스트 전에 실행");
    }

    @Test
    void test1() {
        System.out.println("테스트 1 실행");
    }

    @Test
    void test2() {
        System.out.println("테스트 2 실행");
    }

    @AfterEach
    void tearDownEach() {
        System.out.println("각 테스트 후에 실행");
    }

    @AfterAll
    static void tearDownAll() {
        System.out.println("모든 테스트 후에 실행");
    }
}

 

출력:

모든 테스트 전에 실행
각 테스트 전에 실행
테스트 1 실행
각 테스트 후에 실행
각 테스트 전에 실행
테스트 2 실행
각 테스트 후에 실행
모든 테스트 후에 실행

4️⃣ Assertions (검증)

Assertions 클래스를 사용해 결과를 검증합니다. 자주 쓰이는 메서드는 아래와 같습니다.

4.1. 기본 검증

  • assertEquals(expected, actual): 기대값과 실제값이 같은지 확인
  • assertNotEquals(expected, actual): 기대값과 실제값이 다른지 확인
  • assertTrue(condition): 조건이 참인지 확인
  • assertFalse(condition): 조건이 거짓인지 확인
  • assertNull(value): 값이 null인지 확인
  • assertNotNull(value): 값이 null이 아닌지 확인
@Test
void basicAssertions() {
    assertEquals(5, 2 + 3); // 기대값: 5, 실제값: 5
    assertNotEquals(5, 2 * 3); // 5 != 6
    assertTrue(3 > 2); // 조건이 참
    assertFalse(3 < 2); // 조건이 거짓
    assertNull(null); // 값이 null
    assertNotNull("JUnit"); // 값이 null이 아님
}

4.2. 예외 검증

  • assertThrows(expectedType, executable): 특정 예외가 발생하는지 확인
@Test
void exceptionTest() {
    assertThrows(ArithmeticException.class, () -> {
        int result = 1 / 0; // 0으로 나눌 때 예외 발생
    });
}

5️⃣ 조건부 테스트 실행

  • @EnabledOnOs(OS.WINDOWS): 특정 운영 체제에서만 실행
  • @Disabled: 테스트를 실행하지 않음
  • assumeTrue(condition): 조건이 참일 때만 테스트 실행
import org.junit.jupiter.api.condition.*;
import static org.junit.jupiter.api.Assumptions.*;

class ConditionalTest {

    @Test
    @EnabledOnOs(OS.WINDOWS)
    void onlyOnWindows() {
        System.out.println("이 테스트는 Windows에서만 실행됩니다.");
    }

    @Test
    void assumptionTest() {
        assumeTrue(2 > 1, "조건이 참이 아니면 건너뜁니다.");
        System.out.println("조건이 참이므로 실행됩니다.");
    }
}

6️⃣ 테스트 모음 만들기

  • 여러 테스트를 그룹으로 실행하려면 @Nested와 @TestMethodOrder를 사용할 수 있습니다.

6.1. @Nested

테스트를 계층적으로 구성합니다.

class NestedTest {

    @Nested
    class MathTests {
        @Test
        void additionTest() {
            assertEquals(5, 2 + 3);
        }
    }

    @Nested
    class StringTests {
        @Test
        void stringContainsTest() {
            assertTrue("JUnit".contains("Unit"));
        }
    }
}

6.2. @TestMethodOrder

테스트 실행 순서를 지정합니다.

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class OrderedTest {

    @Test
    @Order(2)
    void testB() {
        System.out.println("Test B");
    }

    @Test
    @Order(1)
    void testA() {
        System.out.println("Test A");
    }
}

출력:

Test A
Test B

7️⃣ 스프링 테스트

스프링 애플리케이션을 테스트하려면 @SpringBootTest를 사용합니다.

import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;

@SpringBootTest
class SpringTest {

    @Test
    void contextLoads() {
        // 애플리케이션 컨텍스트가 정상적으로 로드되는지 테스트
    }
}

요약

  1. 테스트는 @Test로 시작하고 Assertions로 검증합니다.
  2. 라이프사이클 어노테이션(@BeforeEach, @AfterEach)을 사용해 준비 작업과 정리 작업을 처리합니다.
  3. 예외 상황, 조건부 실행, 스프링 컨텍스트 로드 등 다양한 테스트가 가능합니다.

추가적으로 Junit 5에 관한 글:
https://www.linkedin.com/pulse/junit-5-parameterized-tests-mois%C3%A9s-de-brito-e-silva-vidal/

 

JUnit 5 Parameterized Tests

You already might know how effective JUnit is. But have you ever wanted to run the same test with multiple sets of inputs? In JUnit 5, you can easily do this with Parameterized Tests! For those who don’t know JUnit is a testing framework for creating uni

www.linkedin.com