도시 소품을 만들어 파일로 내보내는 레시피가 29종 있었다. 검사 항목에 “내보내기 성공”이 있었고, 29종 전부 초록불이었다.
그런데 내보낸 파일을 실제로 열어보니, 29종 전부 빈 파일이었다. 소품이 한 개도 안 들어 있었다.
검사가 본 것은 파일 크기뿐이었다
“내보내기 성공” 검사의 실체를 열어봤다. 파일 크기가 0보다 큰지만 보고 있었다.
빈 파일도 뼈대 정보 때문에 크기는 있다. 그러니 내용물이 없어도 통과다. 29번의 초록불은 “소품이 담겼다”가 아니라 “파일이 존재한다”의 다른 말이었다.
왜 비었는지는 규격 문제였다
원인은 도구 쪽 규격이었다. 소품을 절차적으로 복제해 배치하는 방식(인스턴스)을 쓰고 있었는데, 내보내기 파일 형식이 그 방식의 결과물을 받지 않는다. 화면에는 보이는데 파일에는 안 담긴다. 내보내기 전에 복제를 실제 형상으로 굳히는 단계가 필요했다. 이건 도구 문서에 적혀 있던 내용이다. 먼저 읽었으면 한 번에 알았을 것이다.
기준선을 만들어 다시 검사했다
검사를 바꿨다. 레시피 없이 내보낸 결과를 기준선으로 두고, 레시피를 적용한 결과가 그 기준선과 실제로 달라졌는지를 비교한다. 빈 파일은 기준선과 차이가 0이라 즉시 탈락한다.
존재 검사는 아무것도 보증하지 않는다는 걸 스물아홉 번의 초록불로 배웠다. 검사는 “있다”가 아니라 “달라졌다”를 봐야 한다.
재발방지 체크리스트
① “성공” 검사의 실체를 연다. 파일 크기·존재 여부만 보는 검사는 검사가 아니다.
② 산출물 검사는 기준선과의 차이로 한다. 안 하면 빈 결과가 영원히 합격한다.
③ 일부러 만든 실패 표본(빈 파일)을 넣어 검사가 정말 잡는지 확인한다.
④ 내보내기·변환 도구는 규격 문서부터 읽는다. 답이 이미 적혀 있는 경우가 많다.
① “성공” 검사의 실체를 연다. 파일 크기·존재 여부만 보는 검사는 검사가 아니다.
② 산출물 검사는 기준선과의 차이로 한다. 안 하면 빈 결과가 영원히 합격한다.
③ 일부러 만든 실패 표본(빈 파일)을 넣어 검사가 정말 잡는지 확인한다.
④ 내보내기·변환 도구는 규격 문서부터 읽는다. 답이 이미 적혀 있는 경우가 많다.