반응형
🌱 단위 테스트(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 |