前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何解决pytest参数化时出现的Unicode编码问题?

如何解决pytest参数化时出现的Unicode编码问题?

原创
作者头像
霍格沃兹测试开发Muller老师
发布于 2023-09-07 03:10:28
发布于 2023-09-07 03:10:28
46700
代码可运行
举报
运行总次数:0
代码可运行

前言

Pytest是一个广泛使用的Python测试框架,通过参数化测试(Parameterized Testing)功能,可以轻松地为测试用例提供多组输入数据。然而,当我们尝试在参数化测试中使用中文作为测试用例的IDs时,有时会遇到Unicode编码问题,导致测试报告中显示的是乱码。本文将详细解释这个问题的原因,并提供解决方案,确保测试报告中正确显示中文IDs。

问题描述

在Pytest中,我们可以使用@pytest.mark.parametrize装饰器来参数化测试用例,并为每组数据提供一个ID,以便在测试报告中区分不同的输入组合。例如:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import pytest

@pytest.mark.parametrize("input, expected", [
    (1, 2),
    (3, 6),
    (0, 0)
], ids=["结果1", "结果2", "结果3"])
def test_multiply(input, expected):
    assert input * 2 == expected

在pycharm里运行代码之后,我们可以看到测试通过,但是ids的输出出现了异常,如下图:

我们可以看到 ids 参数用例描述有中文时,显示unicode编码,中文不能正常显示。

问题原因

这个问题的原因是Pytest默认将IDs视为ASCII字符串,并在测试报告中按原样显示。由于中文字符不属于ASCII字符范围,因此Pytest会将其转换为Unicode编码表示。

解决方案

  1. 我们可以在pytest.ini文件中加上如下配置:
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True

再次运行脚本,结果如下:

我们可以看到,中文已经正常输出。

  1. conftest.py中利用pytest提供的hook函数pytest_collection_modifyitems解决unicode编码问题,具体方法如下:
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def pytest_collection_modifyitems(items):
    """
    测试用例收集完成时,将收集到的item的name和nodeid的中文显示在控制台上
    """
    for item in items:
        item.name = item.name.encode("utf-8").decode("unicode_escape")
        item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")

再次运行脚本,结果如下:

总结

在Pytest的参数化测试中,使用中文作为测试用例的IDs时,可能会遇到Unicode编码问题,导致测试报告中显示的是乱码。为了解决这个问题,我们可以通过在pytest.ini文件中添加配置项或者在conftest.py文件中添加函数来解决问题,这样,我们就能够获得清晰可读的中文IDs,提高测试报告的可理解性和可维护性。

