변이 테스트

Mutation testing

코드를 일부러 바꾸고 기존 테스트가 그 오류를 잡는지 확인합니다.

···
html
<div class="stage"><div class="title">MUTATION TEST</div><div class="canvas"><div class="code mono">age <b id="operator">≥</b> 18</div><div class="checks"><span id="check17">17: FAIL</span><span id="check18">18: PASS</span><span id="check19">19: PASS</span></div><div class="verdict" id="verdict">original passes</div></div></div>
css
.stage{width:min(94vw,820px);height:min(88vh,330px);box-sizing:border-box;padding:clamp(9px,2.4vmin,18px);border:1px solid var(--line);border-radius:13px;background:var(--surface);display:flex;flex-direction:column;gap:clamp(7px,2vmin,14px);font:600 clamp(12px,2.5vmin,16px)/1.28 "Pretendard Variable",Pretendard,-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo",sans-serif;color:var(--fg);overflow:hidden}.title{color:var(--accent);letter-spacing:.035em;flex:none}.canvas{position:relative;flex:1;min-height:0;display:flex;align-items:center;justify-content:center}.muted{color:var(--muted)}.mono{font-family:ui-monospace,SFMono-Regular,monospace}.box{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(5px,1.4vmin,12px);text-align:center}.active{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 12%,var(--surface))!important}.canvas{flex-direction:column;gap:clamp(10px,3vmin,24px)}.code{font-size:clamp(18px,5vmin,30px);border:1px solid var(--line);padding:8px 18px;border-radius:8px}.code b{color:var(--accent)}.checks{display:flex;gap:5px;flex-wrap:wrap;justify-content:center}.checks span{border:1px solid var(--line);padding:5px;border-radius:5px}.checks .caught{border-color:var(--accent-3);color:var(--accent-3)}.verdict{color:var(--accent)}
js
let mutated=false;function flip(){mutated=!mutated;document.getElementById('operator').textContent=mutated?'>':'≥';document.getElementById('check18').textContent=mutated?'18: FAIL':'18: PASS';document.getElementById('check18').classList.toggle('caught',mutated);document.getElementById('verdict').textContent=mutated?'mutant killed by age 18':'original passes'}flip();setInterval(flip,1500)

변이 테스트는 비교 연산자 변경처럼 작은 코드 변이를 만들고 테스트를 다시 실행합니다. 테스트가 실패하면 변이를 잡은 것이고, 통과하면 놓친 동작이 있을 수 있습니다.

데모는 ≥가 >로 바뀌자 경계 입력 테스트가 변이를 잡는 과정을 보여줍니다. 생존한 변이가 모두 실제 결함은 아니므로 동등 변이와 의미 있는 누락을 구분합니다.

언제 쓰나

테스트 개수보다 테스트가 실제 오류를 잡는 힘을 평가할 때 사용합니다.

페이지로 열기 ↗