สร้างอัตโนมัติเมื่อ 2026-10-03T02:26:29Z
รายงาน Unit Test Coverage
อ้างอิง TOR: ข้อ 4.7.3 (Unit Test Coverage ≥ 80% ไม่นับไฟล์ config)
รายงานนี้สร้างโดย scripts/reports/coverage-report.ts (npm run report:coverage) จากผลจริงของ vitest run --coverage (provider v8) — ขอบเขตการวัดตาม vitest.config.ts: โค้ด business logic ใน src/domain/** และ use case ใน src/application/** (ไม่นับไฟล์ config, index.ts และ *.d.ts)
1. สรุปผล
| รายการ | ค่า |
|---|---|
| ผลตาม TOR 4.7.3 | ผ่าน — lines 97.9%, statements 95.7% (เกณฑ์ ≥ 80%) |
| วันที่วัด | 2026-10-03T02:26:29Z |
| จำนวนไฟล์ที่อยู่ในขอบเขต | 44 ไฟล์ (src/domain 21, src/application 23) |
| Test cases | ผ่าน 907 · ล้มเหลว 3 (รวม 910) |
| Test files | ผ่าน 50 · ล้มเหลว 3 (รวม 53) |
| เวลาที่ใช้รันชุดทดสอบ | 30 วินาที |
มี test ล้มเหลว 3 รายการในรอบนี้ — coverage ด้านล่างวัดจากการรันรอบเดียวกัน (
--coverage.reportOnFailure) ต้องแก้ test ที่ล้มเหลวและรันรายงานนี้ใหม่ก่อนใช้เป็นหลักฐานตรวจรับ
2. Coverage รวมตามขอบเขต
| ขอบเขต | Lines | Statements | Functions | Branches |
|---|---|---|---|---|
src/domain | 99.7% (930/933) | 99.0% (1,124/1,135) | 99.5% (193/194) | 95.1% (682/717) |
src/application | 96.7% (1,439/1,488) | 93.8% (1,804/1,923) | 95.9% (420/438) | 81.1% (1,126/1,389) |
| รวม (เกณฑ์ TOR) | 97.9% (2,369/2,421) | 95.7% (2,928/3,058) | 97.0% (613/632) | 85.8% (1,808/2,106) |
เกณฑ์: lines และ statements รวมของ src/domain + src/application ≥ 80% (vitest.config.ts ตั้ง threshold เพิ่มเติม: lines/functions/statements 80%, branches 75% — ถ้าต่ำกว่า npm run test:coverage จะล้มเหลวใน CI)
| ตัวชี้วัด | ค่ารวม | ≥ 80% |
|---|---|---|
| lines | 97.9% (2,369/2,421) | ผ่าน |
| statements | 95.7% (2,928/3,058) | ผ่าน |
| functions | 97.0% (613/632) | ผ่าน |
| branches | 85.8% (1,808/2,106) | ผ่าน |
3. Coverage รายไฟล์ (เรียงจากต่ำสุด)
| ไฟล์ | Lines | Statements | Functions | Branches |
|---|---|---|---|---|
src/application/privacy/purge.ts | 50.0% | 52.0% | 50.0% | 43.8% |
src/application/config/pricing-usecases.ts | 88.2% | 83.3% | 88.9% | 70.8% |
src/application/evaluation/runner.ts | 88.5% | 83.8% | 92.9% | 62.3% |
src/application/chat/ask.ts | 90.3% | 90.5% | 75.0% | 75.0% |
src/application/identity/auth-usecases.ts | 91.3% | 91.8% | 100.0% | 82.4% |
src/application/privacy/privacy-usecases.ts | 95.4% | 92.4% | 94.1% | 81.5% |
src/application/config/prompt-usecases.ts | 95.8% | 93.5% | 100.0% | 64.6% |
src/application/evaluation/reports.ts | 96.8% | 90.7% | 90.5% | 72.5% |
src/application/evaluation/run-registry.ts | 96.9% | 87.5% | 90.0% | 64.3% |
src/application/config/ai-config-usecases.ts | 97.3% | 91.7% | 97.5% | 79.8% |
src/application/config/guardrail-usecases.ts | 97.5% | 98.0% | 100.0% | 78.9% |
src/domain/evaluation/scorers.ts | 98.3% | 96.8% | 97.6% | 93.7% |
src/application/evaluation/datasets.ts | 98.7% | 93.9% | 95.8% | 82.1% |
src/application/config/shared.ts | 100.0% | 83.3% | 100.0% | 75.0% |
src/application/ops/backup.ts | 100.0% | 93.8% | 100.0% | 71.0% |
src/application/ops/defects.ts | 100.0% | 96.4% | 100.0% | 94.6% |
src/domain/retrieval/synonyms.ts | 100.0% | 97.4% | 100.0% | 95.9% |
src/domain/retrieval/bm25.ts | 100.0% | 98.2% | 100.0% | 94.4% |
src/application/ops/data-destruction.ts | 100.0% | 98.5% | 100.0% | 85.2% |
src/domain/ai/guardrail-policy.ts | 100.0% | 99.0% | 100.0% | 92.7% |
src/application/ops/dashboard.ts | 100.0% | 99.4% | 100.0% | 82.5% |
src/application/identity/admin-user-usecases.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/application/ingestion/coverage.ts | 100.0% | 100.0% | 100.0% | 94.3% |
src/application/ingestion/kb-admin.ts | 100.0% | 100.0% | 100.0% | 90.0% |
src/application/ops/range-query.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/application/ops/range.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/application/report/sla.ts | 100.0% | 100.0% | 100.0% | 94.2% |
src/domain/ai/citation.ts | 100.0% | 100.0% | 100.0% | 95.8% |
src/domain/ai/token-budget-policy.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/audit/hash-chain.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/config/ai-config.ts | 100.0% | 100.0% | 100.0% | 87.9% |
src/domain/identity/lockout-policy.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/identity/password-policy.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/identity/rbac.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/ingestion/chunking-policy.ts | 100.0% | 100.0% | 100.0% | 95.4% |
src/domain/ingestion/sanitize.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/privacy/pii-masking.ts | 100.0% | 100.0% | 100.0% | 97.4% |
src/domain/report/sla-policy.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/retrieval/embedding.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/retrieval/heuristic-reranker.ts | 100.0% | 100.0% | 100.0% | 87.5% |
src/domain/retrieval/relevance-scoring.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/retrieval/rrf.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/retrieval/tokenizer.ts | 100.0% | 100.0% | 100.0% | 100.0% |
src/domain/retrieval/types.ts | – | – | – | – |
– = ไฟล์ไม่มีรายการชนิดนั้นให้วัด (เช่นไฟล์ที่มีแต่ type หรือค่าคงที่)
ไฟล์ที่ lines ต่ำกว่า 80%: 1 ไฟล์ — เป็นลำดับแรกที่ควรเพิ่ม unit test
วิธีรันซ้ำ
npm run report:coverage # รันชุดทดสอบทั้งหมดพร้อม coverage แล้วสร้างรายงานนี้
npm run test:coverage # รันพร้อม coverage + threshold gate (ใช้ใน CI)
npx tsx scripts/reports/coverage-report.ts --from-existing --log=vitest.log # สร้างรายงานจากผลที่รันไว้แล้ว
รายงาน HTML รายบรรทัด: npx vitest run --coverage แล้วเปิด coverage/index.html