집계 코드 열 곳에서 결합 키를 만드는 방식을 바꿔야 했다. 바꾸기 전에 결과가 같은지 확인하는 검사기를 먼저 넣었다.
Table of contents
Open Table of contents
기준선에서의 통과가 뜻하는 것
아무것도 안 바꾼 상태에서 검사기를 돌리니 차이가 없다는 결과가 나왔다. 아무것도 안 바꿨으니 당연한 결과처럼 보인다.
이 통과는 값이 정말 같다는 뜻일 수도 있고 검사기가 아무것도 안 봤다는 뜻일 수도 있으며 그 둘이 구분되지 않는다. 그래서 이 결과만으로는 검사기가 유효하다고 말할 수 없었다.
틀린 입력으로 돌려 보기
구분하는 방법은 일부러 틀린 입력을 넣어 잡히는지 보는 것뿐이다. 코드를 읽고 돌 것 같다고 판단하는 것은 확인이 아니다.
순서만 다른 경우와 값만 다른 경우와 중첩 구조 안에서 순서가 다른 경우를 각각 넣어 봤다. 완전히 같을 때 아무 보고도 안 하는지도 함께 확인해서 거짓 양성이 없다는 것까지 봤다.
실제 데이터를 뒤집은 시험
가장 유용했던 것은 실제 데이터를 통째로 역순으로 만들어 넣은 시험이었다. 첫 키에서 즉시 탐지되어 검사기가 전부를 비교하지 않고 첫 불일치에서 끊는다는 것도 확인됐다.
그리고 보고에 찍힌 값이 원래 순서가 문자열 정렬이라는 것을 알려 줬다. 시험 하나가 검사기의 유효성과 데이터의 성질 두 가지를 함께 알려 준 셈이다.
순서를 지키지 않으면
검사기를 먼저 검증하지 않고 코드를 바꾸면 검사가 실패했을 때 코드가 틀린 것인지 검사기가 틀린 것인지 못 가른다. 둘 다 새로 넣은 것이라 어느 쪽도 신뢰 근거가 없다.
반대로 통과했을 때도 정말 같은 것인지 검사기가 아무것도 안 보는 것인지 알 수 없다. 완전 일치라고 보고했는데 실제로는 깨져 있는 경우가 그렇게 만들어진다.
한 곳만 먼저 바꾸는 이유
검사기가 확실해진 뒤에도 열 곳을 한꺼번에 바꾸지 않고 한 곳만 먼저 바꿨다. 이 변환에 정렬 순서와 빈 구조 처리와 반환 인덱스 타입이라는 함정이 셋 있는 것을 알고 있었다.
한 곳만 바꿔도 그 자리에 셋이 다 있으므로 함정이 전부 드러난다. 열 곳을 한꺼번에 바꿨으면 셋이 뒤섞여 나와 어느 것이 무엇 때문인지 가르는 데 더 걸렸을 것이다.
정리
- 새 검사기의 통과는 같다인지 안 돌았다인지 구분되지 않는다
- 구분하는 유일한 방법은 틀린 입력을 넣어 보는 것이다
- 코드를 읽고 돌 것 같다고 판단하는 것은 확인이 아니다
- 음성 시험을 안 하면 나중에 코드 문제인지 검사기 문제인지 못 가른다
- 실제 데이터를 뒤집는 시험이 유효성과 데이터 성질을 함께 알려 준다
- 함정을 알고 있으면 한 곳만 먼저 바꾼다
- 그 자리에 함정이 다 있으면 한 번에 전부 드러난다
- 조회 실패가 예외가 아니라 기본값 반환이면 티가 안 난다