|
1 | | -# 新增API 测试及验收规范 |
2 | | - |
3 | | -## CI通过性 |
4 | | - |
5 | | -进入PaddlePaddle主库的代码,涉及到的相关检测CI必须全部Pass。用来验证对之前功能点的兼容和影响,用来保障新合入代码对历史代码不产生影响。 |
6 | | - |
7 | | -新增代码必须要有相应的单测保障测试覆盖率达到准入要求(测试覆盖率(行覆盖率)90%)。 |
8 | | - |
9 | | -## PR内容描述要求 |
10 | | - |
11 | | -单元测试内容需要和开发代码放在同一个PR提交,后续修改也需要基于此PR。 |
12 | | - |
13 | | -PR内容描述测试部分需要明确指出测试相关的文件列表,并写明测试Case的运行方法和自测结果。 |
14 | | - |
15 | | -## API测试内容及单元测试要求 |
16 | | - |
17 | | -API命名,参数命名,暴露方式,代码目录层级需按照设计文档要求保持一致或参考API通用设计文档的要求。 |
18 | | - |
19 | | -新增API测试代码必须覆盖动态图和静态图的测试场景。(原则上需要支持动态图和静态图两种方式调用,如果仅支持其中一种,需要在设计文档RFC和API文档中体现) |
20 | | - |
21 | | -新增API测试代码必须覆盖CPU和GPU的测试场景。(原则上需要支持CPU和GPU两种硬件平台调用,如果仅支持其中一种,需要在设计文档RFC和API文档中体现) |
22 | | - |
23 | | -新增API涉及tensor的dtype需要有相关Case进行测试覆盖。 |
24 | | - |
25 | | -新增API的入参,需要对全部入参进行参数有效性和边界值测试。确定每个入参都可以正确生效。 |
26 | | - |
27 | | -新增API的前向计算,需要对数值的绝对正确性进行验证,需要有通过numpy或其他数学方法实现的函数的对比结果。 |
28 | | - |
29 | | -新增API的反向计算,需要复用现有单测框架反向计算验证方式保障反向正确性。 |
30 | | - |
31 | | -- 使用Python组合方式新增的API,由于反向计算已经在各组合API单测中分别验证了,因此,该API的反向计算不要求验证。 |
32 | | -- 如现有单测框架无法满足要求,需要通过numpy推导或函数直接实现反向等方式验证反向计算结果正确性。 |
33 | | - |
34 | | -异常测试,对于参数异常值输入,应该有友好的报错信息及异常反馈,需要有相关测试Case验证。 |
35 | | - |
36 | | -## 文档测试 |
37 | | - |
38 | | -中文文档、英文文档齐全,内容一一对应。 |
39 | | - |
40 | | -文档清晰可读,易于用户使用 |
41 | | - |
42 | | -给出易于理解的api介绍,文字描述,公式描述。 |
43 | | - |
44 | | -参数命名通俗易懂无歧义,明确给出传参类型,对参数含义以及使用方法进行详细说明,对返回值进行详细说明。 |
45 | | - |
46 | | -异常类型和含义进行详细说明。 |
47 | | - |
48 | | -示例代码需要做到复制粘贴即可运行,并且需要明确给出预期运行结果(如果可以)。 |
49 | | - |
50 | | -阅读无障碍:无错别字、上下文连贯、内容清晰易懂、链接可正常跳转、图片公式显示正常。 |
| 1 | +# API单测开发及验收规范 |
| 2 | + |
| 3 | +## API单测开发规范 |
| 4 | + |
| 5 | +API单测的测试点需覆盖以下场景: |
| 6 | + |
| 7 | +- **编程范式场景**:常规覆盖动态图和静态图的测试场景,如果仅支持其中一种,需要在设计文档RFC和API文档中体现。 |
| 8 | +- **硬件场景**:常规需覆盖CPU、GPU两种测试场景,如果仅支持其中一种,需要在设计文档RFC和API文档中体现。部分需覆盖XPU、ARM等硬件场景。 |
| 9 | +- **Tensor精度场景**:常规需要支持FP32、FP64,部分需支持FP16、INT8、INT16、INT32、INT64等。 |
| 10 | +- **参数组合场景**:常规覆盖API的全部入参,需要对全部入参进行参数有效性和边界值测试,同时可选参数也需有相应的测试覆盖。 |
| 11 | +- **计算精度**:需要保证前向计算、反向计算的精度正确性。 |
| 12 | + - 前向计算:需要有通过numpy或其他数学方法实现的函数的对比结果。 |
| 13 | + - 反向计算:需要复用现有单测框架反向计算验证方式保障反向正确性。注意:1)使用Python组合方式新增的API,由于反向计算已经在各组合API单测中分别验证了,因此,该API的反向计算不要求验证。2)如现有单测框架无法满足要求,需要通过numpy推导或函数直接实现反向等方式验证反向计算结果正确性。 |
| 14 | +- **异常测试**:需对于参数异常值输入,应该有友好的报错信息及异常反馈。 |
| 15 | +- 除了以上,还需注意: |
| 16 | + - [OP单测必须使用大尺寸输入](https://github.com/PaddlePaddle/Paddle/wiki/OP-test-input-shape-requirements) |
| 17 | + - [反向Op必须调用check_grad](https://github.com/PaddlePaddle/Paddle/wiki/Gradient-Check-Is-Required-for-Op-Test) |
| 18 | + - [单测精度中atol, rtol, eps, max_relative_error, 不允许自行放大阈值](https://github.com/PaddlePaddle/Paddle/wiki/OP-test-accuracy-requirements) |
| 19 | + - [OP单测精度必须覆盖float64](https://github.com/PaddlePaddle/Paddle/wiki/Upgrade-OP-Precision-to-Float64) |
| 20 | + - [Op单测必须通过“编译时/运行时一致性检查”](https://github.com/PaddlePaddle/Paddle/wiki/Compile_vs_Runtime-Check-Specification) |
| 21 | + - [Sequence相关Op单测中必须包含batch size为1的LoDTensor输入](https://github.com/PaddlePaddle/Paddle/wiki/It-is-required-to-include-LoDTensor-input-with-batch_size=1-in-sequence-OP-test) |
| 22 | + - [Sequence相关Op单测中必须包含instance size为0的LoDTensor输入](https://github.com/PaddlePaddle/Paddle/wiki/It-is-required-to-include-LoDTensor-input-with-instance_size=0-in-sequence-OP-test) |
| 23 | + |
| 24 | +## API单测验收规范 |
| 25 | + |
| 26 | +API单测的验收包含两方面,一方面是要验收是否符合上述的开发规范,另一方面要验收是否符合以下的通用规范: |
| 27 | + |
| 28 | +- **命名规范**: |
| 29 | + - 单测中需要有充分的断言检查,单测case禁止使用test1/test2等无实际含义的命名方式。 |
| 30 | + - API单测命名、参数命名、暴露方式、代码目录层级需要与设计文档保持一致,可参考[API通用设计文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/dev_guides/api_contributing_guides/api_design_guidelines_standard_cn.html)要求。 |
| 31 | +- **提交规范**: |
| 32 | + - 单元测试内容需要和开发代码放在同一个PR提交,后续修改也需要基于此PR。 |
| 33 | + - 对于API单测增强任务,需在PR描述中(可参考 [PR41191](https://github.com/PaddlePaddle/Paddle/pull/41191))写明每个算子缺失的单测、问题定位及修复思路的简单描述 |
| 34 | +- **覆盖率规范**:PR需要通过所有的CI验证,且`PR-CI-Coverage`需要满足新增代码行覆盖率达到90%以上,覆盖率信息可通过CI详情页面查看,如下: |
| 35 | + |
| 36 | +- **耗时规范**: |
| 37 | + - 新增单测的执行不允许超过15s,`PR-CI-Coverage`有相应的检查,检查逻辑可见 `tools/check_added_ut.sh`。如果你新增的单测无法在15s内执行完成,可以尝试减少数据维度(可见[链接](https://github.com/PaddlePaddle/Paddle/pull/42267/commits/17344408d69f10e9fe5cf3200be1e381bc454694#diff-02f1ef59dfd03557054d7b20c9128ac9828735fc1f8be9e44d0587a96a06f685L236))或通过在[CMakeLists.txt](https://github.com/PaddlePaddle/Paddle/blob/a1d87776ac500b1a3c3250dd9897f103515909c6/python/paddle/fluid/tests/unittests/CMakeLists.txt#L617-L618)指定该单测的Timeout时间。如果你通过修改Timeout时间,你需要在PR描述中说明原因,同时会有相关同学review后进行approve后才能合入。原则上Timeout设定时间不能超过120s。 |
| 38 | +  |
| 39 | + - 现有单测的修改原则上不允许超过120s,`PR-CI-Coverage`有相应的检查,若有特殊情况可修改[CMakeLists.txt](https://github.com/PaddlePaddle/Paddle/blob/a1d87776ac500b1a3c3250dd9897f103515909c6/python/paddle/fluid/tests/unittests/CMakeLists.txt#L617-L618)文件中该单测的Timeout时间,处理逻辑同上诉新增单测超过15s一致。 |
| 40 | +- **单测retry机制**:为提高单测执行效率,所有的单测均以一定的并发度执行,而这样的策略可能会引起单测随机挂。因此对失败的单测设定了retry机制,一共retry四次,如果成功率未达到50%,就认为该单测可能存在问题,CI失败。 |
51 | 41 |
|
52 | 42 | ## 交流与改进 |
53 | 43 |
|
54 | | -提测代码的单测部分必须paddlepaddle测试人员review,确保完整覆盖了待测功能点后,会给予approved。如果review过程中发现测试缺失和遗漏的测试点,会通过github代码行comment的和request changes的方式交流改进,待PR修改完毕后给予approved。 |
| 44 | +PR内容会有Paddle同学及Paddle QA同学进行review,确保完整覆盖了待测功能点后,会给予approved。 |
| 45 | + |
| 46 | +若review过程中发现测试缺失和遗漏的测试点,会通过github代码行comment的和request changes的方式交流改进,待PR修改完毕后给予approved。 |
55 | 47 |
|
56 | 48 | ## 后续维护 |
57 | 49 |
|
|
0 commit comments