단위 테스트
프로그램의 가장 작은 단위(메서드, 클래스 등)를 독립적으로 검증하는 테스트 기법입니다.
핵심 특징
- 빠른 실행: 외부 의존성(DB, 네트워크 등) 없이 실행되므로 매우 빠름
- 독립성: 각 테스트가 서로 영향을 주지 않고 독립적으로 수행
- 자동화 용이: CI/CD 파이프라인에 통합하여 코드 변경 시 자동 검증 가능
- 빠른 피드백: 버그를 개발 초기에 발견하여 수정 비용 절감
좋은 단위 테스트의 원칙 (F.I.R.S.T)
| 원칙 | 의미 | 설명 |
|---|---|---|
| Fast | 빠르게 | 수천 개를 수 초 내에 실행 가능해야 함 |
| Independent | 독립적으로 | 테스트 간 순서나 의존 관계 없음 |
| Repeatable | 반복 가능하게 | 어떤 환경에서든 동일한 결과 |
| Self-validating | 자가 검증 | 성공/실패를 자동으로 판단 |
| Timely | 적시에 | 프로덕션 코드 작성 전후에 즉시 작성 |
Java 예시 (JUnit 5 + Mockito)
// 테스트 대상
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
// 단위 테스트
@ExtendWith(MockitoExtension.class)
class CalculatorTest {
private Calculator calculator = new Calculator();
@Test
@DisplayName("두 양수의 덧셈이 정상 동작한다")
void addTwoPositiveNumbers() {
// Given
int a = 3, b = 5;
// When
int result = calculator.add(a, b);
// Then
assertThat(result).isEqualTo(8);
}
}
테스트 종류 비교
| 구분 | 단위 테스트 | 통합 테스트 | E2E 테스트 |
|---|---|---|---|
| 범위 | 메서드/클래스 | 모듈 간 연동 | 전체 시스템 |
| 속도 | 매우 빠름 | 보통 | 느림 |
| 외부 의존성 | 없음 (Mock 사용) | 있음 (DB 등 포함) | 있음 (실제 환경) |
| 비용 | 낮음 | 중간 | 높음 |
| 피드백 속도 | 즉시 | 수 분 | 수십 분 |
테스트 피라미드: 단위 테스트를 가장 많이 작성하고, 위로 갈수록(통합 → E2E) 수를 줄이는 것이 권장됩니다.