前言:
在使用 DDT 数据驱动 + htmlTestRunner 输出测试报告时遇到过 2 个问题:
1, 生成的测试报告中, 用例名称后有 dict() -> new empty dictionary
2, 使用 ddt 生成的用例名称无法更改
1, 用例名称后有 dict() -> new empty dictionary
报告中用例名称后有 dict() -> new empty dictionary, 如图所示:
解决方案: 这是 ddt 高版本 1.2.0 的 bug
1,cmd 先通过 pip uninstall ddt 卸载 ddt,
2, 然后再安装一个低版本的 ddt, 命令 pip install ddt==1.1.3
安装后再运行程序, 结果如下
2, 使用 ddt 生成的用例名称无法更改
如上图所示测试用例名称都是 test_api_index, 运行结果无法看出用例执行的是哪条数据, 翻阅网上的资料找到一个比较好的方法, 讲解比较详细, 这段内容来自链接 https://www.cnblogs.com/Simple-Small/p/9230382.html
ddt 源码中有个函数用来生成用例名称, mk_test_name
它接收两个参数: name 和 value.
name: 为测试用例的名字. 即 test_api.
value: 为测试数据, ddt 是处理一组测试数据. 而这个 value 就是这一组数据中的每一个测试数据.
对 value 的值是有限制的: 要么就是单值变量, 要么就是元组或者列表并且要求元组和列表中的数据都是单值变量. 如 ("name","port") ,["name","port"]
如果传进来的测试数据, 不符合 value 的要求, 那么测试用例名字为: name_index.
如果传进来的测试数据, 符合 value 的要求, 那么测试用例名字为: name_index_value. 如果 value 为列表或者元组, 那么将列表 / 元组的每个数据依次追加在末尾.
比如传进来的 name 值为 test_login,value 值为 ["name","port"]. 那最终的测试用例名字是: test_login_01_name_port.
如果传进来的 name 值为 test_login,value 值为 {"userName":"18500384561", "password":"123456"}, 那最终的测试用例名字为: test_login_1. 因为它不支持对字典类型的数据处理.
而我的接口自动化框架中, ddt 处理的数据是一列表: 列表当中每个数据都为字典. ddt 一遍历整个列表, 那传给 value 的值刚好是字典..
所以我得到的测试用例名称就是: test_login_1,test_login_2,test_login_3
为了让我的测试报告, 呈现的更好. 那就改改 ddt 源码, 让它能够适应我的框架.
考虑两个问题:
1, 不同接口的测试用例名字如何来??
2, 如何让 ddt 支持对字典的处理??
解决方案:
第一个问题: 每一个测试用例主动提供一个用例名字, 说明你是什么接口的什么场景用例. 比如: 接口名_场景名. login_success,login_noPasswd,login_wrongPasswd 等.
在我的框架当中, 每一个测试用例是一个字典. 那么我就在字典中添加一个键值对, case_name = 用例名称
第二个问题: 在 ddt 中添加对字典的处理, 如果字典中有 case_name 字段, 则将字典中键名为 case_name 的值作为测试用例名称中的 value 值.
修改后的 ddt 源码为 (红色粗体部分为修改的内容):
更改代码后再执行, 结果如下:
来源: https://www.cnblogs.com/Clairewang/p/9857921.html