| name | hnoa-testcase-gen |
| description | HNOA 智能驾驶测试用例生成。AI 驱动的测试用例生成工具,支持信号枚举覆盖、状态机全覆盖、多条件组合(2^N)、参数边界泛化(9+ 点)。 |
| metadata | {"requires":{"bins":["lark-cli"]},"version":"6.1.0"} |
hnoa-testcase-gen
HNOA 智能驾驶测试用例生成工具。AI 驱动 + 代码辅助,确保测试覆盖完整性。
触发条件
当用户请求涉及以下意图时触发:
- 生成/补充 HNOA 测试用例
- 分析测试覆盖情况
- 查看需求统计
- 同步飞书需求数据
关键词:HNOA、测试用例、生成、覆盖、FDes
用户交互方式
用户通过自然语言与 AI 对话即可完成所有操作,无需记忆命令。
| 用户想做的事 | 自然语言示例 |
|---|
| 生成测试用例 | "帮我生成 FDes-39-02 的测试用例" |
| 分析需求覆盖 | "分析 FDes-05-01 的覆盖情况" |
| 查看全局统计 | "看看 HNOA 测试用例覆盖统计" |
| 同步飞书数据 | "同步最新的 HNOA 需求数据" |
| 导入外部文档 | "从飞书链接导入需求文档 https://..." |
AI 内部通过以下 CLI 命令驱动,用户无需关心:
| 命令 | 说明 |
|---|
python scripts/main.py generate <id> | 提取需求描述,交给 AI 生成用例 |
python scripts/main.py analyze <id> | 分析指定需求的信号、条件模式 |
python scripts/main.py coverage | 全局覆盖统计 |
python scripts/main.py sync | 从飞书同步数据到本地缓存 |
执行流程
generate(AI 驱动)
用户: 生成 FDes-39-02 的测试用例
AI:
1. 执行命令获取需求描述
2. 解析需求:提取信号、状态、条件、参数
3. 生成测试用例(Markdown 格式)
4. 输出检查清单确认覆盖完整性
5. 询问用户保存目录并导出文件(Markdown/JSON/CSV 三种格式)
重要:生成测试用例后,必须询问用户保存目录:
- 提供选项:桌面、Downloads、自定义路径
- 导出格式:
.md(文档)、.json(程序导入)、.csv(Excel)
测试用例生成规范
1. 信号枚举覆盖
每个信号枚举值至少 1 条用例
信号 IVI_VoiceTimegapReq 有枚举:
- TAUGAP_1, TAUGAP_2, TAUGAP_3, TAUGAP_4, TAUGAP_5
→ 生成 5 条用例,每个枚举值 1 条
2. 状态覆盖
覆盖所有系统状态
NOA 状态:
- OFF, Passive, Standby, Active, Exit, TOR, Error
→ 状态跳转需求需覆盖所有状态组合
3. 多条件组合(2^N)
AND 条件:穷举所有组合
条件 A AND 条件 B
→ 4 种组合:
1. A=True, B=True (正向, P0)
2. A=True, B=False (反向, P2)
3. A=False, B=True (反向, P2)
4. A=False, B=False (反向, P2)
OR 条件:独立用例
条件 A OR 条件 B
→ 2 条用例:
1. 满足 A (B 不满足), P1
2. 满足 B (A 不满足), P1
4. 参数边界泛化(9+ 点)
每个数值参数至少 9 个测试点:
| 类型 | 值 | 预期 |
|---|
| 下限-1 | min-1 | invalid |
| 下限 | min | valid |
| 下限+1 | min+1 | valid |
| 典型值1 | low | valid |
| 典型值2 | mid | valid |
| 典型值3 | high | valid |
| 上限-1 | max-1 | valid |
| 上限 | max | valid |
| 上限+1 | max+1 | invalid |
示例:速度参数 0~120 kph
测试点:
-1, 0, 1, 30, 60, 90, 119, 120, 121 kph
5. 用例等级
| 等级 | 场景 |
|---|
| P0 | 安全相关、核心路径、故障诊断 |
| P1 | 标准功能、HMI 显示 |
| P2 | 边界条件、不合理组合 |
输出格式
## [测试用例 ID]
| 属性 | 内容 |
|------|------|
| 测试用例 ID | TC-SSTS-HNOA-xxx-001 |
| 用例等级 | P0 |
### 测试描述
自车:xxx
环境:xxx
### 测试步骤
1. 初始状态:{信号名=值}
2. 触发条件:xxx
3. 验证:{信号名=值}
### 通过标准
- 信号值正确:{信号名=值}
- 系统状态正确:xxx
---
## 检查清单
- [ ] 所有信号枚举值已覆盖
- [ ] 所有系统状态已覆盖
- [ ] AND/OR 条件已正确组合
- [ ] 数值参数已 9+ 点覆盖
- [ ] 用例等级设置正确
文件结构
scripts/
├── main.py # CLI 入口 (<200 行)
├── engine.py # 边界测试点生成 (<200 行)
├── data_loader.py # 飞书数据加载
├── analyzer.py # 信号提取
└── output_formatter.py # 格式化输出
数据同步机制
自动同步
- 首次使用:AI 自动检测缓存状态,如缓存缺失或过期(>24 小时),自动从飞书拉取最新数据
- 定时更新:每次使用间隔超过 24 小时,自动后台同步
- 手动同步:用户可随时说"同步最新数据"强制刷新
缓存说明
- 缓存在
cache/ 目录,包含需求和测试用例的 JSON 快照
- 压缩包已预置缓存数据,解压即用(用户首次使用时仍会自动拉取最新数据)
- 同步失败时自动降级使用本地旧缓存,不影响功能
限制
- lark-cli 编码:Windows 中文终端输出可能乱码,json 文件中的是正常的(数据正确,仅显示问题)
- 需求描述缺失:FDes 系列需求如未收录,需手动提供描述
- 图片内容:无法提取飞书文档中的图片信息
AI 行为规范
generate 完整流程
当用户请求生成测试用例时,AI 必须严格按以下步骤执行:
第一步:生成测试用例
- 执行
python scripts/main.py generate <id> 提取需求描述
- 基于需求描述,按规范生成测试用例(信号枚举覆盖、状态覆盖、条件组合、参数边界泛化)
- 在终端输出完整的测试用例预览
第二步:AI 审查(强制)
生成完成后,AI 必须逐项自检并输出审查报告:
━━━ AI 审查报告 ━━━
1. 信号枚举覆盖
☑ 已覆盖信号:IVI_VoiceTimegapReq、ADS_NOAFunctionStatus ...
☑ 每个枚举值至少 1 条用例
☐ 缺失枚举值:[如有则列出]
2. 状态覆盖
☑ 覆盖状态:OFF / Passive / Standby / Active / Exit / TOR / Error
☐ 未覆盖状态:[如有则列出]
3. 多条件组合(AND/OR)
☑ AND 条件已 2^N 展开(N=3 → 8 条)
☑ OR 条件已独立覆盖
☐ 遗漏组合:[如有则列出]
4. 参数边界泛化(9+ 点)
☑ 速度参数 0~130:-1/0/1/32/65/97/129/130/131 已覆盖
☑ 时距参数 1~5:0/1/2/3/4/5/6 已覆盖
☐ 未覆盖参数:[如有则列出]
5. 用例等级分布
P0: 5 条 | P1: 12 条 | P2: 8 条
☑ P0 均为安全/核心路径
☑ P2 均为边界/异常场景
━━━ 审查结论 ━━━
通过项:5/5
☑ 全部通过,可以保存
第三步:审查未通过时
如果审查报告存在 ☐ 未通过项,AI 必须:
- 明确指出遗漏了什么
- 自动补充缺失的测试用例
- 重新输出审查报告,直到全部通过
第四步:询问保存目录(强制)
审查通过后:
- 必须询问用户保存目录(不可跳过):
审查通过!请选择保存目录:
1. 桌面
2. Downloads
3. 自定义路径
- 调用
OutputFormatter.save_all(cases, demand_id, output_dir) 保存
- 确认文件路径,列出四种格式文件