Python DDT数据驱动测试中用例命名异常与字典参数处理的解决方案
本文针对Python使用DDT结合HTMLTestRunner生成测试报告时遇到的两个核心问题提供解决方案:一是高版本DDT(1.2.0)导致用例名称后显示“dict() -> new empty dictionary”的Bug,通过降级至1.1.3版本解决;二是DDT默认不支持字典类型测试数据导致用例名无法自定义,通过修改mk_test_name源码逻辑,增加对字典中case_name字段的解析支持,实现清晰的用例命名。
前言
在结合DDT数据驱动框架与HTMLTestRunner生成测试报告的过程中,可能会遇到以下两个典型问题:
1、生成的测试报告中,用例名称后附带了“dict() -> new empty dictionary”字样。
2、使用DDT生成的用例名称无法按照预期进行自定义修改。

问题一:用例名称后出现“dict() -> new empty dictionary”
在生成的测试报告中,可以看到用例名称后面跟着“dict() -> new empty dictionary”,具体表现如图所示:

解决方案:这是DDT高版本(1.2.0)中存在的一个已知Bug。
解决方法如下:首先在命令行中通过pip uninstall ddt命令卸载当前安装的DDT库。
接着,安装一个较低版本的DDT,执行命令pip install ddt==1.1.3。

安装指定版本后重新运行程序,生成的测试报告结果如下图所示。

问题二:使用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处理的数据是一个列表,列表中每个元素均为字典。当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字段,则将该字段对应的值作为测试用例名称中的value部分。
修改后的DDT源码如下(红色粗体部分为新增或修改的内容):

更改代码后再次执行,测试结果如下图所示。

总结
以上介绍了在Python使用DDT过程中遇到的常见问题及其解决方案,希望对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。在此感谢大家对本站的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









