속성 기반 테스트

Property-based testing

많은 입력을 생성해 모든 입력에서 성립해야 하는 성질을 검사합니다.

···
html
<div class="stage"><div class="title">PROPERTY TEST</div><div class="canvas"><div class="rule">property: normalize(x) ≥ 0</div><div class="samples" id="samples"></div><div class="counter" id="counter">checking generated inputs</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(8px,3vmin,20px)}.rule{border:1px solid var(--accent);border-radius:6px;padding:6px 10px;color:var(--accent)}.samples{display:flex;gap:clamp(3px,1.5vmin,10px);justify-content:center;flex-wrap:wrap;width:100%}.sample{min-width:24px;padding:7px 3px;border:1px solid var(--line);border-radius:5px;text-align:center;font-family:ui-monospace,monospace}.sample.bad{border-color:var(--accent-3);color:var(--accent-3)}.counter{color:var(--muted)}
js
const values=[4,-2,7,0,-3,11,-8];let n=0;function run(){const list=document.getElementById('samples');list.innerHTML='';for(let i=0;i<7;i++){const x=values[(i+n)%values.length],bad=x===-3;const el=document.createElement('span');el.className='sample'+(bad?' bad':'');el.textContent=x;list.appendChild(el)}document.getElementById('counter').textContent='normalize(-3) = -1 · FAIL';n++}run();setInterval(run,1300)

속성 기반 테스트는 몇 개의 예시만 고르는 대신 입력 생성 규칙과 불변 조건을 정의합니다. 발견한 실패 입력을 더 작은 반례로 줄이면 문제를 이해하기 쉬워집니다.

데모는 여러 숫자를 함수에 흘려보내고 조건 위반을 별도로 표시합니다. 생성 범위와 조건이 빈약하면 많은 횟수를 돌려도 중요한 결함을 놓칩니다.

언제 쓰나

정렬, 직렬화, 파서처럼 모든 입력에 적용되는 성질을 검사할 때 사용합니다.

페이지로 열기 ↗