算子测试计划与结果模板

本模板用于在新增算子、修改接口、优化实现或修复缺陷时记录测试范围和执行结果。它关注正确性、边界、异常输入、兼容性和回归风险;性能数据应采用独立且同口径的 benchmark 记录。

使用规则

  1. 在开发前填写“测试范围”和“用例设计”,用于确认本次变更需要覆盖什么。
  2. 在提交 PR 前填写“执行环境”“执行结果”和“未覆盖风险”。
  3. 每个用例应能够映射到一个接口约束、代码分支、缺陷或回归风险。
  4. 正确性结果必须说明参考实现和比较标准。精确算子不要只使用 allclose,近似算子不要只写“结果一致”。
  5. 没有 NPU 环境时可填写静态检查或 dry_run,但不能把未执行用例标记为通过。
  6. 不在文档中粘贴大段日志、设备地址、账号、令牌、私有数据或内部链接。

模板正文

# `<operator_name>` 测试计划与结果

## 变更摘要

- 关联 PR / Issue:`<链接或编号>`
- 变更类型:`<新增算子 / 接口变更 / 实现优化 / 缺陷修复 / 文档补测>`
- 影响范围:`<op_host / tiling / op_kernel / wrapper / example / build>`
- 主要风险:`<接口兼容、shape 边界、dtype、数值精度、多核、workspace 等>`

## 被测接口

| 项目 | 内容 |
| --- | --- |
| 算子名称 | `<operator_name>` |
| 调用方式 | `<ACLNN / PyTorch Extension / 直调 / 其他>` |
| 输入 | `<名称、顺序和必选/可选>` |
| 输出 | `<名称、顺序和必选/可选>` |
| 属性 | `<名称、类型、默认值和值域>` |
| 参考实现 | `<PyTorch / NumPy / CPU 实现 / 数学定义>` |

## 测试范围

### 测试因子

| 因子 | 取值或分组 | 选择依据 |
| --- | --- | --- |
| dtype | `<例如 FP16 / FP32 / INT32>` | `<接口支持集合>` |
| shape / rank | `<典型、小边界、大边界、动态 shape>` | `<接口约束或巡检 workload>` |
| format / layout | `<ND / NCHW / 其他>` | `<注册定义>` |
| 属性组合 | `<默认值、边界值、开关组合>` | `<分支覆盖>` |
| 数据分布 | `<随机、全相同、已排序、重复值、稀疏、极值>` | `<算法特性>` |
| 特殊值 | `<0、负数、NaN、Inf、最大/最小值;不适用则删除>` | `<数值风险>` |
| 调用入口 | `<Python / ACLNN C++ / 其他>` | `<公开接口>` |

### 不在本次范围

- `<明确列出不支持、未实现或由其他 PR 验证的内容>`

## 正确性标准

| 输出 | 参考结果 | 比较方式 | 阈值或规则 |
| --- | --- | --- | --- |
| `<output>` | `<reference>` | `<exact / atol+rtol / 指标>` | `<具体值或公式>` |

补充规则:

- 随机输入固定 seed:`<seed>`- 有效输出区间:`<例如 output[:unique_count]>`- 可选输出关闭时的期望行为:`<不存在 / 空 Tensor / 内容未定义>`- 多输出关系:`<例如 output[inverse[i]] == input[i]>`- 梯度验证:`<解析参考 / autograd / 数值差分 / 不适用>`## 用例设计

### 基础正确性

| ID | dtype | shape | 属性 | 数据特征 | 检查点 | 预期 |
| --- | --- | --- | --- | --- | --- | --- |
| FUNC-001 | `<dtype>` | `<shape>` | `<attrs>` | `<distribution>` | `<outputs>` | `<expected>` |

### 边界用例

| ID | 边界 | 输入 | 检查点 | 预期 |
| --- | --- | --- | --- | --- |
| BOUND-001 | `<最小合法 shape>` | `<input>` | `<output / status>` | `<expected>` |
| BOUND-002 | `<分块、对齐或多核边界>` | `<input>` | `<output / status>` | `<expected>` |

