# Hnoa Testcase Gen

> HNOA 智能驾驶测试用例生成。AI 驱动的测试用例生成工具，支持信号枚举覆盖、状态机全覆盖、多条件组合（2^N）、参数边界泛化（9+ 点）。

- Skill: `evinalian/hnoa-testcase-gen` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add evinalian/hnoa-testcase-gen`
- Raw SKILL.md: https://api.skillmd.com/api/skills/evinalian/hnoa-testcase-gen/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: evinalian (https://skillmd.com/u/evinalian)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/evinalian/hnoa-testcase-gen

---


# 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 | 边界条件、不合理组合 |

---

## 输出格式

```markdown
## [测试用例 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 必须严格按以下步骤执行：

#### 第一步：生成测试用例

1. 执行 `python scripts/main.py generate <id>` 提取需求描述
2. 基于需求描述，按规范生成测试用例（信号枚举覆盖、状态覆盖、条件组合、参数边界泛化）
3. 在终端输出完整的测试用例预览

#### 第二步：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. **自动补充缺失的测试用例**
3. 重新输出审查报告，直到全部通过

#### 第四步：询问保存目录（强制）

审查通过后：
1. **必须询问用户保存目录**（不可跳过）：
   ```
   审查通过！请选择保存目录：
   1. 桌面
   2. Downloads
   3. 自定义路径
   ```
2. 调用 `OutputFormatter.save_all(cases, demand_id, output_dir)` 保存
3. 确认文件路径，列出四种格式文件

---


