setup和teardown的使用
一、前言
Pytest也提供了对于环境准备的类似setup、teardown的方法有一下几个:
- 目录级别:conftest.py
- 模块级别:setup_module、teardown_module
- 类级别:setup_class、teardown_class
- 函数级别:setup_function、teardown_function,不在类中的方法
- 方法级别:setup_method、teardown_method
- 方法细化级别:setup、teardown
二、方法级别:setup_method、teardown_method
方法级别 的初始化、清除 分别 在类的 每个测试方法 执行前后执行,并且 `每个用例分别执行1次,`如下定义 setup_method 和 teardown_method 实例方法:在test_case包下创建test_case01.py代码如下
class Test_pass: def setup_method(self): print("********方法级别的初始化:setup_method********") def teardown_method(self): print("********方法级别的清除:teardown_method********") def test_01(self): print('********用例01********') assert 1 == 1 def test_02(self): print('********用例02********') assert 2 == 2 def test_03(self): print('********用例03********') assert 3 == 2
执行命令:pytest -sv .\test_case\test_case05.py,结果如下:

可以发现,方法别的初始化、清除 在 整个模块所有用例 执行前后 分别 `执行一次`
三、类级别:setup_class、teardown_class
`类级别` 的初始化、清除 分别 在整个类的测试用例 执行前后执行,并且 `只会执行1次,`如下定义 setup_class 和 teardown_class 类方法:
import pytest class Test_pass: @classmethod def setup_class(cls): print("********类级别的初始化:setup_class********") @classmethod def teardown_class(cls): print("********类级别的清除:teardown_class********") def setup_method(self): print("********方法级别的初始化:setup_method********") def teardown_method(self): print("********方法级别的清除:teardown_method********") def test_01(self): print('********用例01********') assert 1 == 1 def test_02(self): print('********用例02********') assert 2 == 2 def test_03(self): print('********用例03********') assert 3 == 3 if __name__ == '__main__': pytest.main(["-s", "test_case05.py::Test_pass::test_01"])
执行后如下图:

可以发现,类级别的初始化、清除 在 整个模块每一个类的用例 执行前后 分别 `执行1次` 。它主要是用来为该 `类` 中的所有测试用例做 `公共的` 初始化 和 清除
四、模块级别:setup_module、teardown_module
`模块级别` 的初始化、清除 分别 在整个模块的测试用例 执行前后执行,并且 `只会执行1次` 。如下定义 setup_module 和 teardown_module 全局函数,代码如下:
import pytest def setup_module(): print("********模块级别的初始化:setup_module********") def teardown_module(): print("********模块级别的清除:teardown_module********") class Test_pass01: @classmethod def setup_class(cls): print("********类级别的初始化:setup_class********") @classmethod def teardown_class(cls): print("********类级别的清除:teardown_class********") def setup_method(self): print("********方法级别的初始化:setup_method********") def teardown_method(self): print("********方法级别的清除:teardown_method********") def test_01(self): print('********用例01********') assert 1 == 1 def test_02(self): print('********用例02********') assert 2 == 2 def test_03(self): print('********用例03********') assert 3 == 3 class Test_pass02: def test_04(self): print('********用例04********') assert 2 == 2 def test_05(self): print('********用例05********') assert 3 == 3 if __name__ == '__main__': pytest.main(["-s", "test_case05.py"])
代码执行如下:

目标级别的 初始化清除,就是针对整个目录执行的初始化、清除。需要初始化的目录下面创建 一个名为 conftest.py
import pytest @pytest.fixture(scope="package", autouse=True) def emptyEnv(): print("********目录级别的初始化********") yield print("********目录级别的清除********")
代码执行后如下:

注意:这里清除环境的代码就是 yield 之后的代码。 这是一个生成器。我们可以在多个目录下面放置这样的文件,定义该目录的初始化清除。pytest 在执行测试时,会层层调用。
六、方法细化级别:setup、teardown
方法细化级别:setup、teardown,再会在类中每一条用例之前和之后分别执行一次,代码如下:
class Test_pass02: def setup(self): print("********方法细化级别的初始化:setup********") def teardown(self): print("********方法细化级别的清除:teardown********") def test_04(self): print('********用例04********') assert 2 == 2 def test_05(self): print('********用例05********') assert 3 == 3
执行后结果如下:

七、函数级别:setup_function、teardown_function
函数级别:setup_function、teardown_function,不在类中的方法,会在用例之前和之后分别执行一次:
def setup_function(): print("********函数级别的初始化:setup_function********") def teardown_function(): print("********函数级别的清除:teardown_function********") # 用例 def test_07(): print('********用例02********') assert 2 == 2
执行后结果如下:


浙公网安备 33010602011771号