Pytest Generator — 执行总纲【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills执行顺序约束强制严格按照以下步骤编号顺序执行。前置条件未满足禁止启动该步骤。 详细规则见本文件后续章节执行顺序节未覆盖的细节以各章节为准。Read 本文件 02-constraints.md全程适用 收集输入文件 前置无按需 Read01-code-templates.md/03-pitfalls.md/ aclnn 文档「计算公式」节 → 生成 S6_test_{op_name}.py 前置Step 1 完成按02-constraints.md「验证流程」执行自审 门禁验证 tilingkey 覆盖率 前置Step 2 完成角色将 S5_mapped_cases_low.json已映射的 tensor 构造配置转化为一个完整的、可直接pytest执行的测试文件 S6_test_{op_name}.py。输入文件必须用途S5_mapped_cases_low.json是已映射的参数组合含 params tensors每个 case 已有完整 shape/dtypeS5_mapping_spec.md是确定每个 input/output 的 param_typeREQUIRED/DYNAMIC派发 API 调用/reference/断言模板S2P2_param_def.json是参数定义用于理解参数含义不需要再做过滤算子接口信息是函数签名、输入输出 tensor 定义、调用方式docs/aclnn*.md「计算公式」节是仅读该节作为 reference 实现的唯一依据派发机制S5_mapping_spec.md的输入 tensor 和输出 tensor 各节 header 已标注每个 tensor 的 param_type### {name}REQUIRED或### {name}DYNAMIC。子 agent 生成代码时对每个 input/output 变量读其 param_type选择对应分支param_typeJSON spec 结构Python 变量API 调用reference 返回REQUIREDdictTensorop(tensor)TensorDYNAMIClist[dict]list[Tensor]op([t1, t2, ...])list[Tensor]无默认行为每个 tensor 显式匹配 param_type。混合算子中每个 input/output 独立派发如 input_a 走 DYNAMIC 分支input_b 走 REQUIRED 分支。tensor 构造统一处理输入 tensor 构造和输出预分配使用isinstance(spec, list)运行时判断一套模板通吃两种 param_type见 01-code-templates.md。API 调用、reference 实现、断言逻辑由子 agent 按 param_type 显式派发生成。输出文件用途conftest.pypytest 插件入口注册--cases-file命令行选项S6_test_{op_name}.py完整的 pytest 测试文件文件结构要求conftest.pypytest_addoption是 conftest 级别 hook必须在 pytest 解析命令行参数之前注册因此只能放在conftest.py中不能放在测试模块中。conftest.py — pytest 插件入口注册命令行选项 import pytest def pytest_addoption(parser): parser.addoption(--cases-file, defaultS5_mapped_cases_low.json)S6_test_{op_name}.py测试文件必须包含以下部分按此顺序# 1. 导入NPU 不可用时整个文件 skip而非假 PASS import pytest import torch torch_npu pytest.importorskip(torch_npu) import json, os _CASES_DIR os.path.dirname(os.path.abspath(__file__)) # 2. 常量DTYPE_MAP / TOLERANCE 详见 01-code-templates.md # 3. Reference 实现仅基于 aclnn 文档「计算公式」一节详见 03-pitfalls.md def reference_{op_name}(...): CPU 参考实现。严格按 aclnn 文档计算公式节编写不读其他节。 ... # 4. 测试函数 def pytest_generate_tests(metafunc): if p in metafunc.fixturenames: cases_file metafunc.config.getoption(--cases-file, S5_mapped_cases_low.json) with open(os.path.join(_CASES_DIR, cases_file)) as _f: cases json.load(_f)[cases] metafunc.parametrize(p, cases, idslambda c: c[id]) def test_{op_name}(p): tensors p[tensors] params p[params] # a. 构造输入 tensor运行时 isinstance 判断 REQUIRED/DYNAMIC详见 01-code-templates.md # b. 调用算子NPU— 按 S5_mapping_spec.md 中各 input 的 param_type 派发 # REQUIRED: npu_out torch_npu.npu_xxx(input_x, ...) # DYNAMIC: npu_out torch._foreach_xxx(input_x_list, ...) # c. 调用 referenceCPU— 按 S5_mapping_spec.md 中各 output 的 param_type 派发 # REQUIRED: ref_out reference(x) # DYNAMIC: ref_out [reference(t) for t in x_list] # d. 断言shape dtype 数值精度按 param_type 派发详见 01-code-templates.md关键规则S5_mapped_cases_low.json 经过 Step 5 mapper 映射 validate_config 校验每个 case 的 tensor shape/dtype 均为合法值。不需要is_valid_combo()或额外的 shape 过滤。直接使用全部 PARAMS。用例选择单个S6_test_{op_name}.py通过参数控制数据源--cases-file切换数据源全量版pytest ... --cases-fileS5_mapped_cases_high.json低覆盖版pytest ... --cases-fileS5_mapped_cases_low.json用例筛选使用 pytest 内置-k表达式基于case[id]单个pytest ... -k case00001多个pytest ... -k case00001 or case00008与数据源组合pytest ... --cases-fileS5_mapped_cases_low.json -k network_00000所有逻辑DTYPE_MAP / TOLERANCE / reference / 测试函数 / 断言 / 约束 / 铁律完全一致。生成后自审清单生成conftest.pyS6_test_{op_name}.py后执行以下验证发现问题就修修完再报告python -m py_compile conftest.py S6_test_{op_name}.py— 无语法错误pytest --cases-fileS5_mapped_cases_low.json --collect-only S6_test_{op_name}.py—--cases-file可识别能收集到用例ids 是否唯一ASCEND_GLOBAL_LOG_LEVEL1 pytest S6_test_{op_name}.py --cases-fileS5_mapped_cases_low.json -q --tbline— 全部用例合法执行0 个 ERROR / RuntimeError / AttributeErrorNPU 不可用时是否正确 skip 而非假 PASSplog 是否成功复制到tilingkey_logs/{op_name}_full.log覆盖率脚本是否生成S6_tilingkey_coverage.json含全局与 per_group 覆盖率单用例执行后能否从 plog 提取 tiling keygrep Tiling Key: $(ls -t ~/ascend/log/debug/plog/plog-*.log | head -1)文件索引文件职责读入时机01-code-templates.mdDTYPE_MAP/TOLERANCE 常量、make_data 函数、tensor 构造模板、断言模板、✅/❌ 示例编写 S6_test_{op_name}.py 代码时02-constraints.md铁律3条 NO 规则 验证流程 plog 采集 严格禁止9条全程适用03-pitfalls.md6个实战规则API探测/golden来源/交叉验证/假PASS/inf-nan/可变输出编写 reference 和断言时【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考