Skip to main content

测试体系

Written: 2026.06
第 18 章跟敲代码:codealong/chapters/ch18_test_system。 这部分代码是本章跟敲版,用来先跑通核心闭环;完整项目源码仍以本讲后文标注的 qa_core/scripts/ 等路径为准。
上一讲RAG 回归验收与入库质量
下一讲LangSmith 观测、Trace 与生产化部署

1. 本讲目标

  • 理解 RAG 系统测试的分层策略
  • 掌握纯逻辑测试、API 保护测试、入库质量检查测试的设计模式
  • 理解为什么 RAG 测试要”绕过 HTTP,直接调用核心函数”
本讲边界 第 18 讲回答“上线前如何证明代码和接口没有被改坏”。它关注 pytest、接口验收和回归保护。第 17 讲已经讲质量指标怎么定义,第 19 讲会讲上线后如何通过 Trace、监控、压测和容量评估持续观察系统。

2. 前置知识 — RAG 测试的特殊挑战

2.1 为什么不能只用 E2E 测试

传统 Web 应用的端到端测试:
RAG 系统的 E2E 测试面临几个问题:
  1. 外部依赖重:需要 Milvus、MySQL、LLM API、本地模型全部在线
  2. 答案不确定性:同一个问题 LLM 可能每次都生成不同的措辞
  3. :一次 RAG 问答需要 2-5 秒,跑 100 条需要很长时间
  4. 成本:每次测试都消耗 LLM API token
解决方案:纯逻辑测试 + 分层测试。

2.2 测试金字塔

本项目的测试主要集中在底部和中部:纯逻辑测试 + 验收逻辑测试。E2E 验收测试通过 scripts/acceptance_smoke.pyscripts/api_e2e_smoke.py 在完整环境中手动运行。

3. 纯逻辑单元测试

3.1 测试文件组织

3.2 意图识别测试(纯逻辑)

关键模式:这些测试验证的是规则路径,不经过 LLM。测试空历史([])触发规则判定,可以验证规则逻辑的正确性。

3.3 source 推断测试(跨场景)

关键模式:使用 resolve(scenario_id) 加载真实场景 TOML 配置,验证 source_patterns 的匹配逻辑。这是对”配置即代码”的测试。

3.4 场景边界检测测试

3.5 检索过滤测试(纯逻辑)

关键模式:不连接 Milvus,只验证表达式字符串的正确性。这比启动 Milvus 再验证快 100 倍。

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 运行全部单元测试

预期输出:
当前测试集包含 104 个 pytest 用例,另有 10 个 subtests。大部分用例是纯逻辑和验收逻辑测试,不依赖 Milvus、MySQL 或 LLM;完整耗时以本机环境为准。

6.2 运行特定测试文件

6.3 在 CI/回归检查中使用


7. 本讲实践闭环

通过标准:核心逻辑可在不依赖外部服务的情况下快速回归,接口和质量门禁能阻断明显退化。

7.1 本讲从 0 到 1 实现闭环

这一讲不是追求“测试越多越好”,而是建立低成本、可重复的回归网。实现顺序如下:
  1. 先写纯逻辑测试,覆盖意图、场景配置、过滤表达式、Prompt 选择。
  2. 再写接口保护测试,覆盖管理令牌、限流、异常响应。
  3. 然后写验收脚本,把质量门禁、文档一致性、核心测试串起来。
  4. 最后保留少量 HTTP/WebSocket 冒烟测试,证明接口真的能通。
实现完成后,相关代码结构应该是下面这张图: 来源:真实代码调用点,见 tests/test_intent_and_scenarios.py
检索过滤、Prompt 选择这类规则不需要连接 Milvus 或 LLM。直接检查函数输出,速度快,也不受环境波动影响。 来源:真实代码调用点,见 tests/test_retrieval_and_prompt.py
API 保护测试重点验证安全边界,例如没有管理令牌不能访问管理接口,超出限流要返回 429。 来源:真实代码调用点,见 tests/test_api_protection.py
项目守护脚本用于把多个检查串成一个上线前命令。它适合本地发布前和 CI 中执行。 来源:命令行验收,对应 scripts/check_project_guardrails.py
闭环验证重点: 验收重点:用低成本纯逻辑测试覆盖大部分规则,少量接口/E2E 只验证关键链路;不要把所有测试都做成依赖 Milvus、MySQL、LLM 的慢测试。

8. 重点掌握

9. 本讲小结

  • 测试金字塔:大量纯逻辑测试(毫秒级)→ 适量验收逻辑测试 → 少量 E2E 验收
  • 纯逻辑测试绕过外部依赖:不连接 Milvus/MySQL/LLM,直接调用核心函数
  • 临时修改 settings + try/finally 恢复:模拟不同配置而不影响其他测试
  • 分组验收测试:确保全局均值不会掩盖局部退化
  • Bad Case 分类测试:验证环境噪声和业务问题被正确分离

10. 本讲能力小结

学完第 18 讲后,你应该能把项目的测试体系讲清楚: 完整课程能力总结放在第 19 讲和课程大纲中,本讲只聚焦“测试与接口验收”这一块。