# Test Coverage Plan (Tiếng Việt) 🌐 **Languages:** 🇺🇸 [English](../../../../ops/COVERAGE_PLAN.md) · 🇪🇹 [am](../../../am/docs/ops/COVERAGE_PLAN.md) · 🇸🇦 [ar](../../../ar/docs/ops/COVERAGE_PLAN.md) · 🇦🇿 [az](../../../az/docs/ops/COVERAGE_PLAN.md) · 🇧🇬 [bg](../../../bg/docs/ops/COVERAGE_PLAN.md) · 🇧🇩 [bn](../../../bn/docs/ops/COVERAGE_PLAN.md) · 🇧🇦 [bs](../../../bs/docs/ops/COVERAGE_PLAN.md) · 🇨🇿 [cs](../../../cs/docs/ops/COVERAGE_PLAN.md) · 🇩🇰 [da](../../../da/docs/ops/COVERAGE_PLAN.md) · 🇩🇪 [de](../../../de/docs/ops/COVERAGE_PLAN.md) · 🇬🇷 [el](../../../el/docs/ops/COVERAGE_PLAN.md) · 🇪🇸 [es](../../../es/docs/ops/COVERAGE_PLAN.md) · 🇪🇪 [et](../../../et/docs/ops/COVERAGE_PLAN.md) · 🇮🇷 [fa](../../../fa/docs/ops/COVERAGE_PLAN.md) · 🇫🇮 [fi](../../../fi/docs/ops/COVERAGE_PLAN.md) · 🇫🇷 [fr](../../../fr/docs/ops/COVERAGE_PLAN.md) · 🇮🇪 [ga](../../../ga/docs/ops/COVERAGE_PLAN.md) · 🇮🇳 [gu](../../../gu/docs/ops/COVERAGE_PLAN.md) · 🇳🇬 [ha](../../../ha/docs/ops/COVERAGE_PLAN.md) · 🇮🇱 [he](../../../he/docs/ops/COVERAGE_PLAN.md) · 🇮🇳 [hi](../../../hi/docs/ops/COVERAGE_PLAN.md) · 🇭🇷 [hr](../../../hr/docs/ops/COVERAGE_PLAN.md) · 🇭🇺 [hu](../../../hu/docs/ops/COVERAGE_PLAN.md) · 🇦🇲 [hy](../../../hy/docs/ops/COVERAGE_PLAN.md) · 🇮🇩 [id](../../../id/docs/ops/COVERAGE_PLAN.md) · 🇳🇬 [ig](../../../ig/docs/ops/COVERAGE_PLAN.md) · 🇮🇹 [it](../../../it/docs/ops/COVERAGE_PLAN.md) · 🇯🇵 [ja](../../../ja/docs/ops/COVERAGE_PLAN.md) · 🇬🇪 [ka](../../../ka/docs/ops/COVERAGE_PLAN.md) · 🇰🇭 [km](../../../km/docs/ops/COVERAGE_PLAN.md) · 🇮🇳 [kn](../../../kn/docs/ops/COVERAGE_PLAN.md) · 🇰🇷 [ko](../../../ko/docs/ops/COVERAGE_PLAN.md) · 🇱🇹 [lt](../../../lt/docs/ops/COVERAGE_PLAN.md) · 🇱🇻 [lv](../../../lv/docs/ops/COVERAGE_PLAN.md) · 🇮🇳 [ml](../../../ml/docs/ops/COVERAGE_PLAN.md) · 🇮🇳 [mr](../../../mr/docs/ops/COVERAGE_PLAN.md) · 🇲🇾 [ms](../../../ms/docs/ops/COVERAGE_PLAN.md) · 🇲🇹 [mt](../../../mt/docs/ops/COVERAGE_PLAN.md) · 🇲🇲 [my](../../../my/docs/ops/COVERAGE_PLAN.md) · 🇳🇵 [ne](../../../ne/docs/ops/COVERAGE_PLAN.md) · 🇳🇱 [nl](../../../nl/docs/ops/COVERAGE_PLAN.md) · 🇳🇴 [no](../../../no/docs/ops/COVERAGE_PLAN.md) · 🇮🇳 [or](../../../or/docs/ops/COVERAGE_PLAN.md) · 🇮🇳 [pa](../../../pa/docs/ops/COVERAGE_PLAN.md) · 🇵🇭 [phi](../../../phi/docs/ops/COVERAGE_PLAN.md) · 🇵🇱 [pl](../../../pl/docs/ops/COVERAGE_PLAN.md) · 🇵🇹 [pt](../../../pt/docs/ops/COVERAGE_PLAN.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/COVERAGE_PLAN.md) · 🇷🇴 [ro](../../../ro/docs/ops/COVERAGE_PLAN.md) · 🇷🇺 [ru](../../../ru/docs/ops/COVERAGE_PLAN.md) · 🇱🇰 [si](../../../si/docs/ops/COVERAGE_PLAN.md) · 🇸🇰 [sk](../../../sk/docs/ops/COVERAGE_PLAN.md) · 🇸🇮 [sl](../../../sl/docs/ops/COVERAGE_PLAN.md) · 🇷🇸 [sr](../../../sr/docs/ops/COVERAGE_PLAN.md) · 🇸🇪 [sv](../../../sv/docs/ops/COVERAGE_PLAN.md) · 🇰🇪 [sw](../../../sw/docs/ops/COVERAGE_PLAN.md) · 🇮🇳 [ta](../../../ta/docs/ops/COVERAGE_PLAN.md) · 🇮🇳 [te](../../../te/docs/ops/COVERAGE_PLAN.md) · 🇹🇭 [th](../../../th/docs/ops/COVERAGE_PLAN.md) · 🇹🇷 [tr](../../../tr/docs/ops/COVERAGE_PLAN.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/COVERAGE_PLAN.md) · 🇵🇰 [ur](../../../ur/docs/ops/COVERAGE_PLAN.md) · 🇺🇿 [uz](../../../uz/docs/ops/COVERAGE_PLAN.md) · 🇳🇬 [yo](../../../yo/docs/ops/COVERAGE_PLAN.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/COVERAGE_PLAN.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/ops/COVERAGE_PLAN.md) --- Cập nhật lần cuối: 2026-06-28 > Trạng thái được đo vào 2026-05-13: dòng 82.58%, câu lệnh 82.58%, hàm 84.23%, nhánh 75.22%. Các Giai đoạn 1-5 đã hoàn tất. Trọng tâm hiện tại là Giai đoạn 6 (>=85%) và Giai đoạn 7 (>=90%). ## Đường cơ sở Có nhiều số liệu độ bao phủ tùy thuộc vào cách tính báo cáo. Đối với việc lập kế hoạch, chỉ một trong số đó là hữu ích. | Chỉ số | Phạm vi | Câu lệnh / Dòng | Nhánh | Hàm | Ghi chú | | ---------------------------- | ------------------------------------------------------------- | --------------: | -----: | -----: | -------------------------------------------------------------- | | Cũ | `npm run test:coverage` cũ | 79.42% | 75.15% | 67.94% | Bị thổi phồng: tính cả các tệp kiểm thử và loại trừ `open-sse` | | Chẩn đoán | Chỉ mã nguồn, không bao gồm kiểm thử và `open-sse` | 68.16% | 63.55% | 64.06% | Chỉ hữu ích để cô lập `src/**` | | Đường cơ sở được khuyến nghị | Chỉ mã nguồn, không bao gồm kiểm thử nhưng bao gồm `open-sse` | 82.58% | 75.22% | 84.23% | Đây là đường cơ sở cho toàn dự án cần được cải thiện | Đường cơ sở được khuyến nghị là số liệu cần tối ưu. ## Quy tắc - Các mục tiêu độ bao phủ áp dụng cho các tệp mã nguồn, không áp dụng cho `tests/**`. - `open-sse/**` là một phần của sản phẩm và phải tiếp tục nằm trong phạm vi. - Mã mới không được làm giảm độ bao phủ tại các khu vực được chỉnh sửa. - Ưu tiên kiểm thử hành vi và kết quả của các nhánh thay vì chi tiết triển khai. - Ưu tiên cơ sở dữ liệu SQLite tạm thời và các fixture nhỏ thay vì mock trên diện rộng cho `src/lib/db/**`. ## Tập lệnh hiện tại - `npm run test:coverage` - Cổng kiểm tra độ bao phủ mã nguồn chính cho bộ kiểm thử đơn vị - Tạo `text-summary`, `html`, `json-summary` và `lcov` - `npm run coverage:report` - Báo cáo chi tiết theo từng tệp từ lần chạy gần nhất - `npm run test:coverage:legacy` - Chỉ dùng để so sánh lịch sử ## Các cột mốc | Giai đoạn | Mục tiêu | Trọng tâm | Trạng thái | | ----------- | ------------------: | ---------------------------------------------------------------- | -------------- | | Giai đoạn 1 | 60% câu lệnh / dòng | Các cải tiến nhanh và độ bao phủ tiện ích có rủi ro thấp | ✅ Hoàn tất | | Giai đoạn 2 | 65% câu lệnh / dòng | Nền tảng cơ sở dữ liệu và route | ✅ Hoàn tất | | Giai đoạn 3 | 70% câu lệnh / dòng | Xác thực provider và phân tích mức sử dụng | ✅ Hoàn tất | | Giai đoạn 4 | 75% câu lệnh / dòng | Các trình chuyển đổi và helper của `open-sse` | ✅ Hoàn tất | | Giai đoạn 5 | 80% câu lệnh / dòng | Các handler của `open-sse` và các nhánh của executor | ✅ Hoàn tất | | Giai đoạn 6 | 85% câu lệnh / dòng | Các trường hợp biên khó hơn, nợ nhánh, bộ kiểm thử hồi quy | Đang tiến hành | | Giai đoạn 7 | 90% câu lệnh / dòng | Rà soát cuối cùng, lấp đầy khoảng trống, siết ngưỡng nghiêm ngặt | Chờ thực hiện | Độ bao phủ nhánh và hàm cần tăng dần theo từng giai đoạn, nhưng mục tiêu bắt buộc chính là câu lệnh / dòng. ## Các điểm nóng ưu tiên Những tệp này hiện có độ bao phủ dòng thấp nhất (< 60%) và mang lại hiệu quả tốt nhất cho Giai đoạn 6-7. Được tạo từ `coverage/coverage-summary.json` vào ngày 2026-05-13: | # | Tệp | % dòng | | --- | ------------------------------------------------------------ | -----: | | 1 | `open-sse/services/compression/validation.ts` | 7.87% | | 2 | `src/app/api/v1/batches/route.ts` | 9.67% | | 3 | `src/app/docs/components/FeedbackWidget.tsx` | 9.80% | | 4 | `open-sse/services/compression/toolResultCompressor.ts` | 10.00% | | 5 | `src/app/docs/components/DocCodeBlocks.tsx` | 10.63% | | 6 | `open-sse/services/compression/engines/rtk/lineFilter.ts` | 10.96% | | 7 | `open-sse/services/specificityRules.ts` | 11.28% | | 8 | `src/mitm/systemCommands.ts` | 12.19% | | 9 | `open-sse/services/compression/aggressive.ts` | 12.77% | | 10 | `src/app/api/v1/batches/[id]/cancel/route.ts` | 12.98% | | 11 | `open-sse/services/compression/progressiveAging.ts` | 13.26% | | 12 | `open-sse/services/compression/engines/rtk/smartTruncate.ts` | 13.43% | | 13 | `open-sse/services/compression/engines/rtk/deduplicator.ts` | 13.51% | | 14 | `src/lib/cloudAgent/agents/jules.ts` | 13.52% | | 15 | `open-sse/services/compression/lite.ts` | 14.46% | | 16 | `src/app/api/v1/rerank/route.ts` | 14.94% | | 17 | `open-sse/services/compression/preservation.ts` | 15.07% | | 18 | `src/lib/cloudAgent/agents/codex.ts` | 15.54% | | 19 | `open-sse/services/tierResolver.ts` | 16.66% | | 20 | `src/app/docs/components/DocsLazyWrapper.tsx` | 16.66% | Các chủ đề cho Giai đoạn 6-7: - `open-sse/services/compression/**` là cụm có độ bao phủ thấp dày đặc nhất và chiếm phần lớn khoảng trống còn lại. - Các route API batch và rerank (`src/app/api/v1/batches/**`, `src/app/api/v1/rerank/route.ts`) cần các bài kiểm thử ở cấp độ handler. - Các adapter tác tử đám mây (`src/lib/cloudAgent/agents/jules.ts`, `codex.ts`) và `tierResolver.ts` cần các bài kiểm thử theo kịch bản. - Các thành phần UI tài liệu và `src/mitm/systemCommands.ts` có mức ưu tiên thấp hơn nhưng dễ dàng cải thiện độ bao phủ nhánh. ## Danh sách kiểm tra thực thi ### Giai đoạn 1: 56.95% -> 60% - [x] Sửa chỉ số độ bao phủ để phản ánh mã nguồn thay vì các tệp kiểm thử - [x] Giữ lại script độ bao phủ cũ để so sánh - [x] Ghi lại đường cơ sở và các điểm nóng trong kho mã nguồn - [ ] Thêm các bài kiểm thử có trọng tâm cho những tiện ích ít rủi ro: - `src/shared/utils/upstreamError.ts` - `src/shared/utils/fetchTimeout.ts` - `src/lib/api/errorResponse.ts` - `src/shared/utils/apiAuth.ts` - `src/lib/display/names.ts` - [ ] Thêm các bài kiểm thử route cho: - `src/app/api/settings/require-login/route.ts` - `src/app/api/providers/[id]/models/route.ts` ### Giai đoạn 2: 60% -> 65% - [ ] Thêm các bài kiểm thử dựa trên DB cho: - `src/lib/db/modelComboMappings.ts` - `src/lib/db/settings.ts` - `src/lib/db/registeredKeys.ts` - [ ] Bao phủ hành vi nhánh trong: - `src/lib/providers/validation.ts` - `src/app/api/v1/embeddings/route.ts` - `src/app/api/v1/moderations/route.ts` ### Giai đoạn 3: 65% -> 70% - [ ] Thêm các bài kiểm thử phân tích mức sử dụng cho: - `src/lib/usage/usageHistory.ts` - `src/lib/usage/usageStats.ts` - `src/lib/usage/costCalculator.ts` - [ ] Mở rộng độ bao phủ route cho các nhánh quản lý proxy và cài đặt ### Giai đoạn 4: 70% -> 75% - [ ] Bao phủ các hàm trợ giúp dịch và những luồng dịch trung tâm: - `open-sse/translator/index.ts` - `open-sse/translator/helpers/*` - `open-sse/translator/request/*` - `open-sse/translator/response/*` ### Giai đoạn 5: 75% -> 80% - [ ] Thêm các bài kiểm thử ở cấp độ handler cho: - `open-sse/handlers/chatCore.ts` - `open-sse/handlers/responsesHandler.js` - `open-sse/handlers/imageGeneration.js` - `open-sse/handlers/embeddings.js` - [ ] Thêm độ bao phủ nhánh của executor cho xác thực theo từng nhà cung cấp, thử lại và ghi đè endpoint ### Giai đoạn 6: 80% -> 85% - [ ] Hợp nhất thêm các bộ kiểm thử trường hợp biên vào luồng bao phủ chính - [ ] Tăng độ bao phủ hàm cho các mô-đun DB có độ bao phủ constructor/hàm trợ giúp yếu - [ ] Khép lại các khoảng trống nhánh trong `settings.ts`, `registeredKeys.ts`, `validation.ts` và các hàm trợ giúp dịch ### Giai đoạn 7: 85% -> 90% - [ ] Coi các tệp có độ bao phủ thấp còn lại là yếu tố chặn - [ ] Thêm các bài kiểm thử hồi quy cho mọi lỗi trong mã sản phẩm chưa được bao phủ đã sửa trong quá trình hướng tới 90% - [ ] Chỉ nâng ngưỡng độ bao phủ trong CI sau khi đường cơ sở cục bộ ổn định trong ít nhất hai lần chạy liên tiếp ## Chính sách ratchet Chỉ cập nhật các ngưỡng của `npm run test:coverage` sau khi dự án thực sự vượt qua cột mốc tiếp theo với một khoảng đệm an toàn. **Ngưỡng hiện tại:** `npm run test:coverage` áp dụng ngưỡng **60 câu lệnh / 60 dòng / 60 hàm / 60 nhánh** (chỉ số này đã được thiết lập lại trong Quality-Gates Fase 6A.1 — mức cơ sở 82.58% trước đó bị thổi phồng vì tính cả các tệp kiểm thử và loại trừ `open-sse`). Lệnh `test:coverage:legacy` duy trì chỉ số 50/50/50 cũ để so sánh lịch sử. Để kiểm tra ngưỡng tùy trường hợp dựa trên báo cáo mới nhất, hãy sử dụng: ```bash node scripts/check/test-report-summary.mjs --threshold 75 ``` Trình tự ratchet được đề xuất (thứ tự là `câu lệnh-dòng / nhánh / hàm`): 1. 55/60/55 2. 60/62/58 3. 65/64/62 4. 70/66/66 5. 75/70/72 <-- ngưỡng hiện tại (75/70/75) 6. 80/75/78 7. 85/80/84 8. 90/85/88 Mục tiêu ratchet tiếp theo là `80/75/78` sau khi độ bao phủ nhánh duy trì trên 78% trong hai lần chạy liên tiếp. ## Khoảng trống đã biết Lệnh đo độ bao phủ hiện tại đo bộ kiểm thử đơn vị Node chính và bao gồm mã nguồn được thực thi từ đó, kể cả `open-sse`. Lệnh này chưa hợp nhất độ bao phủ của Vitest vào một báo cáo thống nhất duy nhất. Việc hợp nhất đó đáng được thực hiện sau này, nhưng không phải là yếu tố cản trở việc bắt đầu nâng từ 60% lên 80%.