pytest参数化使用ids当测试用例描述有中文时控制台及报告中用例标题输出为Unicode编码问题(钩子函数:pytest_collection_modifyitems)
当我们对测试用例进行参数化时,使用@pytest.mark.parametrize的ids参数自定义测试用例的标题,当标题中有中文时,控制台和测试报告中会出现Unicode编码问题,这看起来特别像乱码,我们想让中文正常展示出来,需要用到pytest框架的钩子函数pytest_collection_modifyitems。
先看问题:
# file_name: test_parametrize.py import pytest def return_user(): return [('lwjnicole', '12345'), ('nicole', '123111')] class Test_D: @pytest.mark.parametrize("username,password", return_user(), ids=[ "输入正确的用户名、密码,登录成功", "输入错误的用户名、密码,登录失败" ]) def test_login(self, username, password): print("username = {}, password = {}".format(username, password)) assert username == "lwjnicole" if __name__ == '__main__': pytest.main(['-s', 'test_parametrize.py'])
编辑器中运行上面代码的结果:
从上面的结果中可以看到用例的标题中文展示为Unicode编码。
使用钩子函数pytest_collection_modifyitems解决:
items 是一个存储 item 对象的列表, item 对象中有两个属性:一个是测试用例的路径 nodeid ,另一个是测试用例的用例名 name
在项目的根目录下,新建 conftest.py 文件,然后添加如下代码:
# file_name: conftest.py def pytest_collection_modifyitems(items): """ 测试用例收集完成时,将收集到的item的name和nodeid的中文显示在控制台上 :return: """ for item in items: item.name = item.name.encode("utf-8").decode("unicode_escape") item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")
然后再次执行下测试用例,运行结果:
从上面的结果中可以看到用例的标题以中文正常展示了,问题得到解决。
去期待陌生,去拥抱惊喜。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!