# `tests/` — 테스트 이 프로젝트는 **No RED, No Code**로 개발한다(`AGENTS.md` §1). `src/`의 모든 기능은 여기 어딘가에 그 기능을 실패시켰던 RED가 있어야 한다. ```powershell .\.venv\Scripts\python.exe -m pytest tests -q ``` 네트워크·실제 API 키가 필요한 테스트는 기본 실행에 포함하지 않는다(마커 `network`, `pyproject.toml` 참고). fixture/mock으로 대체하고, 실제 nedrug/공공데이터포털 호출은 사용자 승인 후 수동 smoke로 분리한다. ## 파일 | 파일 | 무엇을 검증하는가 | |---|---| | `conftest.py` | 임시 DB·설정 fixture, 네트워크 차단 fixture | | `test_project_contracts.py` | R0 계약 — 모듈이 존재하고 임포트되는지, CLI 최소 동작 | | `test_normalize.py` | 원본 필드 → `DmfRecord` 정규화, `dmf_key` 안정성 | | `test_storage_repo.py` | SQLite 저장소 read/write 경로, append-only 무결성 | | `test_import_prototype_xlsx.py` | 기존 프로토타입 xlsx(9,084건) 임포트 | | `test_agy_headful_collection.py` | AGY headful Chrome 수집 경로 — 권한 스코프, 다운로드 검증, 실패 보고 | | `test_pipeline_preflight_ux.py` | 파이프라인 사전 점검과 사용자에게 보이는 문구 | | `test_gui_design_contracts.py` | tkinter 온보딩 GUI 디자인 감사(레이아웃 붕괴, overflow, 라벨 누락 등) | | `test_report_e2e_design.py` | 실제 SQLite → 실제 xlsx 생성 → zip/XML 구조 감사(시트 순서, 틀고정, 조건부서식 등) | | `test_ux_regressions.py` | 실사용자 제보 회귀(cp949 콘솔, 선택 기능 정책, 버튼 가독성 등) | | `fixtures/` | API 응답 샘플, agy 응답 봉투(정상/오염), diff 비교용 스냅샷 | 디자인 감사 RED의 구체 기준(무엇을 RED로 잡아야 하는가)은 `docs/design/07-tdd-red-system.md` R4/R5가 정본이다.