通过以上解决方案,我们可以在Pytest中正确显示中文IDs,并确保测试报告的准确性和可读性。这将有助于团队成员更好地理解和分析测试结果,提高测试效率和质量。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
pytest文档41-参数化 ids 用例描述为中文时控制台输出unicode
使用 pytest.mark.parametrize 参数化的时候,加 ids 参数用例描述有中文时,在控制台输出会显示unicode编码,中文不能正常显示。 使用 pytest_collection_modifyitems 钩子函数,对输出的 item.name 和 item.nodeid 重新编码。
上海-悠悠
2020/06/17
1.3K0
Pytest参数化用例
注意:必须在同目录下创建conftest.py文件,将下面内容添加进去,运行脚本后,才可以正常显示中文的重命名。
霍格沃兹测试开发Muller老师
2024/05/14
1130
Python测试框架pytest(17)参数化parametrize
@pytest.mark.parametrize 允许在测试函数或类中定义多组参数和 fixtures。
wangmcn
2022/07/26
7060
Python测试框架pytest(17)参数化parametrize
基于Pytest+Requests+Allure实现接口自动化测试
1、工具层 将get、post等常用行为进行二次封装。 代码(api_key.py)如下:
测试开发技术
2023/08/21
5480
基于Pytest+Requests+Allure实现接口自动化测试
pytest hook简介
pytest是一个基于python、功能强大的测试框架,很多项目会采用该框架维护测试用例。pytest除了强大的用例发现、收集、执行和报告输出之外,还提供了丰富的函数hook可以自定义插件或者框架行为,只需在项目目录/conftest.py文件中实现对应hook名称的函数,即可完成hook函数的注册。
雷子
2021/03/15
2.2K0
pytest hook简介
怎么基于Pytest+Requests+Allure实现接口自动化测试?
1、工具层 将get、post等常用行为进行二次封装。 代码(api_key.py)如下:
科技新语
2024/06/12
1660
怎么基于Pytest+Requests+Allure实现接口自动化测试?
接口自动化测试之pytest用例管理框架
文档:https://docs.pytest.org/en/latest/contents.html#toc
用户6367961
2022/11/21
8960
接口自动化测试之pytest用例管理框架
一篇文章为你揭秘pytest的基本用法
pytest是一个测试框架,功能与unittest类似,完全兼容unittest的功能。一般做接口测试的时候,以前用的多的是python+requests+httptestrunner完成接口自动化测试与报告生成,看到现在很多都在用pytest框架,我也来学习一下,接口测试中pytest应用广泛的是通过python+pytest+allure生成测试报告,报告格式比较美观。
小博测试成长之路
2021/03/06
6.4K0
pytest文档21-pytest-html报告优化
pytest-html报告中当用到参数化时候,获取用例的nodeid里面有中文时候,会显示[\u6350\u52a9\u6211\u4eec]这种编码(再次声明,这个不叫乱码,这是unicode编码) 关于python2和python3里面Unicode编码转化可以参考之前写的一篇pytest文档20-pytest-html报告优化 本篇以python3.6版本为例
上海-悠悠
2018/10/24
3.3K0
pytest文档21-pytest-html报告优化
[接口测试_B] 05 Pytest参数化处理
pytest的参数化方式 pytest.fixture()方式进行参数化,fixture装饰的函数可以作为参数传入其他函数 conftest.py 文件中存放参数化函数,可作用于模块内的所有测试用例 pytest.mark.parametrize()方式进行参数化 本节测试依然以is_leap_year.py方法作为测试目标: def is_leap_year(year): # 先判断year是不是整型 if isinstance(year, int) is not True:
苦叶子
2018/04/17
1.5K0
[接口测试_B] 05 Pytest参数化处理
几分钟,入门Python单元测试框架Pytest
测试结果显示,运行了一个测试用例,结果是红色,表示失败。错误信息显示,在代码的第7行抛出AssertionError。可以更改一下代码,让测试用例绿色通过。
Python研究者
2022/04/08
8100
几分钟,入门Python单元测试框架Pytest
Python测试框架pytest(10)Hooks函数 - pytest_collection_modifyitems改变顺序
pytest 默认执行用例是根据项目下的文件夹名称按 ascii 码去收集的,module 里面的用例是从上往下执行的。
wangmcn
2022/07/26
4620
Python测试框架pytest(10)Hooks函数 - pytest_collection_modifyitems改变顺序
Pytest(十四)用例执行顺序
在很多人执行用例的时候呢,都会想要调整下用例的执行顺序。在pytest的原生的顺序已经满足不了我们的需求的时候呢,我们可以用pytest-ordering来控制我们的执行的顺序。
雷子
2022/04/06
1.6K0
Pytest(十四)用例执行顺序
pytest框架介绍(二)
前面简单介绍了如何使用pytest, 感觉介绍得太泛泛了。个人感觉,pytest的精髓在fixture. 学pytest就不得不说fixture,fixture是pytest的精髓所在,就像unittest中的setup和teardown一样,如果不学fixture那么使用pytest和使用unittest是没什么区别的(个人理解)。
赵云龙龙
2021/04/23
9060
pytest「conftest、pytest参数化、重运行、出测试报告」
1.这个conftest.py分路径吗?如果在TestCases下建这个包可以直接用吗?
清菡
2020/12/02
1.4K0
pytest「conftest、pytest参数化、重运行、出测试报告」
Pytest自动化测试框架
1. 使用pytest完成接口自动化 1.1. pytest 简介 pytest 是 Python 的一款开源测试框架。
用户10443079
2023/03/21
8330
一文带你了解Pytest..
在之前的文章里我们已经学习了Python自带测试框架UnitTest,但是UnitTest具有一定的局限性
测试小兵
2023/12/15
2030
一文带你了解Pytest..
pytest文档34-Hooks函数改变用例执行顺序(pytest_collection_modifyitems)
有一些小伙伴一直想改变pytest用例的执行顺序,实际上我们在用例设计原则上用例就不要有依赖顺序。 pytest默认执行用例是先根据项目下的文件夹名称按ascii码去收集的,module里面的用例是从上往下执行的. pytest_collection_modifyitems 这个钩子函数顾名思义就是改变用例的执行顺序。
上海-悠悠
2020/04/22
1.2K0
pytest文档34-Hooks函数改变用例执行顺序(pytest_collection_modifyitems)
Pytest Hooks方法之pytest_collection_modifyitems改变测试用例执行顺序
pytest默认执行用例顺序是根据项目下文件名称按ascii码去收集运行的,文件里的用例是从上往下按顺序执行的.
王大力测试进阶之路
2020/05/25
2.2K0
一篇文章带你了解Python常用自动化测试框架——Pytest!
在之前的文章里我们已经学习了Python自带测试框架UnitTest,但是UnitTest具有一定的局限性
测试开发技术
2023/11/22
2.5K0
一篇文章带你了解Python常用自动化测试框架——Pytest!
推荐阅读
相关推荐
pytest文档41-参数化 ids 用例描述为中文时控制台输出unicode
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文