pytest.fixture 详解
概念
Fixture则是其用于设置和清理测试环境的重要机制。Fixture允许我们定义一些预设的资源或条件,确保每个测试函数都在相同的环境下运行,从而提高测试的可靠性和可维护性。
Fixture可以分为两种类型:参数化Fixture和普通Fixture。参数化Fixture允许我们将数据作为参数传递给测试函数,从而实现数据驱动的测试。普通Fixture则只是为测试函数提供一些固定的资源或设置。
要使用Fixture,我们需要在测试模块或测试类中定义一个fixture函数。这个函数可以接收任意数量的位置参数,但必须使用@pytest.fixture装饰器进行装饰。在fixture函数中,我们可以定义一些预设的资源或条件,以便在测试函数中使用。
代码刨析
fixture(scope='function',params=None,autouse=False,ids=None,name=None)
scope:有四个级别参数"function"(默认),"class","module","session"
params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它。
autouse:如果True,则为所有测试激活fixture func可以看到它(自动为用例使用)。如果为False则显示需要参考来激活fixture
ids:每个字符串id的列表,每个字符串对应于params这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成
name:fixture的名称。这默认为装饰函数的名称。如果fixture在定义它的统一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽,解决这个问题的一种方法时将装饰函数命令"fixture_<fixturename>"然后使用"@pytest.fixture(name='<fixturename>')"。
scope分为session、package、module、class、function级别,其中function也是包含测试类的测试方法的,package指在当前contest.py的package下只执行一次,如果想在某个package执行前后做操作,可以在那个package里加contest.py。yield就相当于执行测试函数的位置,详细解释如下:
举例
1.首先新建conftest.py
import pytest
@pytest.fixture(scope='session', autouse=True)
def realize_session():
print('session之前')
yield
print('session之后')
@pytest.fixture(scope='package', autouse=True)
def realize_package():
print('package之前')
yield
print('package之后')
@pytest.fixture(scope='module', autouse=True)
def realize_module():
print('module之前')
yield
print('module之后')
@pytest.fixture(scope='class', autouse=True)
def realize_class():
print('class之前')
yield
print('class之后')
@pytest.fixture(scope='function', autouse=True)
def realize_function():
print('function之前')
yield
print('function之后')
@pytest.fixture(scope='function', name='aa')
def realize_auto_flase():
print('autouse=false-function之前')
yield
print('autouse=false-function之后')
然后新建测试文件
import pytest
class Test_pytest_class():
def test_buy_now(self):
print('test_buy_now')
def test_buy_now2(self):
print('test_buy_now2')
def test_add_cart(self):
print('test_add_cart')
#测试自定义调用fixture函数方式1
@pytest.mark.usefixtures('aa')
def test_learn(self):
print('装饰器方式调用fixtures函数')
#测试自定义调用fixture函数方式1
def test_learn2(self,aa):
print('传参方式调用fixtures函数')
接下来看执行结果
test_pytest_class.py::Test_pytest_class::test_buy_now session之前
package之前
module之前
class之前
function之前
PASSED [ 20%]test_buy_now
function之后
test_pytest_class.py::Test_pytest_class::test_buy_now2 function之前
PASSED [ 40%]test_buy_now2
function之后
test_pytest_class.py::Test_pytest_class::test_add_cart function之前
PASSED [ 60%]test_add_cart
function之后
test_pytest_class.py::Test_pytest_class::test_learn function之前
autouse=false-function之前
PASSED [ 80%]装饰器方式调用fixtures函数
autouse=false-function之后
function之后
test_pytest_class.py::Test_pytest_class::test_learn2 function之前
autouse=false-function之前
PASSED [100%]传参方式调用fixtures函数
autouse=false-function之后
function之后
class之后
module之后
package之后
session之后
举例二
下面是一个简单的示例,演示如何使用Fixture:
import pytest
@pytest.fixture
def setup_data():
# 定义一些预设的数据
data = {'name': 'John', 'age': 30}
return data
def test_data(setup_data):
# 在测试函数中使用fixture返回的数据
assert setup_data['name'] == 'John'
assert setup_data['age'] == 30
在这个示例中,我们定义了一个名为setup_data的Fixture函数,它返回一个包含name和age键值对的字典。然后,在test_data测试函数中,我们通过参数setup_data引用了这个Fixture函数返回的数据。这样,我们就可以在测试函数中使用这些预设的数据了。
除了在测试函数中使用Fixture返回的数据,我们还可以在Fixture函数中使用其他Fixture。这使得我们可以轻松地组织和复用测试代码。例如,我们可以定义一个名为setup_user的Fixture,它依赖于setup_data Fixture:
import pytest
@pytest.fixture
def setup_data():
# 定义一些预设的数据
data = {'name': 'John', 'age': 30}
return data
@pytest.fixture
def setup_user(setup_data):
# 定义一个依赖于setup_data的Fixture
user = {'name': setup_data['name'], 'age': setup_data['age'], 'email': 'john@example.com'}
return user
def test_user(setup_user):
# 在测试函数中使用setup_user返回的数据
assert setup_user['name'] == 'John'
assert setup_user['age'] == 30
assert setup_user['email'] == 'john@example.com'
在这个示例中,我们定义了一个名为setup_user的Fixture,它依赖于setup_data Fixture。在setup_user Fixture中,我们使用了setup_data返回的数据来构造一个新的用户字典。然后,在test_user测试函数中,我们通过参数setup_user引用了这个Fixture函数返回的数据。
通过使用Fixture,我们可以减少重复的测试代码,提高测试的可靠性和可维护性。同时,通过参数化Fixture,我们还可以实现数据驱动的测试。在实际开发中,我们可以根据需要定义各种Fixture,以满足不同的测试需求
浙公网安备 33010602011771号