# 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 用例）
