pytest非文件参数化
一、问题:
pytest参数化:1个参数、2个参数、多个参数如何参数化?
二、回答
若不采用文件,只采用parametrize可以用如下3种方式:
1.传1个参数: 一维列表传参
2.传2参数: 列表嵌套元组传参
3.传多个参数:列表嵌套字典传参
代码如下所示:
1、传1个参数:
1 import pytest 2 import requests 3 4 host = "http://33.33.33.33:9000" 5 6 #第一种:1个参数 7 @pytest.mark.parametrize("username",["admin","admin2"]) 8 def testPostLogin(username): 9 ''' 10 参数为k=v的POST接口 11 :return: 12 ''' postUrl = host + "/pinter/com/login" 13 #userName=admin&password=1234 14 dataContent = {"userName":username,"password":"1234"} 15 result = requests.post(url=postUrl,data=dataContent) 16 assert result.json().get("code") == '0'
2、传2个参数
1 #第2种:2个参数,列表嵌套元组的方式 2 @pytest.mark.parametrize("username,password",[("test","1234"),("test22","12345"),("test33","123456")]) 3 @pytest.mark.flaky(reruns=3,reruns_delay=2) 4 def testPostJsonRegister(username,password): 5 ''' 6 参数为json的POST接口 7 :return: 8 ''' postJsonUrl = host + "/pinter/com/register" 9 jsonContent = {"userName":username,"password":password,"gender":1,"phoneNum":"110","email":"beihe@163.com","address":"Beijing"} 10 result = requests.post(url=postJsonUrl,json=jsonContent) 11 assert result.json().get("code") == '0'
3、传3个参数
1 #第3种:多个参数,列表嵌套字典的方式 2 test_data =[ 3 { 4 "case":"登录成功", 5 "username":"admin", 6 "password":"1234" 7 }, 8 { 9 "case":"密码错误", 10 "username":"admin", 11 "password": "12345" 12 }, 13 { 14 "case":"账号或密码不能为空", 15 "username":"", 16 "password":"" 17 }, 18 ] 19 @pytest.mark.parametrize("params",test_data,ids=[dic.get("case") for dic in test_data]) 20 def testPostLogin3(params): 21 ''' 22 参数为k=v的POST接口 23 :return: 24 ''' 25 postUrl = host + "/pinter/com/login" 26 #userName=admin&password=1234 27 dataContent = {"userName":params.get("username"),"password":params.get("password")} 28 result = requests.post(url=postUrl,data=dataContent) 29 assert result.json().get("code") == '0'
上面2和3两种方法,比较推荐的是第3种利用字典传参的方式,因为这样当参数化数据增加或减少个数时,不需要改变传参,因为传参只有一个params,这样对代码的变动比较小。
三、拓展
上面的ids=[dic.get("case") for dic in test_data]是给方法的每个传参命名进行描述的,如果不加ids显示的效果是
加了ids显示的效果是case的名字:
可以看到中文显示乱码的效果
解决方案为:
在该py文件的同包路径下,新建conftest.py文件,里面增加一个方法:pytest_collection_modifyitems
该方法用于解决ids中文乱码问题
1 def pytest_collection_modifyitems(items): 2 """ 3 该方法解决参数化中文乱码问题,需要和处理的数据在同一个包内 4 """ for item in items: 5 item.name = item.name.encode("utf-8").decode("unicode_escape") 6 item._nodeid = item.nodeid.split('::')[0] +'::'+ item.nodeid.split('::')[1].encode("utf-8").decode("unicode_escape")
在conftest中它会自动执行,此时在执行上面的参数化方法,显示如下:
分类:
07-python3核心技术
标签:
pytest参数化
, pytest参数化中文乱码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!