一、问题
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:函数级,每一个函数或方法都会调用,不写时默认就是函数级