**변이 테스트(mutation testing)**는 코드에 작은 버그("변이체, mutant")를 의도적으로 도입하고 테스트가 그것을 잡아내는지 확인하여 테스트 스위트의 품질을 평가합니다. 테스트가 실제로 결함을 감지하는 데 얼마나 좋은지 측정합니다 — 실행만 측정하는 커버리지를 넘어섭니다.
변이 테스트의 동작 방식
1. 도구가 코드에 작은 변경(변이)을 만듦, 예:
→ + 를 - 로, > 를 >= 로, true 를 false 로, 구문 제거, 상수 변경
→ 각 변이 = 의도적인 "버그" (코드의 변이체 버전)
2. 각 변이체에 대해 테스트 스위트 실행:
→ 테스트 실패 → 변이체가 "죽음(killed)" (좋음 — 테스트가 버그 포착) ✓
→ 테스트 통과 → 변이체가 "생존(survived)" (나쁨 — 테스트가 버그를 못 잡음) ✗
3. 변이 점수 = 죽은 변이체 % → 테스트가 버그를 얼마나 잘 잡는지 측정
커버리지보다 나은 이유
커버리지 → 코드가 실행되었는지 측정 (동작이 검증되었는지 아님) → 약한 테스트로도
높을 수 있음 (실제 어서션 없음)
변이 테스트 → 테스트가 실제로 버그(동작 변화)를 감지하는지 측정:
→ 생존한 변이체는 틈새를 드러냄 — 테스트가 그 코드를 실행하지만 잘 검증하지 않음
(약한/누락된 어서션, 테스트 안 된 동작)
→ 커버리지보다 훨씬 강력한 테스트 품질 신호.
