# P5.1→NS3 缺失项 #8:各 App 的单元测试用例设计 ## 简要结论 - 状态:✅ 已解决 - 风险等级:🟡 低 - 已建立完整的测试体系,覆盖属性测试(Hypothesis)+ 单元测试 + 集成属性测试,涵盖所有 8 个 AI 应用和 3 个 data_fetcher ## 详细审查 ### 审查范围 - `tests/test_ai_apps/` — AI 应用测试目录(3 个文件) - `tests/test_data_fetchers/` — 数据获取器测试目录(4 个文件) - `tests/test_p5_ai_integration_properties.py` — P5 AI 集成属性测试 - `tests/test_rns1_*.py` — RNS1 Chat 模块属性测试(8 个文件) ### 发现 #### ✅ 测试覆盖情况 **1. AI 应用属性测试(`tests/test_ai_apps/`)** | 文件 | 覆盖内容 | 测试数量 | |------|----------|----------| | `test_app1_props.py` | App1 biz_params 注入不变量、System Prompt Token 预算 | 2 个属性 | | `test_build_prompt_props.py` | App3/4/5/6/7 的 Prompt 结构验证、错误降级、Token 预算 | 13 个属性 | | `test_ai_apps_unit.py` | App1 页面上下文集成、App3/5/7 完整流程 | 6 个单元测试 | **2. 数据获取器测试(`tests/test_data_fetchers/`)** | 文件 | 覆盖内容 | 测试数量 | |------|----------|----------| | `test_member_data_props.py` | 消费数据必填字段、正交易过滤、items_sum 口径、排序、备注截断 | 7 个属性 | | `test_assistant_data_props.py` | 废单排除、排序保持 | 2 个属性 | | `test_page_context_props.py` | 输出长度约束、全页面类型覆盖、敏感字段检测 | 3 个属性 | | `test_data_fetchers_unit.py` | 空记录、FDW 超时、会员不存在、助教不存在等边界 | 10 个单元测试 | **3. P5 集成属性测试(`test_p5_ai_integration_properties.py`)** 覆盖 App2-App8 全部 7 个应用的 JSON 输出结构验证(Pydantic 模型解析),包括: - 枚举值合法性(App3 的 3 分类、App6/8 的 6 分类) - 字段非空约束 - App6 score 范围 [1,10] 及越界拒绝 - 每个应用 100 个随机用例 **4. Chat 模块属性测试(`tests/test_rns1_*.py`)** 8 个文件覆盖 Chat 模块的排序、持久化、引用卡片、对话复用、SSE、标题生成、性能等属性。 #### 测试方法论 - **属性测试(Hypothesis)**:使用 `@given` + `@settings(max_examples=100)` 生成随机输入,验证不变量 - **单元测试(Mock)**:Mock 数据获取函数(`AsyncMock`),不连真实数据库 - **边界条件**:空记录、FDW 超时、数据获取失败降级、超长文本截断等 ### 证据 **测试文件统计**: ``` tests/test_ai_apps/ → 3 文件,21+ 测试用例 tests/test_data_fetchers/ → 4 文件,22+ 测试用例 tests/test_p5_ai_integration_properties.py → 9 个属性测试(App2-8 + score 越界) tests/test_rns1_*.py → 8 文件,Chat 模块全覆盖 ``` **典型属性测试示例(test_build_prompt_props.py)**: ```python # Property 14: 错误降级 — App5 数据获取失败不阻断 def test_prop14_app5_error_degradation(fail_assistant, fail_service, fail_member, fail_notes): # Property 15: Token 预算 — App5 system message 长度 ≤ 8000 def test_prop15_app5_token_budget(records, notes): ``` ### 建议 测试体系已较完整,以下为可选增强方向(非必须): 1. App2(财务洞察)和 App4(关系分析)的 `build_prompt` 属性测试可补充(当前仅有 App4 的结构测试,无 App2 的 Prompt 构建测试) 2. 端到端集成测试(`scripts/ops/test_chat_e2e.py` 已存在但为运维脚本,非 pytest 用例)