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中它会自动执行,此时在执行上面的参数化方法,显示如下:

 

posted @ 2023-11-28 13:29  秒秒开心  阅读(4)  评论(0编辑  收藏  举报