Spring
Spring Day 18 : 단위 테스트 (Unit Tests)
우 석
2024. 2. 19. 20:33
단위 테스트
단위 테스트는 소프트웨어의 작은 코드 조각을 검증하고, 격리된 환경에서 자동화된 테스트를 수행하는 방법입니다. 주요 목표는 소프트웨어 구성 요소의 정확성을 보장하고, 버그를 신속하게 발견하여 수정하는 것입니다.
단위 테스트의 중요성
- 지속 가능한 성장: 단위 테스트를 작성하여 코드를 안정적으로 유지하고, 기능을 확장하거나 수정할 때 문제를 식별하고 수정할 수 있습니다.
- 품질 향상: 테스트를 통해 코드 품질을 높이고, 버그를 사전에 발견하여 전체 시스템의 품질을 향상합니다.
단위 테스트 작성 방법
- 작은 코드 조각: 단위 테스트는 작은 코드 조각을 검증합니다.
- 격리된 환경: 테스트 대역(Test Double)을 사용하여 의존성을 격리하고, 테스트 대상을 집중적으로 테스트합니다.
- 테스트 대역: 테스트 대상에서 외부 의존성을 대체하는 방법입니다. (예: 목(Mock), 스텁(Stub), 페이크(Fake))
정리
- 단위 테스트는 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지를 검사하는 테스트 기법입니다.
- 단위 테스트는 빠르게 작성할 수 있고 문제 발생 시 어느 부분이 잘 못 되었는지를 빠르고 정확하게 확인할 수 있다는 장점이 있습니다.
- 즉, 단위 테스트를 작성하면 코드의 안정성과 품질을 향상시킬 수 있습니다.
JUnit5
1. Before - After
@BeforeEach
- 각각의 테스트 코드가 실행되기 전에 수행되는 메서드를 만들어 줍니다.
@BeforeEach
void setUp() {
System.out.println("각각의 테스트 코드가 실행되기 전에 수행");
}
@AfterEach
- 각각의 테스트 코드가 실행된 후에 수행되는 메서드를 만들어 줍니다.
@AfterEach
void tearDown() {
System.out.println("각각의 테스트 코드가 실행된 후에 수행\n");
}
@BeforeAll
- 모든 테스트 코드가 수행되기 전에 최초로 수행되는 메서드를 만들어 줍니다.
- static 메서드로 만들어야합니다.
@BeforeAll
static void beforeAll() {
System.out.println("모든 테스트 코드가 실행되기 전에 초초로 수행\n");
}
@AfterAll
- 모든 테스트 코드가 수행된 후 마지막으로 수행되는 메서드를 만들어 줍니다.
- static 메서드로 만들어야 합니다.
@AfterAll
static void afterAll() {
System.out.println("모든 테스트 코드가 수행된 후 마지막으로 수행");
}
Test 코드
package com.sparta.junit5practice;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class BeforeAfterTest {
@BeforeEach
void setUp() {
System.out.println("각각의 테스트 코드가 실행되기 전에 수행");
}
@AfterEach
void tearDown() {
System.out.println("각각의 테스트 코드가 실행된 후에 수행\n");
}
@BeforeAll
static void beforeAll() {
System.out.println("모든 테스트 코드가 실행되기 전에 최초로 수행\n");
}
@AfterAll
static void afterAll() {
System.out.println("모든 테스트 코드가 수행된 후 마지막으로 수행\n");
}
@Test
void test1() {
System.out.println("테스트 코드 작성 1");
}
@Test
void test2() {
System.out.println("테스트 코드 작성 2");
}
}
실행 결과

2. Given - When - Then
Given-When-Then 패턴은 Test Code 스타일을 표현하는 방식을 뜻합니다.
Given
테스트하고자 하는 대상을 실제로 실행하기 전에 테스트에 필요한 값(상태)을 미리 선언해 둡니다.
When
테스트 하고자하는 대상을 실제로 실행시킵니다.
Then
어떤 특정한 행동(테스트 대상 실행) 때문에 발생할 거라고 예상되는 결과에 대해 예측하고 맞는지 확인합니다.
@Test
@DisplayName("계산기 연산 성공 테스트")
void test1() {
// given
int num1 = 5;
String op = "/";
int num2 = 2;
// when
Double result = calculator.operate(num1, op, num2);
// then
assertNotNull(result);
assertEquals(2.5, result);
}
- assertNotNull() : 파라미터가 null이 아닌지 확인.
- assertEquals() :
- 메서드는 첫 번째 파라미터에 예상값을 넣고 두 번째 파라미터에 테스트 결과값(실제값)을 넣어줍니다.
- 예상값과 실제값이 다르면 테스트가 실패합니다.
- 3번째 파라미터 값에 람다식으로 메시지를 넣어두면 테스트 실패 시 해당 메시지가 출력됩니다.