Files
ai-customer-service/test/TEST_COVERAGE_REPORT.md
Your Name cf46b27610 fix: P0-1 RateLimiter并发写安全 + P0-2工单操作错误码区分 + P1 rows.Close修复
P0-1 (limits.go): Allow()方法改为全程使用写锁保护counters map读写,避免RLock写入时的data race
P0-2 (ticket_workflow.go+ticket_handler.go): Assign/Resolve/Close操作先查询ticket存在性和状态,返回明确的CS_TICKET_4001/CS_TKT_4002/CS_TICKET_4092/CS_TICKET_4093错误码,handler根据错误前缀路由HTTP状态码
P1-1 (ticket_store.go): 移除GetStats中3处手动rows.Close(),只保留defer Close()
2026-05-01 20:56:25 +08:00

157 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 测试覆盖率报告
> 生成时间2026-04-30 21:52 GMT+8
> 工具:`go test -cover`
> 项目ai-customer-service
---
## 1. 各包当前覆盖率
| 包 | 覆盖率 | 达标 | 备注 |
|----|--------|------|------|
| `internal/service/intent` | **80.8%** | ✅ | Phase 1 核心 |
| `internal/service/handoff` | **75.0%** | ✅ | Phase 1 核心 |
| `internal/config` | **70.6%** | ✅ | Phase 1 核心 |
| `internal/http/handlers` | **65.7%** | ✅ | Phase 1 核心 |
| `test/integration` | 53.1% | ⚠️ | 接近目标 |
| `test/e2e` | 32.7% | ⚠️ | 需提升 |
| `internal/service/dialog` | 49.2% | ⚠️ | 接近目标 |
| `internal/app` | 17.4% | ❌ | 待补齐 |
| `internal/store/memory` | 0.0% | ❌ | 无测试文件 |
| `internal/store/postgres` | 1.6% | ❌ | Phase 2 范围 |
| `internal/http` | 0.0% | ❌ | 路由器未覆盖 |
| `internal/platform/httpx` | 0.0% | ❌ | 中间件未覆盖 |
| `internal/platform/health` | 0.0% | ❌ | 健康检查未覆盖 |
| `internal/platform/logging` | 0.0% | ❌ | 日志未覆盖 |
| `internal/domain/error/cserrors` | 0.0% | ❌ | 错误码未覆盖 |
| Domain 包6 个) | 0.0% | ❌ | 无测试文件 |
| `cmd/ai-customer-service` | 0.0% | ❌ | main 未覆盖 |
**整体覆盖率47.0%**
---
## 2. 覆盖率目标
### Phase 1 上线目标(>60%
必须达标的包:
| 包 | 当前覆盖率 | 目标 | 差距 |
|----|-----------|------|------|
| `internal/http/handlers` | 65.7% | >60% | ✅ 已达标 |
| `internal/config` | 70.6% | >60% | ✅ 已达标 |
| `internal/service/handoff` | 75.0% | >60% | ✅ 已达标 |
| `internal/service/intent` | 80.8% | >60% | ✅ 已达标 |
| `internal/service/dialog` | 49.2% | >60% | ⚠️ 差 10.8% |
| `internal/app` | 17.4% | >60% | ❌ 差 42.6% |
| `test/integration` | 53.1% | >60% | ⚠️ 差 6.9% |
| `test/e2e` | 32.7% | >60% | ❌ 差 27.3% |
### Phase 2 目标(>40%
| 包 | 当前覆盖率 | 目标 |
|----|-----------|------|
| `internal/store/postgres` | 1.6% | >40% |
| `internal/store/memory` | 0.0% | >40% |
| `internal/platform/httpx` | 0.0% | >40% |
| `internal/http` | 0.0% | >40% |
| Domain 包6 个) | 0.0% | >30% |
---
## 3. 缺失测试的包列表
### P0 — 必须补齐(上线阻断)
| 包 | 当前覆盖率 | 关键缺失函数 |
|----|-----------|-------------|
| `internal/app` | 17.4% | `app.New`60%)未充分测试,`Shutdown` 未覆盖 |
| `test/e2e` | 32.7% | 编译失败app.go undefined: ticket/ticketListerStore |
| `internal/service/dialog` | 49.2% | `Process`78.4%)未达 100%,边界场景缺失 |
### P1 — 上线后补齐
| 包 | 当前覆盖率 | 说明 |
|----|-----------|------|
| `internal/store/postgres` | 1.6% | Phase 2 范围postgres 驱动未 mock |
| `internal/store/memory` | 0.0% | 全部 store 方法未覆盖 |
| `internal/platform/httpx` | 0.0% | `NewRateLimiter`60%),滑动窗口逻辑未验证 |
| `internal/platform/health` | 0.0% | 健康检查探针未覆盖 |
| `internal/http` | 0.0% | `NewRouter`27.8%),中间件注册路径缺失 |
| `internal/platform/logging` | 0.0% | Logger 初始化未覆盖 |
| `internal/domain/error/cserrors` | 0.0% | `ErrorMsg`31.4%),错误码路径未覆盖 |
| Domain 包6 个) | 0.0% | `audit/ticketstats/ticket/intent/message/session` 全部无测试文件 |
---
## 4. 测试策略说明
### 4.1 当前测试分层
```
e2e 层test/e2e/ ← 全链路集成(依赖 app.New 编译修复)
integration 层test/integration/ ← AC-02 矩阵 + 端到端场景
handler 层internal/http/handlers/ ← HTTP 接口单元测试
service 层internal/service/ ← 业务逻辑单元测试
config 层internal/config/ ← 配置解析测试
store 层internal/store/ ← 数据访问测试memory/postgres
```
### 4.2 Phase 1 补齐策略
**优先补齐P0**
1. `internal/service/dialog/service_test.go` — 补 `Process` 未覆盖分支,提升至 >60%
2. `test/e2e/` — 等待 TechLead 修复 app.go 编译问题后,补充覆盖率
3. `internal/app/app_test.go` — 覆盖 `New``Shutdown` 方法
**补齐方式**
- 使用 table-driven test 覆盖分支路径
- `dialog.Process` 补充边界 caseintent=nil、session=nil、LLM 超时)
- `app.New` mock 所有依赖后验证初始化逻辑
### 4.3 Phase 2 补齐策略
**分阶段**
1. **第一阶段**:覆盖率 >30% — 覆盖核心 public 方法
2. **第二阶段**:覆盖率 >40% — 覆盖错误路径和边界条件
**重点包**
- `internal/store/postgres` — 使用 sqlmock 隔离数据库依赖
- `internal/platform/httpx` — 单元测试滑动窗口算法
- `internal/http/router.go` — 路由注册 + 404/405 路径测试
---
## 5. 函数级覆盖率详情
### 关键函数覆盖率
| 函数 | 包 | 覆盖率 | 状态 |
|------|-----|--------|------|
| `Process` | `internal/service/dialog/service.go:60` | 78.4% | ⚠️ 接近目标 |
| `New` | `internal/app/app.go:39` | 60.0% | ✅ 达标 |
| `List` | `internal/http/handlers/ticket_handler.go:32` | 0.0% | ❌ 未覆盖 |
| `Get` | `internal/http/handlers/ticket_stats_handler.go:29` | 0.0% | ❌ 未覆盖 |
| `NewTicketStatsHandler` | `internal/http/handlers/ticket_stats_handler.go:24` | 0.0% | ❌ 未覆盖 |
| `WithRateLimit` | `internal/platform/httpx/limits.go:90` | 100.0% | ✅ 已覆盖 |
| `Allow` | `internal/platform/httpx/limits.go:50` | 100.0% | ✅ 已覆盖 |
| `NewRateLimiter` | `internal/platform/httpx/limits.go:34` | 60.0% | ⚠️ 待提升 |
---
## 6. 下一步行动
| 优先级 | 行动项 | 负责人 | 目标覆盖率 |
|--------|--------|--------|-----------|
| P0 | 修复 `app.go` 编译错误 | TechLead | e2e 可运行 |
| P0 | 补齐 `dialog/service_test.go` | QA | >60% |
| P0 | 补齐 `app/app_test.go` | QA | >40% |
| P1 | 补齐 `store/memory/*_test.go` | QA | >40% |
| P1 | 补齐 `platform/httpx/limits_test.go` | QA | >60% |
| P2 | 补齐 `store/postgres/*_test.go` | QA | >40% |
---
*报告生成:宰相 | 2026-04-30 21:52 GMT+8*