IT

[SpringBoot] 단위테스트(Unit Test)와 JUnit

data-cloud 2025. 1. 24. 00:31
반응형

 

🌱 단위 테스트(Unit Test)란?

단위 테스트(Unit Test)란 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다.
여기서 모듈은 애플리케이션에서 작동하는 하나의 기능 또는 메서드로 이해할 수 있다. 예를 들어 웹 애플리케이션에서 로그인 메서드에 대한 독립적인 테스트가 1개의 단위 테스트가 될 수 있다. 즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능, 하나의 함수가 올바르게 동작하는지를 독립적으로 테스트하는 것이다.

 

 

 

🌱 단위 테스트(Unit Test)의 장점

  • 새로운 기능 추가 시 수시로 빠르게 테스트할 수 있다.
  • 리팩토링 시에 안정성을 확보할 수 있다.
  • 테스팅에 대한 시간과 비용을 절감할 수 있다.
  • 코드에 대한 문서가 될 수 있다.

 

 

 

🌱 F.I.R.S.T 원칙

F.I.R.S.T 원칙이란 좋은 단위 테스트를 하기 위한 5가지 요소를 뜻한다.

  • Fast
    빠르게 실행되고 빠르게 결과를 알아야 한다. 이를 위해서는 하는 일의 단위가 최대한 작아야 한다. 그러므로 실제 서버나 데이터베이스를 이용하지 않고 가짜 데이터(모의 데이터)를 만들어서 테스트를 진행해야 한다.

  • Independent
    독립적이어야 하고 다른 테스트에 의존하거나 영향을 주어선 안된다.

  • Repeatable
    유닛 테스트는 반복 가능해야 하며, 몇 번을 진행하든 똑같은 결과가 나와야 한다.

  • Self-Validating
    자체 검증 가능해야 한다. 테스트 자체로 통과인지 실패인지 결과가 나와야 하며 이것은 자동적으로 이뤄져야 한다.

  • Thorough / Timely
    유닛 테스트는 철저하고 적절한 때에 작성되어야 한다. 철저하다는 것은 모든 데이터를 검사해야 하므로 최소에서 최대까지 범위를 포함하고 역할에 따라서 바뀌는 데이터 사용자일 때 관리자일 때 모두 테스트가 가능해야 하며 어떤 케이스가 실패(예외나 오류)하는지도 테스트해야 한다.

 

반응형

 

🌱 단위테스트와 JUnit

자바에는 JUnit이라는 단위 테스트를 위한 테스팅 프레임워크가 존재한다.
JUnit을 활용하여 단위테스트를 진행한다면, 테스트 결과를 문서로 남기는 것이 아니라 Test Class 자체를 남기기 때문에 코드에 대한 History를 남길 수 있다는 장점이 있다.

 

 

 

🌱 JUnit 주요 단언(Assertion) 메서드

Assertions 클래스는 assertEquals()를 포함해 아래와 같은 단언 메서드를 제공한다.

  • assertEquals(expected, actual) / assertNotEquals(unexpected, actual)
    실제 값(actual)이 기대하는 값(expected)과 같은지 / 같지 않은지 검사한다.

  • assertSame(Object expected, Object actual) / assertNotSame(Object unexpected, Object actual)
    두 객체가 동일한 / 동일하지 않은 객체인지 검사한다.

  • assertTrue(boolean condition) / assertFalse(boolean condition)
    값이 true / false인지 검사한다.

  • assertNull(Object actual) / assertNotNull(Object actual)
    값이 null인지 / null이 아닌지 검사한다.

  • assertThrows(Class<T> expectedType, Executable executable)
    executable을 실행한 결과로 지정한 타입의 익셉션이 발생하는지 검사한다.

 

 

 

🌱 JUnit 주요 어노테이션

  • @Test
    해당 메서드를 테스트 대상으로 지정한다.

  • @BeforeAll
    모든 테스트 시작 전에 수행되는 로직에 붙는 어노테이션으로 static을 붙여줘야 하며 접근 제어자는 default 이상이어야 한다.

  • @AfterAll
    모든 테스트 종료 후에 수행되는 로직에 붙는 어노테이션으로 static을 붙여줘야 하며 접근 제어자는 default 이상이어야 한다.

  • @BeforeEach
    모든 @Test 어노테이션이 붙은 테스트 대상 메서드 수행 전마다 수행된다.

  • @AfterEach
    모든 @Test 어노테이션이 붙은 테스트 대상 메서드 수행 종료시마다 수행된다.
import org.junit.jupiter.api.*;

public class BasicUnitTest {

    @BeforeAll
    static void beforeAll() {
        System.out.println("## beforeAll() 수행");
    }

    @AfterAll
    static void afterAll() {
        System.out.println("## afterAll() 수행");
    }

    @BeforeEach
    void beforeEach() {
        System.out.println("## beforeEach() 수행");
    }

    @AfterEach
    void afterEach() {
        System.out.println("## afterEach() 수행");
    }

    @Test
    @DisplayName("성공 케이스")
    void success() {
        System.out.println("## success() 수행");
        int sum = 5;
        Assertions.assertEquals(1 + 4, sum);
    }

    @Test
    @DisplayName("실패 케이스")
    void fail() {
        System.out.println("## fail() 수행");
        int sum = 5;
        Assertions.assertEquals(1 + 10, sum);
    }

}

 

 

 

 

 

References.

1. Fomagran - [CS] F.I.R.S.T 원칙이란? (feat.UnitTest)
2. gogh.log - [Spring] JUnit & Mockito 기반 Spring 단위 테스트 코드 작성
3. DEVLOG - JUnit 5 기초 (모듈 구성, Maven·Gradle 의존 추가)
4. 뭉지 - 단위 테스트 코드 작성 (JUnit5)
5. 망나니개발자 - [Java] JUnit을 활용한 Java 단위 테스트 코드 작성법 (2)

 

반응형

'IT' 카테고리의 다른 글

[SpringBoot] 계층별 단위테스트  (1) 2025.01.24
[Spring] @Configuration  (1) 2025.01.24
[SpringBoot] 테스트 개념과 종류  (1) 2025.01.24
[Spring] ORM, JPA, Hibernate, Spring Data JPA 개념  (1) 2025.01.24
[Spring] @Transactional  (1) 2025.01.24