토픽 115 / 192·소프트웨어 표준과 법제도
Mutation Testing (돌연변이 테스트)
Mutation Testing (돌연변이 테스트)
원본 코드에 의도적으로 작은 변경(Mutation, 돌연변이)을 가해 변형된 코드(Mutant)를 생성하고, 기존 테스트가 이 변형을 탐지(Kill)하는지 확인하여 테스트 스위트의 품질과 강도를 평가하는 테스트 기법
목적: 테스트 품질 평가, 테스트 커버리지 한계 극복, 테스트 강도 측정, 누락된 테스트 발견
특징: 코드 변형, Mutant 생성, Kill/Survive 판정, Mutation Score, 커버리지 보완
Mutation Operator(돌연변이 연산자)
- •산술 연산자: + → -, * → /, a + b → a - b
- •관계 연산자: == → !=, < → <=, > → <
- •논리 연산자: && → ||, ! 제거
- •상수 변경: 0 → 1, true → false
- •반환값 변경: return x → return 0
- •조건 제거: if(cond) → if(true)
핵심 개념
- •Mutant: 변형된 코드 버전
- •Killed Mutant: 테스트가 실패하여 탐지됨 (좋음)
- •Survived Mutant: 테스트가 통과하여 미탐지 (나쁨, 테스트 부족)
- •Equivalent Mutant: 동작이 동일한 변형 (탐지 불가, 노이즈)
Mutation Score: Killed Mutants / Total Mutants × 100%
도구: PIT(Java), Stryker(JavaScript/TypeScript), mutmut(Python), Mull(C/C++)
장점: 테스트 품질 정량화, 누락 테스트 발견, 코드 커버리지 보완, 높은 신뢰도
단점: 실행 시간 매우 김(Mutant 수 많음), Equivalent Mutant 노이즈, 리소스 집약적
적용사례: 핵심 비즈니스 로직, 안전 중요 시스템, 테스트 품질 평가, CI/CD (선별적)
비교: Mutation Testing(테스트 품질 평가) vs Code Coverage(코드 실행 비율) vs Property-Based(입력 다양화)
연관: 테스트 커버리지, PIT, 테스트 품질, 코드 커버리지 한계, CI/CD