4장 현재 동작을 특성 테스트로 잠근다
레거시 코드에는 명세가 없을 수 있다. 이때 현재 동작을 관찰해 테스트로 기록하는 방법이 특성 테스트다. 현재 동작이 옳다는 선언이 아니라, 변경 전후 차이를 알아채는 경보다.
먼저 정상 예시 하나와 위험 예시 하나를 고정한다.
test('겹치는 예약은 거부한다',()=>{
const rows=[];
reserve(first,rows,{now});
const result=reserve(overlap,rows,{now});
assert.equal(result.error,'OVERLAP');
});
테스트 이름에는 구현이 아니라 약속을 쓴다. “filter가 true를 반환한다”보다 “겹치는 예약은 거부한다”가 오래간다. 입력 시간과 현재 시각은 고정한다. 테스트에서 new Date()를 직접 부르면 자정, 시간대, 실행 날짜에 따라 결과가 달라진다.
테스트가 실패했을 때 바로 기대값을 바꾸지 않는다. 제품 규칙이 바뀐 것인지, 구현이 깨진 것인지 먼저 판단한다. AI가 테스트와 구현을 동시에 바꾸면 잘못된 동작을 새 정답으로 만들기 쉽다.