1.什么是fixture
fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面。在你编写测试函数的时候,你可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数。
fixture有明确的名字,在其他函数,模块,类或整个工程调用它时会被激活。
fixture是基于模块来执行的,每个fixture的名字就可以触发一个fixture的函数,它自身也可以调用其他的fixture。
fixture主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步也是冗余。
- 把函数作为参数
代码:
import pytest
class Testlogin:
def test_lg(self, aaa):
print(aaa)
@pytest.fixture()
def aaa(self):
return 5
结果:
- 使用多个fixture
代码:
import pytest
class Testlogin:
def test_lg(self, aaa):
print(aaa['message'])
@pytest.fixture()
def aaa(self):
url = 'http://api.XXXX.XXXX.com/companyuser/logincompany'
data = 'account=176XXXX5569&password=123456'
r = requests.post(url=url, data=data).json()
assert r['code'] == '203'
return r
结果:
注:添加indirect=True参数可以把login当成一个函数去执行,而不是一个参数
2.fixture的作用范围(scope)
fixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function
- function:每一个函数或方法都会调用
- class:每一个类调用一次,一个类中可以有多个方法
- module:每一个.py文件调用一次,该文件内又有多个function和class
- session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
代码:
import pytest
@pytest.fixture(scope='class')
def bbb():
return 'bbb'
class Testlogin:
def test_01(self, bbb):
print('01开始')
print(bbb)
print('01结束')
结果:
3.调用fixture的两种方法
-
函数或类里面方法直接传fixture的函数参数名称
-
使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例
@pytest.mark.usefixtures()可以叠加使用
代码:
import pytest
@pytest.fixture(scope='class')
def aaa():
return 'aaa'
@pytest.fixture(scope='class')
def bbb():
return 'bbb'
@pytest.mark.usefixtures('aaa')
@pytest.mark.usefixtures('bbb')
class Testlogin:
def test_01(self, bbb,aaa):
print('01开始')
print(aaa)
print(bbb)
print('01结束')
结果:
usefixtures与传fixture区别
如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。当fixture需要用到return出来的参数时,只能讲参数名称直接当参数传入,不需要用到return出来的参数时,两种方式都可以。
4.fixture如何带参数
需要用到request属性
代码:
import pytest
test_data_1 = [('账号密码正确', '17671875569', 'b44fa1f41aab36ef3d214b01f98d4b12c83e730fcaa0c5f591078e345a7a98fc'),
('密码错误账号正确', 'zhangsan', '123456')]
# ()里是params
@pytest.fixture(params=test_data_1)
def aaa(request):
# 这里返回的是param
return request.param
@pytest.mark.usefixtures('aaa')
class Testlogin:
def test_01(self, aaa):
print(aaa)
结果:
传递字典形式数据:
import pytest
test_user_data = [{"user": "admin1", "passwd": "111111"},
{"user": "admin1", "passwd": "123456"}]
@pytest.fixture(params=test_user_data, autouse=True)
def aaa(request):
return request.param
class Testlogin:
def test_02(self, aaa):
print(aaa['user'])
print(aaa['passwd'])
5.autouse=True
fixture自动使用autouse=True 当用例很多的时候,每次都传这个参数,会很麻烦。fixture里面有个参数autouse,默认是False没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了 autouse设置为True,自动调用fixture功能。
代码:
import pytest
test_data_1 = [('账号密码正确', '17671875569', 'b44fa1f41aab36ef3d214b01f98d4b12c83e730fcaa0c5f591078e345a7a98fc'),
('密码错误账号正确', 'zhangsan', '123456')]
test_user_data = [{"user": "admin1", "passwd": "111111"},
{"user": "admin2", "passwd": "123456"}]
@pytest.fixture(params=test_data_1, autouse=True)
def ccc(request):
print(request.param)
class Testlogin:
def test_01(self):
print('01用例')
def test_02(self):
print('02用例')
结果: