테스트 코드의 품질은 단순히 테스트의 통과 여부가 아니라, 어떤 신호를 얼마만큼의 소음 없이 제공하는가로 측정할 수 있습니다.
이번 글에서는 좋은 테스트 코드가 갖춰야 할 네 가지 핵심 특성과, 이들 사이의 균형에 대해 정리해보겠습니다.
1. 회귀 방지 (Regression Resistance)
회귀 방지란, 코드 변경 이후에도 기존 기능이 정상 동작하는지를 자동으로 검증해주는 능력입니다.
테스트가 코드를 더 많이 실행할수록, 버그를 발견할 확률도 높아집니다.
즉, 테스트는 코드를 많이 덮을수록 회귀 방지 능력이 강해집니다. 특히 기능이 누락되거나 잘못 구현된 경우 이를 즉시 알려주기 때문에, 변경에 대한 신뢰의 안전망 역할을 합니다.
2. 리팩터링 내성 (Refactoring Resistance)
리팩터링 내성이란, 코드 내부를 수정해도 테스트가 거짓 실패(False Positive)를 발생시키지 않고, 그대로 통과하는 성질을 말합니다.
리팩터링 내성은 테스트가 구현 세부사항이 아니라, 외부 관찰 가능한 결과를 검증할 때 확보할 수 있습니다.
이 특성이 없다면, 개발자는 테스트를 신뢰하지 않게 되고 리팩터링이나 유지보수에 소극적으로 변하게 됩니다.
3. 거짓 양성(False Positive)이란?
거짓 양성은 테스트가 실패를 보고하지만, 실제 시스템은 정상 동작하고 있는 경우를 말합니다.
거짓 양성의 문제점
- 개발자가 테스트 실패에 무감각해지고 무시하게 됨
- 테스트에 대한 신뢰가 떨어짐
- 실제로 발생한 버그도 놓칠 위험이 높아짐
이러한 거짓 양성은 대부분 테스트가 시스템 내부 구현과 과도하게 결합되어 있을 때 발생합니다. 테스트는 구현의 중간 과정을 확인하기보다는, 최종 결과(출력, 상태 변화 등)를 검증하는 것이 좋습니다.
4. 빠른 피드백 (Fast Feedback)
테스트는 빠르게 실행되어야 합니다.
빠를수록 개발자가 코드 변경 후 즉시 결과를 확인하고, 문제를 빠르게 대응할 수 있기 때문입니다.
단위 테스트가 E2E 테스트보다 더 선호되는 이유 중 하나도 바로 이 빠른 피드백 루프 덕분입니다.
5. 유지보수성 (Maintainability)
테스트의 유지보수성은 두 가지 요소로 나뉩니다.
- 이해 난이도: 테스트가 작고 명확할수록 이해하기 쉽습니다.
- 운영 난이도: 외부 시스템(DB, 네트워크 등)에 의존하지 않을수록 쉽게 실행할 수 있습니다.
6. 테스트의 네 가지 특성 요약
특성 의미
| 회귀 방지 | 변경으로부터 기존 기능을 보호 |
| 리팩터링 내성 | 내부 구조 변경에 테스트가 흔들리지 않음 |
| 빠른 피드백 | 개발 주기 내 빠른 실행 결과 |
| 유지보수성 | 읽고, 수정하고, 실행하기 쉬운 구조 |
테스트의 가치(Value)는 이 네 가지 특성의 곱으로 측정할 수 있습니다.
즉, 어느 하나라도 0이면 전체 테스트의 가치도 0이 됩니다.
특성 간의 균형과 절충
이 네 가지 특성 중 처음 세 가지(회귀 방지, 리팩터링 내성, 빠른 피드백)는 상호 배타적입니다.
즉, 세 가지를 모두 완벽하게 충족하는 테스트는 존재하기 어렵습니다.
- 단위 테스트는 빠른 피드백과 리팩터링 내성에 강점을 가지지만 회귀 방지는 약할 수 있습니다.
- E2E 테스트는 회귀 방지는 탁월하지만 실행 속도가 느리고 유지보수가 어렵습니다.
- 통합 테스트는 그 중간 지점에 위치합니다.
이처럼 테스트는 "무엇을 중시할 것인가?"에 따라 설계 전략이 달라집니다.
테스트 설계 원칙
- 작성할 때는 블랙박스(Black-box) 방식: 내부 구현을 보지 않고, 입력과 출력만을 기반으로 테스트합니다.
- 분석할 때는 화이트박스(White-box) 방식: 코드의 실행 흐름을 분석하고, 테스트 커버리지나 로직 분기를 점검합니다.
결론
- 테스트는 정확하고 신뢰할 수 있어야 하며, 잘못된 실패(거짓 양성) 없이 빠르게 결과를 제공해야 합니다.
- 단순히 테스트가 있다는 것이 아니라, "테스트가 얼마나 가치 있는지"가 더 중요합니다.
'기타' 카테고리의 다른 글
| [단위 테스트] 원칙과 패턴 (7장) - 단위테스트를 위한 리팩터링 (0) | 2025.04.18 |
|---|---|
| [단위 테스트] 원칙과 패턴 (6장) - 단위 테스트 스타일 (0) | 2025.04.17 |
| [단위 테스트] 원칙과 패턴 (5장) - 목과 테스트 취약성 (0) | 2025.04.16 |
| [단위 테스트] 원칙과 패턴 (3장) - 단위 테스트 작성 원칙 (0) | 2025.04.15 |
| [단위 테스트] 원칙과 패턴 (1장 , 2장) - 목표 및 정의 (0) | 2025.04.14 |
