文章目录
前言使用 setup 和 teardown 实现方法介绍方法级别类级别模块级别整体案例执行结果使用 Fixture 实现方法介绍使用 Fixture 完成前置方法所有用例执行部分用例执行使用 Fixture 完成后置方法后记前言
pytest 中可以使用 setup 和 teardown 来实现前置和后置方法,同时也可以使用装饰器 Fixture 来实现。主要用来做数据准备或者数据清理使用。
使用 setup 和 teardown 实现
方法介绍
在 pytest 中使用 setup 和 teardown 可以实现三种级别的前置和后置,分别是 方法级别、类级别和模块级别。不过模块级别用的不多。
方法级别
每个测试方法执行前后都会执行的方法。方法前置在每个用例执行之前会先运行, 方法后置在每个用例执行结束后运行。
class TestDemo:def setup(self): # 方法前置passdef teardown(self): # 方法后置pass
类级别
测试类中所有测试方法执行前后都会执行的方法。方法前置在所有用例执行之前会先运行, 方法后置在所有用例执行结束后运行。
class TestDemo:def setup_class(self): # 类前置passdef teardown_class(self): # 类后置pass
模块级别
模块级别可以用在 不使用类定义的用例中。
如果不再类定义的用例中书写,模块级别的方法,会在所有用例执行之前调用 前置方法, 在所有用例执行结束后调用后置方法。
在使用类定义的用例中,需要将方法写在类的外部,不能在类中书写。
习惯性的代码书写是在一个模块中定义一个测试类,所以模块级别的基本不用, 如果书写了, 前置方法会在类级别前置之前执行, 后置方法会在类后置之后执行。
如果书写多个测试类,前置方法会在所有测试类之前执行,后置方法会在所有测试类执行结束后执行。
def setup_module(): # 模块前置passdef teardown_module(): # 模块后置pass
整体案例
import pytestdef setup_module():print('1. 模块级别前置 setup_module')def teardown_module():print('1. 模块级别后置 teardown_module')class TestDemo:def setup_class(self): # 类前置print('2. 类前置 setup_class')def teardown_class(self): # 类后置print("2. 类后置 teardown_class")passdef setup(self): # 前置print("3. 方法前置 setup")def teardown(self): # 后置print("3. 方法后置 teardown")def test_func1(self):print('4. 测试方法 1')def test_func2(self):print('4. 测试方法 2')
执行结果
使用 Fixture 实现
以上的功能都可以使用 Fixture 实现,并且 Fixture 实现更加的灵活。
setup 和 teardown 是针对所有的方法,Fixture 可以针对其中的某几个用例。
方法介绍
Fixture 的实现是依靠装饰器来完成的,可以通过查看代码,发现 Fixture 的常用参数为五个。
def fixture(scope="function", params=None, autouse=False, ids=None, name=None)
参数说明:
scope: 表示装饰器函数的作用域,相当于是方法的级别。可以传递的参数有:"function"
,"class"
,"module"
,"package"
or"session"
function
: 默认级别,即 方法级别,在测试方法执行前执行,class
:类级别, 在测试类中所有方法执行之前执行module
: 模块级别 params: 一个可选的参数列表,用于做Fixture的参数化。可将数据提供给其他的Fixture,或者所有测试使用它 。autouse :bool 值,True
和False
值为 True, 自动调用 Fixture的方法 ids:一个字符串id的列表,即当使用params参数化时,给每一个值设置一个变量名。如果没有提供ID,params将自动生成ID 。name : 用于给方法起别名, 调用的时候使用别名调用。
使用 Fixture 完成前置方法
所有用例执行
设定 autouse 为 True,所有的用例自动执行
import pytest# 1. 定义类前置方法, 设定 autouse 为 True,自动为所有的用例自动执行@pytest.fixture(scope='class', autouse=True)def func1():print('1. 类前置')# 2. 定义 方法前置方法@pytest.fixture(scope='function', autouse=True)def func2():print('2. 方法前置')class TestDemo:def test_func1(self):print('3. 测试方法 1')def test_func2(self):print('3. 测试方法 2')
结果
部分用例执行
import pytest# 1. 定义类前置方法, 设定 autouse 为 True,自动为所有的用例自动执行@pytest.fixture(scope='class', autouse=True)def func1():print('1. 类前置')# 2. 定义 方法前置方法@pytest.fixture(scope='function')def func2():print('2. 方法前置')class TestDemo:def test_func1(self):print('3. 测试方法 1')def test_func2(self, func2):print('3. 测试方法 2')
使用 Fixture 完成后置方法
使用 Fixture 完成后置方法需要使用yield
关键字, 在 yield 上方书写前置方法代码, yield 下方书后置方法代码。
@pytest.fixture()def func():# 书写前置方法代码yield# 书写后置方法代码
代码实现
import pytest# 1. 定义类前置方法, 设定 autouse 为 True,自动为所有的用例自动执行@pytest.fixture(scope='class', autouse=True)def func1():print('1. 类前置')yieldprint('1. 类后置')# 2. 定义 方法前置方法@pytest.fixture(scope='function', autouse=True)def func2():print('2. 方法前置')yieldprint('2. 方法后置')class TestDemo:def test_func1(self):print('3. 测试方法 1')def test_func2(self):print('3. 测试方法 2')
结果
后记
这里简单的介绍下 Fixture 的使用,更多的用法,会后续不断补充。