建议按算子情况考虑:

- 最小合法元素数或 batch。
- tile、block、workspace 或对齐边界的前一项、边界值和后一项。
- 单核与多核切换点。
- 动态 shape 的最小值、典型值和最大声明值。
- 可选输出或属性的所有有效组合。

### 异常输入

| ID | 非法条件 | 输入 | 期望错误 | 判定方式 |
| --- | --- | --- | --- | --- |
| NEG-001 | `<不支持 dtype / rank / shape / 属性>` | `<input>` | `<错误码或明确失败>` | `<日志、返回值或异常类型>` |

不要把崩溃、卡死或静默错误当作可接受的异常处理。

### 回归用例

| ID | 来源 | 防止回归的问题 | 输入 | 检查点 |
| --- | --- | --- | --- | --- |
| REG-001 | `<Issue / 历史缺陷 / 关键场景>` | `<bug description>` | `<input>` | `<expected>` |

### 电力巡检场景用例

| ID | 场景 | workload 表征 | 输入规模 | 业务相关检查点 |
| --- | --- | --- | --- | --- |
| SCENE-001 | `<视觉 / 点云 / 语音 / 通用支撑>` | `<数据特征>` | `<shape>` | `<只写可验证行为>` |

业务场景用例用于确认输入规模和数据特征,不用于替代端到端业务效果验证。

## 执行环境

| 项目 | 内容 |
| --- | --- |
| 芯片 / 设备 | `<model>` |
| CANN | `<version>` |
| 驱动 / 固件 | `<version>` |
| Python | `<version 或不适用>` |
| PyTorch / torch_npu | `<version 或不适用>` |
| 编译器 | `<version>` |
| Commit | `<sha>` |

## 执行命令

标明工作目录:

```bash
cd <working-directory>
<build command>
<test command>
```

## 执行结果

| 用例 ID | 状态 | 关键结果 | 证据位置 | 备注 |
| --- | --- | --- | --- | --- |
| FUNC-001 | `<PASS / FAIL / BLOCKED / NOT_RUN>` | `<误差、输出或错误码>` | `<日志文件或命令输出摘要>` | `<notes>` |

状态定义:

- `PASS`:已实际执行并满足预期。
- `FAIL`:已执行但不满足预期。
- `BLOCKED`:受环境、依赖或硬件条件阻塞。
- `NOT_RUN`:未执行,必须说明原因。

## 失败分析

| 用例 ID | 现象 | 初步定位 | 处理计划 | 是否阻塞合入 |
| --- | --- | --- | --- | --- |
| `<ID>` | `<symptom>` | `<evidence-based diagnosis>` | `<fix / follow-up>` | `<yes / no>` |

## 覆盖摘要

| 维度 | 已覆盖 | 未覆盖 |
| --- | --- | --- |
| dtype | `<list>` | `<list>` |
| shape / rank | `<list>` | `<list>` |
| 属性组合 | `<list>` | `<list>` |
| 调用入口 | `<list>` | `<list>` |
| 正确性 / 梯度 | `<list>` | `<list>` |
| 异常输入 | `<list>` | `<list>` |

## 未覆盖风险

- `<未覆盖项、原因、可能影响和后续计划>`

## 结论

- 总用例数:`<count>`
- PASS:`<count>`
- FAIL:`<count>`
- BLOCKED:`<count>`
- NOT_RUN:`<count>`
- 合入建议:`<通过 / 修复后通过 / 暂不建议合入>`

提交前检查

  • 测试因子来自真实接口约束,不是任意枚举。
  • 用例覆盖基础、边界、异常输入和回归风险。
  • 每个 PASS 都有实际执行命令和可复核结果。
  • 参考实现、随机种子、有效输出区间和误差标准已记录。
  • BLOCKED、NOT_RUN 和未覆盖风险没有被隐藏。
  • 测试结果中不包含敏感信息、私有数据或不可访问的本地路径。