변이 테스팅 (mutation testing)
한 줄 정의: 코드에 일부러 작은 결함을 심어 테스트가 그것을 잡아내는지로 테스트의 품질을 평가하는 기법입니다.
쉽게 풀면
테스트가 얼마나 믿을 만한지를 어떻게 확인할까요? 이 기법은 원래 코드에서 부등호를 뒤집거나 연산자를 바꾸는 식으로 작은 변형을 만들어 놓고 테스트를 돌립니다. 테스트가 실패하면 그 변형을 잡아낸 것이고, 그대로 통과하면 그 부분을 사실상 검사하지 않고 있다는 뜻입니다.
왜 중요한가
테스트 커버리지가 높아도 단지 코드를 실행만 하고 결과를 검증하지 않는 허술한 테스트를 걸러낼 수 없다는 한계를 메워 줍니다. 테스트의 존재가 아니라 결함 검출 능력을 직접 재기 때문에 품질 지표로서 훨씬 엄격합니다. 안전이 중요한 소프트웨어 검증 연구에서 오래 연구되어 온 주제입니다.
논문에서는 이렇게 쓰입니다
"변이 테스팅 결과 생존 변이가 다수 확인되어 단정문이 누락된 테스트 케이스를 보강하였다."
일부러 심은 결함을 못 잡아내는 부분이 드러나 검증 문장을 추가했다는 뜻입니다.
조금 더 깊게 보면
산술 연산자 교체, 조건 경계 변경, 반환값 제거 같은 표준 변이 연산자를 적용해 다수의 변이체를 만들고, 테스트가 실패시킨 비율인 변이 점수로 평가합니다. 모든 변이체마다 테스트 전체를 돌려야 해 비용이 크므로, 변경된 코드에만 적용하거나 영향받는 테스트만 선별해 실행하는 최적화가 쓰입니다. 의미가 원본과 완전히 동일해 어떤 테스트로도 구분할 수 없는 등가 변이체를 자동으로 판별하는 것은 일반적으로 결정 불가능한 문제입니다.
주의할 점
테스트 커버리지가 코드의 실행 여부를 재는 지표라면, 변이 테스팅은 테스트가 잘못된 동작을 실제로 구분해 내는지를 잽니다. 변이 점수 100%가 결함이 없다는 뜻은 아니며, 심어 둔 변이 유형 밖의 결함은 여전히 놓칠 수 있습니다.