Pytest基于fixture的参数化及解决乱码问题

我们知道,Pytest是Python技术栈下进行自动化测试的主流测试框架。支持灵活的测试发现、执行策略,强大的Fixture夹具和丰富的插件支持。

除了通过pytest的parametrize标签进行参数化外,我们通过fixture的param参数也可以比较方便地实现参数化测试的功能

fixture参数化实现

假设我们有如下一段待测代码,根据传入参数的不同类型得到不同的输出

python 复制代码
def deal_params(p):  
    if type(p) is int:  
        return p*10  
    if type(p) is str:  
        return f"输入了:{p}"  
    if type(p) in (tuple, list):  
        return "_".join(p)  
    else:  
        raise TypeError

然后我们编写对应的测试代码,首先定义fixture,设定params参数列表, 再通过fixture本身的request获取param. 比如这里定义几个参数。当然此外我们还定义了fixture的前置和后置动作。测试方法就是调用被测函数执行。

python 复制代码
@pytest.fixture(params=[10, "城下秋草", "软件测试", ("示例", "代码")])  
def fix_env(request):  
    yield request.param  
  
def test_params(fix_env):  
    print(deal_params(fix_env))

运行得到如下输出:

可以看到,虽然参数化成功运行,但这里有个问题,就是输出的结果中,用例ID这里,显示的是乱码.

根据pytest的ID生成规则,如果是字符或数字,会显示传入的参数本身(当然也可以利用ids参数重新指定参数的对应ID),如果是元组、列表或字典,则会显示fixture的name+参数序号,比如这里的fix_env3

那这里的字符是中文,显示成了unicode转义前的编码,所以还是中文转换有问题。也就是Pytest对于fixture参数的处理,默认会使用Ascii编码来进行显示,而对于中文,我们是希望用unicode编码显示。

中文乱码解决方案一

所以,这里解决这个问题的第一个方法是可以利用Pytest的fixture集中配置文件conftest.py, 在其中利用Pytest的hook机制,修改用例收集方法中生成用例ID的部分. 对应代码:

用例文件的同级conftest.py中定义:

python 复制代码
def pytest_collection_modifyitems(items):  
    # item表示收集到的测试用例,对他进行重新编码处理
    for item in items:  
        item.name = item.name.encode("utf-8").decode("unicode-escape")  
        item._nodeid = item._nodeid.encode("utf-8").decode("unicode-escape")

再次执行,可以看到已经正常显示了中文

中文乱码解决方案二

除了通过修改hook来对用例ID进行重新编码处理外,其实Pytest本身也提供了一个配置参数。只是这个配置并不是官方推荐的解决方法。在某些操作系统上的特定情形下,使用这个配置,可能会导致一些异常bug。但笔者在windows和Ubuntu上测试是没有问题的。

这里对应的配置是:

ini 复制代码
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True

从这个超长的配置名称也可以看出,就是禁用testID的转义但同时放弃了社区支持 😂😂

在pytest.ini中加上这个配置,不使用上面hook的话,也能得到中文正常显示的效果。


以上就是关于Pytest中参数化中文显示时,可能遇到的乱码问题的解决方案。


相关推荐
愈努力俞幸运5 分钟前
flask 入门 token, headers,cookie
后端·python·flask
cat2bug9 分钟前
介绍一下如何在Cat2Bug-Platform中通过OpenAI来创建测试用例
功能测试·测试工具·ai·测试用例·bug·openai
梦想是成为算法高手18 分钟前
带你从入门到精通——知识图谱(一. 知识图谱入门)
人工智能·pytorch·python·深度学习·神经网络·知识图谱
用什么都重名19 分钟前
Conda 虚拟环境安装配置路径详解
windows·python·conda
阿也在北京21 分钟前
基于Neo4j和TuGraph的知识图谱与问答系统搭建——胡歌的导演演员人际圈
python·阿里云·知识图谱·neo4j
计算机徐师兄23 分钟前
Python基于知识图谱的胆囊炎医疗问答系统(附源码,文档说明)
python·知识图谱·胆囊炎医疗问答系统·python胆囊炎医疗问答系统·知识图谱的胆囊炎医疗问答系统·python知识图谱·医疗问答系统
北冥码鲲23 分钟前
【保姆级教程】从零入手:Python + Neo4j 构建你的第一个知识图谱
python·知识图谱·neo4j
B站计算机毕业设计超人25 分钟前
计算机毕业设计Python+大模型音乐推荐系统 音乐数据分析 音乐可视化 音乐爬虫 知识图谱 大数据毕业设计
人工智能·hadoop·爬虫·python·数据分析·知识图谱·课程设计
喵手32 分钟前
Python爬虫零基础入门【第三章:Requests 静态爬取入门·第5节】限速与礼貌爬取:并发、延迟、频率控制!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·requests静态爬取·限速与爬取
归去来?1 小时前
记录一次从https接口提取25G大文件csv并落表的经历
大数据·数据仓库·hive·python·网络协议·5g·https