불안정 테스트

Flaky test

코드는 같은데 실행 시점이나 환경에 따라 결과가 바뀌는 테스트입니다.

···
html
<div class="stage"><div class="title">FLAKY TEST</div><div class="canvas"><div class="runs" id="runs"></div><div class="race"><div class="ready" id="ready"></div><div class="assert" id="assert"></div></div><div class="reason" id="reason">assertion ran before ready</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,22px)}.runs{display:flex;gap:5px;justify-content:center}.runs span{width:clamp(20px,5vmin,32px);height:clamp(20px,5vmin,32px);display:grid;place-items:center;border-radius:4px;border:1px solid var(--line)}.runs .pass{color:var(--accent);border-color:var(--accent)}.runs .fail{color:var(--accent-3);border-color:var(--accent-3)}.race{position:relative;width:min(90%,460px);height:30px;border-top:2px solid var(--line)}.ready,.assert{position:absolute;top:-8px;width:15px;height:15px;border-radius:50%;background:var(--accent);transition:left .5s}.ready{left:67%}.assert{left:32%;background:var(--accent-3)}.reason{color:var(--muted);text-align:center}
js
let n=0;const marks=[];function run(){const pass=n++%3===2;marks.push(pass?'PASS':'FAIL');if(marks.length>7)marks.shift();document.getElementById('runs').innerHTML=marks.map(x=>'<span class='+ (x==='PASS'?'pass':'fail') +'>'+ (x==='PASS'?'✓':'×') +'</span>').join('');document.getElementById('assert').style.left=pass?'82%':'32%';document.getElementById('reason').textContent=pass?'assertion waited for ready':'assertion ran before ready'}run();setInterval(run,1000)

불안정 테스트는 경쟁 상태, 고정 대기 시간, 공유 데이터, 외부 시스템 변동 등으로 생깁니다. 빨간 결과를 다시 실행해 녹색으로 만드는 습관은 실제 회귀를 가립니다.

데모는 같은 테스트가 준비 완료 전에 검사하면 실패하고 기다리면 통과하는 순서를 보여줍니다. 시간으로 때우기보다 관찰할 수 있는 상태를 기다리고 원인을 제거해야 합니다.

언제 쓰나

반복 실행 결과가 들쭉날쭉할 때 원인을 분류하고 안정화할 때 참고합니다.

페이지로 열기 ↗