pytest之fixture使用方式

发布时间 2023-11-28 13:38:30作者: 秒秒开心

一、问题

pytest中fixture的调用方式有哪几种?

 

二、回答

有4种方式:
1.传参调用
2.自动调用autouse=True
3.手动调用usefixtures
4.与parametrize结合调用indirect=True

第一种方式:传参调用
getToken方法装上了 @pytest.fixture(),在 testQuery(getToken)中传参,即可获取getToken方法的返回值

 1 host = "http://66.66.66.66:9000" 
 2 
 3 @pytest.fixture()  
 4 def getToken():  
 5     url = host + '/pinter/bank/api/login2'  
 6     data = {"userName": "admin", "password": "1234"}  
 7     response = requests.post(url=url, data=data)  
 8     assert response.json().get("code") == '0'  
 9     return response.json().get("data")
10     
11 def testQuery(getToken):  
12     url = host + '/pinter/bank/api/query2'  
13     headers = {"testfan-token": getToken}  
14     data = {"userName": "admin"}  
15     response = requests.get(url=url, params=data, headers=headers)  
16     assert response.json().get("code") == '0'

 

第二种方式:自动调用autouse=True
在执行每个方法时都会调用该fixtureDemo方法,先准备数据,在调用方法,在清理数据

1 @pytest.fixture(autouse=True)  
2 def fixtureDemo(self):  
3     print("准备数据")  
4     yield  
5     print("清理数据")

 

第三种方式:手动调用usefixtures

 1 @pytest.fixture()  
 2 def fixtureDemo(self):  
 3     print("准备数据")  
 4     yield  
 5     print("清理数据")
 6     
 7 @pytest.mark.usefixtures("fixtureDemo") 
 8 @pytest.mark.parametrize("id",[1,2])  
 9 @pytest.mark.flaky(reruns=3,reruns_delay=2)  
10 def testGetMsg(self,id):  
11     '''  
12     普通的GET类型接口  
13     :return:  
14     '''    getUrl = self.host + "/pinter/com/getSku"  
15     paramContent = {"id":id}  
16     response = requests.get(getUrl,params=paramContent)  
17     print(response.json())  
18     assert response.json().get("code") == '0'

 

第四种调用:与parametrize结合调用

 1 @pytest.fixture()  
 2 def login(self,request):  
 3     name = request.param  
 4     print(f"===账号是:{name}===")  
 5     return name+"test"  
 6   
 7 testData = ["linda","Bob"]  
 8   
 9 @pytest.mark.parametrize("login",testData,indirect=True)  
10 def testName(self,login):  
11     print(f"测试用例的登录账号是:{login}")
12 
13 >>> 运行结果如下:
14 >>> 测试用例的登录账号是:lindatest
15 >>> 测试用例的登录账号是:Bobtest
16 
17 @pytest.mark.parametrize("login",testData,indirect=False)  
18 def testName(self,login):  
19     print(f"测试用例的登录账号是:{login}")
20 
21 >>> 运行结果如下:
22 >>> 测试用例的登录账号是:linda
23 >>> 测试用例的登录账号是:Bob

当indirect为True时,login代表的是login函数,会将testData中每个名字都加上test后缀
当indirect为False时,login代表的是普通参数,会直接返回testData中每个名字的值

 

三、拓展fixture之生命周期
session:会话级,每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法
module:模块级,每一个.py 文件调用一次
class:类级,每个测试类只运行一次
function:函数级,每一个函数或方法都会调用,不写时默认就是函数级