전부 통과했다 — 초록불 테스트를 살아남은 결함 22개
돌아가는 시스템 하나를 만들고 출고하며 확인한 결함 22건을, 검사가 통과하고 성공을 보고하면서도 아무것도 증명하지 못하는 여덟 가지 방식으로 묶었다. 각각 증상·원인·조치 — 그중 둘은 아직 부분 조치다.
기계 번역 · 원문
Twenty-two defects that survived a green test suite, grouped by the eight ways a check can pass without proving anything.
What is in it
- README.md — the taxonomy, a 7-question checklist, and all 20 entries with symptom, cause and fix
- defects.csv — the register as data, sortable by blind spot or area
- blindspots.json — counts per blind spot and which fixes are still partial
Claims, and how to check them
- every entry was observed, not constructed as an example
check: each has a specific symptom, a confirmed cause and the fix that was applied - the seven blind spots are stack-independent
check: read the blind spot column alone; none of the seven names a language or library - two fixes are still incomplete and are marked as such
check: blindspots.json lists partial_fixes; the entries carry the note in place
What it does not do
- no code library or test framework — this is a register, not a tool
- not a study: 20 defects from one system, not a random sample, so no percentage here is a base rate
- does not cover concurrency, distributed systems or performance regressions
- two of the twenty fixes are only partial and say so
You need already
- nothing — plain markdown, CSV and JSON
blind_spots: 8defects: 22examples_from: Python, SQLite, FastAPI, CSSformat: markdown, csv, jsonlanguage: English
결함 스물두 건. 하나하나가 잡았어야 할 검사를 살아남았다.
버그 자체는 평범하다 — 빠진 마이그레이션, 가려진 변수, 빈 열. 흥미로운 건 두 번째 칸이다: 각각에 대해, 검사가 돌고 성공을 보고하고도 아무것도 증명하지 못한 구체적인 기제. 그 목록은 짧고, 반복되며, 다른 언어로 다른 일을 하는 코드베이스에도 그대로 옮겨 간다.
검사가 거짓말하는 여덟 가지 방식
• 검사가 실패할 수 없었다 — 정확성과 무관한 이유로 통과하는 단언. 검사가 없느니만 못하다. 색깔을 보고하기 때문이다.
• 환경이 너무 깨끗했다 — 테스트가 현재 정의대로 세계를 만들기 때문에, 정의와 이미 존재하는 세계 사이의 불일치는 거기서 일어날 수가 없다.
• API가 실패 대신 값을 돌려준다 — 없는 키는 빈칸을, 모르는 CSS 클래스는 무스타일을 준다. 덧붙이기는 바꿔치기가 아니다. 아무것도 raise되지 않으니 아무것도 기록되지 않는다.
• 수정이 산출물에 닿지 않았다 — 소스는 이렇게 말하고 디스크의 파일은 저렇게 말한다.
• 성공만 셌다 — 통한 것의 보고는 보고가 아니다.
• 주석이 코드와 어긋났다 — 확신에 찬 틀린 문장은 다음 독자가 확인하는 것을 멈추게 한다.
• 두 개념이 한 열을 썼다 — 묻고 있는 질문 옆의 질문에 확신을 갖고 답하는 고지.
• 부분문자열을 신원으로 취급했다 — 이름으로 매칭한 정리 작업이 진짜를 지웠다.
구성
• README.md — 분류 체계, 당신의 스위트에 돌릴 8문항 체크리스트, 그리고 증상·확인된 원인·적용한 조치가 붙은 22건 전부
• defects.csv — 등록부를 데이터로. 눈이 안 닿는 자리별로도, 영역별로도 정렬 가능
• blindspots.json — 횟수, 그리고 어느 조치가 아직 부분적인지
항목은 이렇게 생겼다
새 설치는 import에서 죽는데 개발 기기는 무한정 멀쩡했다 — create_all이 이미 있는 테이블을 건너뛰고 따라서 외래키도 절대 해석하지 않기 때문이다. 어떤 스위트는 15/15를 보고했지만 가장 중요한 단언 셋은 한 번도 실행되지 않았다. 빈 결과가 거짓으로 만든 if 뒤에 숨어 있었다. 테스트 픽스처를 지우려고 쓴 정리 질의가 완성된 실제 상품을 매칭했다. 필터가 부분문자열이었고 진짜 제목에 "fastest"라는 단어가 들어 있었기 때문이다.
깔끔한 결말은 없다
스물두 건 중 둘은 조치가 부분적이라고 그 자리에 표시돼 있다. 근본 원인이 아직 열려 있고 다음번에도 조용히 일어날 것이기 때문이다. 말끔한 해결만 모은 등록부는 마케팅 문서다.
이것이 아닌 것
조사도, 연구도, 모범 사례도 아니다. 한 사람이 한 시기에 만든 시스템 하나에서 나온 결함 22건이다. 표본은 작고 무작위도 아니다 — 그냥 일어난 일이다. 여기 어떤 퍼센트도 기저율이 아니다. 제공하는 것은 분류 체계와 체크리스트이며, 둘 다 배우는 데 실제 시간이 들었다.
이런 분께
테스트 스위트가 초록불인데 그게 대체 무엇을 증명하는지 궁금해지기 시작한 사람. 예시는 파이썬·SQLite·웹앱이지만, 여덟 가지 눈이 안 닿는 자리는 그렇지 않다.
영어. 마크다운·CSV·JSON — 설치할 소프트웨어 없음.