전체 목록
테스트Hard#254

Mutation Testing은 일반 커버리지와 무엇이 다른가요?

#테스트#MutationTesting#Coverage#품질

답변 포인트

테스트가 버그를 잡는 힘을 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.

정답 및 해설

빠른 요약

Mutation Testing은 코드를 일부러 변형했을 때 테스트가 실패하는지 확인합니다. 코드 실행 여부보다 assertion의 실제 검증력을 평가할 수 있습니다.

Mutation Testing은 코드를 일부러 변형했을 때 테스트가 실패하는지 확인합니다. 코드 실행 여부보다 assertion의 실제 검증력을 평가할 수 있습니다.

핵심 개념

핵심 기준은 테스트가 버그를 잡는 힘입니다.

일반 커버리지는 코드가 실행됐는지만 보여줍니다. Mutation Testing은 비교 연산자나 반환값을 작은 버그처럼 바꿔 테스트가 실패하는지 확인합니다. mutant가 살아남으면 해당 코드는 실행됐지만 assertion이 충분히 강하지 않다는 신호입니다.

동작 흐름

  1. 검증하려는 위험을 먼저 정의합니다.
  2. 입력 데이터, 실행 조건, 기대 결과를 명확히 둡니다.
  3. 자동화 비용과 실행 빈도에 맞게 테스트 범위를 조정합니다.
  4. 실패 시 로그와 지표로 원인을 추적할 수 있게 만듭니다.

실제 예시

TypeScript
function isAdult(age: number) { return age >= 19; }

test('19세는 성인이다', () => {
  expect(isAdult(19)).toBe(true);
});
// mutant: >= 를 > 로 바꾸면 테스트가 실패해야 합니다.

예시는 핵심 흐름을 단순화한 것입니다. 실무에서는 팀의 배포 방식, 데이터 크기, 장애 영향도, 유지보수 비용까지 함께 고려해야 합니다.

실무에서 주의할 점

  • 구현 세부사항에 과하게 묶인 테스트는 리팩터링 때 쉽게 깨집니다.
  • 느리고 불안정한 테스트를 방치하면 팀이 테스트 결과를 믿지 않게 됩니다.
  • 커버리지 숫자보다 중요한 시나리오와 경계값을 검증하는지가 더 중요합니다.

함께 연결해서 보면 좋은 키워드

MutationTesting, Coverage, Assertion, TestQuality

정리

한 줄로 정리하면, Mutation Testing은 코드를 일부러 변형했을 때 테스트가 실패하는지 확인합니다. 코드 실행 여부보다 assertion의 실제 검증력을 평가할 수 있습니다. 개념의 정의뿐 아니라 적용 조건과 실패했을 때의 증상까지 함께 이해하는 것이 중요합니다.

관련 질문

같은 카테고리/태그 기준