Learning
토픽 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