Search

240610_0950_뮤테이션 테스트(Mutation Testing)

뮤테이션 테스트(Mutation Testing)는 소프트웨어 테스트의 한 유형으로, 프로그램 코드의 작은 부분을 의도적으로 변경하여(이를 '뮤턴트'라고 부름) 기존 테스트 케이스가 이러한 변경된 코드에서 오류를 탐지할 수 있는지 확인하는 기법
이 방법은 테스트 케이스의 효과성을 평가하고, 테스트의 강도를 높이는 데 목적이 있다.

주요 개념

1.
뮤턴트(Mutant): 원본 프로그램 코드의 작은 부분(일반적으로 한 줄)을 변경하여 생성된 코드이다. 예를 들어, 조건문에서 ==!=로 변경하거나, 산술 연산자 +로 바꾸는 등의 변형을 가한다.
2.
살아남은 뮤턴트(Live Mutant): 변경된 코드(뮤턴트)가 기존 테스트 케이스에 의해 검출되지 않고 통과하는 경우를 말한다. 이는 테스트 케이스가 충분히 강력하지 않음을 의미한다.
3.
죽은 뮤턴트(Dead Mutant): 변경된 코드(뮤턴트)가 기존 테스트 케이스에 의해 검출되어 실패하는 경우를 말한다. 이는 테스트 케이스가 해당 변경을 잘 탐지함을 의미한다.

과정

1.
원본 프로그램 실행: 기존의 프로그램을 실행하여 테스트 케이스가 모두 통과하는지 확인한다.
2.
뮤턴트 생성: 다양한 변이 연산자를 사용하여 원본 프로그램의 뮤턴트를 생성한다. 이 변이는 주로 조건문, 루프, 연산자 등을 대상으로 한다.
3.
뮤턴트 실행: 각 뮤턴트를 실행하여 기존의 테스트 케이스가 뮤턴트를 검출할 수 있는지 확인한다.
4.
결과 분석:
만약 테스트 케이스가 뮤턴트를 검출하면, 이는 테스트 케이스가 그 변이를 효과적으로 잡아낸 것이므로 뮤턴트는 죽은 것으로 간주한다.
테스트 케이스가 뮤턴트를 검출하지 못하면, 이는 테스트 케이스가 그 변이에 대해 취약한 것으로 간주하며 뮤턴트는 살아남은 것으로 간주한다.

목적과 장점

테스트 케이스의 강도 평가: 뮤테이션 테스트는 테스트 케이스의 결함 검출 능력을 평가한다. 살아남은 뮤턴트가 많을수록 테스트 케이스의 강도가 낮음을 의미한다.
테스트 케이스 개선: 살아남은 뮤턴트를 기반으로 테스트 케이스를 강화하여 결함 검출 능력을 향상시킬 수 있다.
코드 품질 향상: 뮤테이션 테스트를 통해 코드의 잠재적 결함을 보다 효과적으로 탐지하고 제거할 수 있다.

단점과 한계

비용: 뮤턴트를 많이 생성하고 실행해야 하므로 계산 비용이 많이 들고 시간이 많이 소요된다.
적용성: 모든 유형의 소프트웨어에 대해 적용하기 어려울 수 있으며, 특히 대규모 시스템에서는 현실적으로 어려울 수 있다.
뮤턴트의 적합성: 일부 뮤턴트는 비현실적이거나 실제로 발생하지 않는 경우가 있어 의미 없는 결과를 초래할 수 있다.
뮤테이션 테스트는 이러한 장점과 단점을 고려하여 신중하게 사용해야 하며, 주로 테스트의 질을 높이고자 하는 상황에서 유용하게 사용될 수 있다.

Node.js로 예시

뮤테이션 테스트를 Node.js 코드에서 사용하는 예시를 살펴보자.

원본 코드 (sum.js)

function sum(a, b) { return a + b; } module.exports = sum;
JavaScript
복사

테스트 코드 (sum.test.js)

const sum = require('./sum'); test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); }); test('adds -1 + -1 to equal -2', () => { expect(sum(-1, -1)).toBe(-2); });
JavaScript
복사

뮤테이션 적용 예시

원본 코드의 + 연산자를 - 연산자로 변경하여 뮤턴트를 생성할 수 있다.
function sum(a, b) { return a - b; // 뮤턴트 } module.exports = sum;
JavaScript
복사

뮤턴트 테스트 실행

기존 테스트 케이스가 이 뮤턴트를 잡아낼 수 있는지 실행하여 확인한다.
npm test
Shell
복사
테스트 결과, adds 1 + 2 to equal 3 테스트 케이스가 실패하면, 이 뮤턴트는 죽은 것으로 간주된다. 그렇지 않으면 살아남은 것으로 간주된다. 이러한 과정은 테스트 케이스의 강도를 평가하고, 개선하는 데 사용된다.

안녕하세요

한국전자기술연구원 김영광입니다.
관련 기술 문의와 R&D 공동 연구 사업 관련 문의는 “glory@keti.re.kr”로 연락 부탁드립니다.

Hello

I'm Yeonggwang Kim from the Korea Electronics Research Institute.
For technical and business inquiries, please contact me at “glory@keti.re.kr”