Pytest框架之fixture的详细使用教程
什么是fixture?
fixture是pytest框架中的一个重要概念,它可以在测试运行之前完成一些准备工作,如创建测试数据、启动应用程序等。同时,fixture还可以在测试运行后完成一些清理工作,如删除测试数据、关闭应用程序等。fixture可以在整个测试集或仅在特定测试用例以及测试组中共享。
fixture的基本使用
fixture的基本使用分为3步:
- 编写fixture函数
- 使用fixture函数
- 在测试用例中使用fixture函数
编写fixture函数:
fixture函数通常使用@pytest.fixture装饰器进行装饰。下面是一个简单的使用fixture函数的例子:
import pytest
@pytest.fixture()
def set_data():
data = [1, 2, 3, 4]
return data
上面的例子中,我们定义了一个fixture函数set_data。set_data函数在每个测试用例执行之前,都会执行一次。注意:fixture函数的返回结果,可以被用于测试用例中。
使用fixture函数
使用fixture函数的方法有两种:
- 将fixture函数作为测试函数或测试类的函数参数传递。
- 使用@pytest.mark.usefixtures标记装饰测试函数或测试类。
下面是两个示例:
# 测试类中使用fixture函数
class TestClass:
@pytest.fixture()
def set_data(self):
data = [1, 2, 3, 4]
return data
def test_case1(self, set_data):
assert len(set_data) == 4
# 测试函数中使用fixture函数
def test_case2(set_data):
assert len(set_data) == 4
@pytest.mark.usefixtures("set_data")
def test_case3():
print("test_case3")
在第一个示例中,函数set_data作为TestClass类的方法,被test_case1测试方法调用。在第二个示例中,函数set_data被test_case2测试函数调用。在第三个示例中,函数set_data被test_case3测试函数调用,并使用usefixtures标记装饰。
fixture的参数化
fixture函数可以被参数化,从而可以在不同的测试用例中传入不同的参数。下面是一个简单的fixture参数化的例子:
import pytest
@pytest.fixture()
def set_data(request):
data = request.param
return data
@pytest.mark.parametrize("set_data", [(1, 2, 3), (4, 5, 6)], indirect=True)
def test_case(set_data):
assert len(set_data) == 3
在这个例子中,我们使用了pytest.mark.parametrize装饰器对测试用例进行了参数化。同时,我们把fixture函数set_data作为一个参数传递,并使用indirect=True来告诉pytest,这个参数是一个fixture函数。这样,在每个测试用例运行时,都会调用一次set_data函数,并从参数列表中读取相应的参数。
fixture的作用域
fixture函数的作用域是可以控制的,也就是说fixture函数可以在不同的级别上进行共享或隔离。pytest框架提供了4种作用域级别:
- function:每个测试函数运行前都会调用。
- class:每个测试类运行前调用一次(不管该类有多少个测试函数)。
- module:每个.py文件运行前调用一次(不管该文件有多少个测试类和测试函数)。
- session:整个测试套件只调用一次(多个.py文件,多个测试类和测试函数)。
下面是一个简单的fixture作用域的例子:
import pytest
@pytest.fixture(scope="module")
def set_data():
print("set_data: create data once")
data = [1, 2, 3, 4]
return data
def test_case1(set_data):
print("test_case1")
assert len(set_data) == 4
def test_case2(set_data):
print("test_case2")
assert set_data[0] == 1
在这个例子中,我们把fixture函数set_data的作用域设置为module。这意味着,每个.py文件只会调用一次set_data函数,无论测试用例有多少个。在该例子中,测试用例test_case1和test_case2都会调用set_data函数,但是set_data函数只会被调用一次。
fixture的fixture
fixture函数也可以使用其他的fixture函数作为参数,我们称这个过程为“fixture的fixture”。下面是一个简单的例子:
import pytest
@pytest.fixture()
def mocked_data():
data = [1, 2, 3, 4]
return data
@pytest.fixture()
def set_data(mocked_data):
data = mocked_data.copy()
data.append(5)
return data
def test_case(set_data):
assert len(set_data) == 5
在这个例子中,fixture函数set_data使用了fixture函数mocked_data作为参数。fixture函数mocked_data返回列表[1, 2, 3, 4],fixture函数set_data会将这个列表复制一份,然后再添加一个元素5。在test_case测试函数中,我们使用了fixture函数set_data,并断言它的长度等于5。
结论
fixture是pytest框架中一个非常有用的概念,掌握fixture的使用技巧,可以帮助我们更加方便快捷的编写测试用例。本篇文章详细介绍了fixture的基本使用、参数化、作用域和“fixture的fixture”等内容,相信读者已经掌握fixture的使用方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytest框架之fixture的详细使用教程 - Python技术站