测试体系
Written: 2026.06第 18 章跟敲代码:上一讲:RAG 回归验收与入库质量codealong/chapters/ch18_test_system。 这部分代码是本章跟敲版,用来先跑通核心闭环;完整项目源码仍以本讲后文标注的qa_core/、scripts/等路径为准。
下一讲:LangSmith 观测、Trace 与生产化部署
1. 本讲目标
- 理解 RAG 系统测试的分层策略
- 掌握纯逻辑测试、API 保护测试、入库质量检查测试的设计模式
- 理解为什么 RAG 测试要”绕过 HTTP,直接调用核心函数”
本讲边界 第 18 讲回答“上线前如何证明代码和接口没有被改坏”。它关注 pytest、接口验收和回归保护。第 17 讲已经讲质量指标怎么定义,第 19 讲会讲上线后如何通过 Trace、监控、压测和容量评估持续观察系统。
2. 前置知识 — RAG 测试的特殊挑战
2.1 为什么不能只用 E2E 测试
传统 Web 应用的端到端测试:- 外部依赖重:需要 Milvus、MySQL、LLM API、本地模型全部在线
- 答案不确定性:同一个问题 LLM 可能每次都生成不同的措辞
- 慢:一次 RAG 问答需要 2-5 秒,跑 100 条需要很长时间
- 成本:每次测试都消耗 LLM API token
2.2 测试金字塔
本项目的测试主要集中在底部和中部:纯逻辑测试 + 验收逻辑测试。E2E 验收测试通过scripts/acceptance_smoke.py 和 scripts/api_e2e_smoke.py 在完整环境中手动运行。
3. 纯逻辑单元测试
3.1 测试文件组织
3.2 意图识别测试(纯逻辑)
[])触发规则判定,可以验证规则逻辑的正确性。
3.3 source 推断测试(跨场景)
resolve(scenario_id) 加载真实场景 TOML 配置,验证 source_patterns 的匹配逻辑。这是对”配置即代码”的测试。
3.4 场景边界检测测试
3.5 检索过滤测试(纯逻辑)
3.6 上下文构建测试
3.7 Prompt Profile 选择测试
4. API 保护测试
4.1 管理令牌验证
- 不启动 FastAPI 服务器,直接调用依赖函数
- 临时修改
settings对象来模拟不同配置 try/finally确保测试后恢复原始配置
4.2 限流测试
5. 验收逻辑测试
5.1 入库质量检查测试
5.2 RAG 回归验收 — 分组回归检测
5.3 Bad Case 分类测试
6. 运行测试
6.1 运行全部单元测试
6.2 运行特定测试文件
6.3 在 CI/回归检查中使用
7. 本讲实践闭环
| 项目 | 内容 |
|---|---|
| 本讲类型 | 工程治理 |
| 实践产物 | pytest 分层测试、接口验收、guardrails 守护检查 |
| 是否进入最终项目 | 是 |
| 验收方式 | 运行单元测试、接口验收和项目守护检查 |
| 后续落点 | 第 19 讲作为上线前检查和回归保障 |
7.1 本讲从 0 到 1 实现闭环
这一讲不是追求“测试越多越好”,而是建立低成本、可重复的回归网。实现顺序如下:- 先写纯逻辑测试,覆盖意图、场景配置、过滤表达式、Prompt 选择。
- 再写接口保护测试,覆盖管理令牌、限流、异常响应。
- 然后写验收脚本,把质量门禁、文档一致性、核心测试串起来。
- 最后保留少量 HTTP/WebSocket 冒烟测试,证明接口真的能通。
tests/test_intent_and_scenarios.py。
tests/test_retrieval_and_prompt.py。
tests/test_api_protection.py。
scripts/check_project_guardrails.py。
| 验证项 | 验证方式 | 期望结果 |
|---|---|---|
| 纯逻辑测试 | 跑 pytest | 不依赖外部服务也能快速回归 |
| API 保护 | 跑接口保护测试 | 未授权和超限请求被拦截 |
| 质量门禁 | 跑 gate 测试 | 指标退化会失败 |
| 文档一致性 | 跑 docs 检查 | 场景、路径、讲义不漂移 |
| 冒烟测试 | 跑 HTTP/WS smoke | 关键接口可访问 |
8. 重点掌握
| 优先级 | 内容 | 原因 |
|---|---|---|
| ★★★ 必会 | RAG 测试金字塔:大量纯逻辑单元测试(毫秒级)→ 适量验收逻辑测试 → 少量 E2E 验收 | 理解 RAG 系统测试的分层策略 |
| ★★★ 必会 | 纯逻辑测试模式:绕过 HTTP,直接调用核心函数,不依赖 Milvus/MySQL/LLM | RAG 测试的核心方法论,面试常问 |
| ★★★ 必会 | 验收逻辑测试验证分组回归检测:全局均值正常但某个场景退化时,验收必须拒绝 | 理解分组验收的测试方法 |
| ★★ 理解 | 意图识别测试验证规则路径(空历史 [] 触发规则判定,不经过 LLM) | 纯逻辑测试的具体例子 |
| ★★ 理解 | 检索过滤测试验证表达式字符串(不连接 Milvus,只检查 expr 字符串内容) | 绕过外部依赖的测试技巧 |
| ★★ 理解 | API 保护测试:临时修改 settings + try/finally 恢复的模式 | 模拟不同配置的测试技巧 |
| ★★ 理解 | Prompt Profile 选择测试:pricing 问题必须用 pricing_guard 而非意图兜底 | 验证选择优先级的正确性 |
| ★ 了解 | 测试文件组织方式(4 个测试文件,104 个用例) | 了解测试规模 |
| ★ 了解 | 运行测试的命令(pytest)和 CI 集成方式(check_project_guardrails) | 了解如何执行测试 |
9. 本讲小结
- 测试金字塔:大量纯逻辑测试(毫秒级)→ 适量验收逻辑测试 → 少量 E2E 验收
- 纯逻辑测试绕过外部依赖:不连接 Milvus/MySQL/LLM,直接调用核心函数
- 临时修改 settings + try/finally 恢复:模拟不同配置而不影响其他测试
- 分组验收测试:确保全局均值不会掩盖局部退化
- Bad Case 分类测试:验证环境噪声和业务问题被正确分离
10. 本讲能力小结
学完第 18 讲后,你应该能把项目的测试体系讲清楚:| 能力 | 对应内容 |
|---|---|
| 分层测试设计 | 区分纯逻辑测试、接口保护测试、验收逻辑测试和少量 E2E 验收 |
| 低成本回归 | 用毫秒级纯逻辑测试覆盖意图、过滤、Prompt 选择等核心规则 |
| 外部依赖隔离 | 测试时不直接依赖 Milvus/MySQL/LLM,降低环境噪声 |
| 验收门禁 | 用统一验收逻辑判断质量是否退化,避免“看起来能跑”但效果变差 |
| Bad Case 沉淀 | 把失败案例转成可复现的测试数据,持续补强系统边界 |

