메타모픽 테스트(metamorphic testing)는 기존 테스트 케이스와 메타모픽 관계를 바탕으로 새 테스트 케이스를 만드는 테스트 케이스 설계 기법이다. 메타모픽 관계(metamorphic relation)는 테스트 항목의 요구 동작에 따라, 테스트 케이스의 입력을 바꾸면 기대 결과가 어떻게 바뀌는지를 기술한 것이다.[1][2] ISO/IEC/IEEE 29119-4:2021은 메타모픽 테스트를 명세 기반 테스트 케이스 설계 기법으로 정의한다.[1]
ISTQB 용어집은 메타모픽 테스트를 메타모픽 관계를 테스트 조건으로 삼는 테스트 기법으로 정의한다.[3]
원본 테스트 케이스와 후속 테스트 케이스
ISTQB CTAL-TA(Certified Tester Advanced Level Test Analyst) 강의계획서에 따르면 메타모픽 테스트는 기존 테스트 케이스를 메타모픽 관계에 따라 바꿔 새 테스트 케이스를 하나 이상 만든다. 이때 바꾸기 전의 테스트 케이스를 원본 테스트 케이스(source test case), 바꿔 만든 테스트 케이스를 후속 테스트 케이스(follow-up test case)라 부른다. 한 메타모픽 관계의 원본 테스트 케이스와 후속 테스트 케이스는 테스트 절차 하나로 묶어 결과를 함께 판정하며, 관계를 만족하면 pass, 아니면 fail이다. fail이면 이어지는 디버깅에서 어느 테스트 케이스가 실패했는지 가려야 한다.[2]
수열의 평균을 구하는 함수를 예로 들면, 수의 순서를 어떻게 바꿔도 평균이 같다는 메타모픽 관계로 같은 수를 다른 순서로 넣은 후속 테스트 케이스를 여럿 만들 수 있다. 기대 결과는 그대로다. 모든 수에 같은 수 를 곱하면 기대 결과도 배가 된다는 관계를 쓰면, 를 달리 골라 후속 테스트 케이스를 얼마든지 만들 수 있다. 메타모픽 관계 둘 이상을 합쳐 후속 테스트 케이스를 만들 수도 있다. 예를 들어 순서를 바꾸고 2를 곱한다.[2]
오라클 문제와 커버리지
메타모픽 테스트는 테스트 오라클 문제가 있을 때도 쓸 수 있다. 이때는 원본 테스트 케이스와 후속 테스트 케이스의 기대 결과가 없어 결과를 하나하나 판정할 수 없다. 지금은 쓸 만한 종료 기준을 주는 인정된 커버리지 척도가 없다. 메타모픽 관계마다 한 번씩 덮는 것으로는 기대 결과를 일부만 검증하므로 모자라다.[2]
무작위 테스트와의 결합
메타모픽 테스트를 무작위 테스트와 결합하면 한 메타모픽 관계에서 낮은 수준의 원본 테스트 케이스와 후속 테스트 케이스를 많이 만들 수 있다. 예를 들어 평균 계산에서 난수 생성기로 원본 테스트 케이스의 여러 입력과 후속 테스트 케이스의 무작위 순서 바꾸기와 곱하는 수를 만든다.[2]