Pytest 的 setup 和 teardown 函数
setup 和 teardown 主要分为:模块级别、类级别、函数级别、方法级别、方法细化级别,分别如下:
方法 |
描述 |
setup_module() |
在每个模块之前执行 |
teardown_module() |
在每个模块之后执行 |
setup_class() |
在每个类之前执行,即:在一个测试类只运行一次 setup_class 和 teardown_class ,不关心测试类内有多少个测试函数。 |
teardown_class() |
在每个类之后执行,即:在一个测试类只运行一次 setup_class 和 teardown_class ,不关心测试类内有多少个测试函数。 |
setup_function() |
在每个函数之前执行。 |
teardown_function() |
在每个函数之后执行。 |
setup_method() |
在每个方法之前执行 |
teardown_method() |
在每个方法之后执行 |
setup() |
在每个方法之前执行 |
teardown() |
在每个方法之后执行 |
扩展:在unittest中前后置只有 setup 和 teardwon、setupClass 和 teardwonClass 两大类。 |
模块级 setup_module
和 teardown_module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import pytest
def setup_module(): print('setup_module:整个.py模块只执行一次') print("比如:所有用例开始前只打开一次浏览器")
def teardown_module(): print('teradown_module:整个.py模块只执行一次') print("比如:所有用例结束只最后关闭浏览器")
def test_001(): print("正在执行第一条用例") p = "Python" assert "h" in p
def test_002(): print("正在执行第二条用例") p = 'Test' assert 'T' in p
if __name__ == '__main__': pytest.main(['-s', 'test_fixt.py'])
|
输出如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ============================= test session starts ============================= platform win32 -- Python 3.7.6, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 rootdir: D:\home\blog\blog\source\_posts\lepeng\python\pytest plugins: cov-2.10.0, django-3.9.0, mock-3.2.0collected 2 items
test.py setup_module:整个.py模块只执行一次 比如:所有用例开始前只打开一次浏览器 .正在执行第一条用例 .正在执行第二条用例 teradown_module:整个.py模块只执行一次 比如:所有用例结束只最后关闭浏览器 [100%]
============================== 2 passed in 0.03s ==============================
|
模块级前置后置只打开一次就执行所有的测试用例
函数级 setup_function
和 teardown_function
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import pytest
def setup_function(): print('setup_function:每个用例前都会执行')
def teardown_function(): print('teardown_function:每个用例后都会执行')
def test_001(): print("正在执行第一条用例") p = "Python" assert "h" in p
def test_002(): print("正在执行第二条用例") p = 'Test' assert 'T' in p
if __name__ == '__main__': pytest.main(['-s', 'test_fixt.py'])
|
输出如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ============================= test session starts ============================= platform win32 -- Python 3.7.6, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 rootdir: D:\home\blog\blog\source\_posts\lepeng\python\pytest plugins: cov-2.10.0, django-3.9.0, mock-3.2.0collected 2 items
test.py setup_function:每个用例前都会执行 .正在执行第一条用例 teardown_function:每个用例后都会执行 setup_function:每个用例前都会执行 .正在执行第二条用例 teardown_function:每个用例后都会执行 [100%]
============================== 2 passed in 0.05s ==============================
|
函数式在每条测试用例执行前都会去执行一次
类里面的函数级别 setup()/teardown()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import pytest class Testcaselist(): def setup(self): print('setup:每个用例前开始执行') def teardown(self): print('teardown:每个用例后开始执行') def test_001(self): print("正在执行第一条用例") p = "Python" assert "h" in p def test_002(self): print("正在执行第二条用例") p = 'test' assert 't' in p
if __name__ == '__main__': pytest.main(['-s', 'test_fixtclass.py'])
|
输出如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ============================= test session starts ============================= platform win32 -- Python 3.7.6, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 rootdir: D:\home\blog\blog\source\_posts\lepeng\python\pytest plugins: cov-2.10.0, django-3.9.0, mock-3.2.0collected 2 items
test.py setup:每个用例前开始执行 .正在执行第一条用例 teardown:每个用例后开始执行 setup:每个用例前开始执行 .正在执行第二条用例 teardown:每个用例后开始执行 [100%]
============================== 2 passed in 0.06s ==============================
|
类里面的在每条测试用例执行前都会去执行一次
类级 setup_class
和 teardown_class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import pytest
class Testcaselist(): print('setup_class:所有用例执行之前') def setup_class(self): print('setup_class:所有用例执行之前') def teardown_class(self): print('teardown_class:所有用例执行结束之后') def test_001(self): print("正在执行第一条用例") p = "Python" assert "h" in p def test_002(self): print("正在执行第二条用例") p = 'test' assert 't' in p if __name__ == '__main__': pytest.main(['-s', 'test_fixtclass.py'])
|
输出如下
1 2 3 4 5 6 7 8 9 10 11 12
| ============================= test session starts ============================= platform win32 -- Python 3.7.6, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 rootdir: D:\home\blog\blog\source\_posts\lepeng\python\pytest plugins: cov-2.10.0, django-3.9.0, mock-3.2.0collected 2 items
test.py setup_class:所有用例执行之前 .正在执行第一条用例 .正在执行第二条用例 teardown_class:所有用例执行结束之后 [100%]
============================== 2 passed in 0.03s ==============================
|
类级前置后置只打开一次就执行所有的测试用例,在一个测试内只运行一次setup_class和teardown_class,不关心测试类内有多少个测试函数。
方法级 setup_method
和 teardown_method
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import pytest class Testcaselist(): def setup_method(self): print('setup_method:每个用例开始之前执行') def teardown_method(self): print('teardown_method:每个用例结束后执行') def test_001(self): print("正在执行第一条用例") p = "Python" assert "h" in p def test_002(self): print("正在执行第二条用例") p = 'test' assert 't' in p if __name__ == '__main__': pytest.main(['-s', 'test_fixtclass.py'])
|
控制台输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ============================= test session starts ============================= platform win32 -- Python 3.7.6, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 rootdir: D:\home\blog\blog\source\_posts\lepeng\python\pytest plugins: cov-2.10.0, django-3.9.0, mock-3.2.0collected 2 items
test.py setup_method:每个用例开始之前执行 .正在执行第一条用例 teardown_method:每个用例结束后执行 setup_method:每个用例开始之前执行 .正在执行第二条用例 teardown_method:每个用例结束后执行 [100%]
============================== 2 passed in 0.03s ==============================
|
方法级的在每条测试用例执行前都会去执行一次
类级+方法级+类里面的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import pytest class Testcaselist(): def setup(self): print('setup:每个用例前开始执行') def teardown(self): print('teardown:每个用例后开始执行') def setup_class(self): print('setup_class:所有用例执行之前') def teardown_class(self): print('teardown_class:所有用例执行结束之后') def setup_method(self): print('setup_method:每个用例开始之前执行') def teardown_method(self): print('teardown_method:每个用例结束后执行') def test_001(self): print("正在执行第一条用例") p = "Python" assert "h" in p def test_002(self): print("正在执行第二条用例") p = 'test' assert 't' in p if __name__ == '__main__': pytest.main(['-s', 'test_fixtclass.py'])
|
控制台输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ============================= test session starts ============================= platform win32 -- Python 3.7.6, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 rootdir: D:\home\blog\blog\source\_posts\lepeng\python\pytest plugins: cov-2.10.0, django-3.9.0, mock-3.2.0collected 2 items
test.py setup_class:所有用例执行之前 setup_method:每个用例开始之前执行 setup:每个用例前开始执行 .正在执行第一条用例 teardown:每个用例后开始执行 teardown_method:每个用例结束后执行 setup_method:每个用例开始之前执行 setup:每个用例前开始执行 .正在执行第二条用例 teardown:每个用例后开始执行 teardown_method:每个用例结束后执行 teardown_class:所有用例执行结束之后 [100%]
============================== 2 passed in 0.03s ==============================
|
从结果看出,运行的优先级:setup_class>setup_method>setup>用例>teardown>teardown_method>teardown_class
setup_module、setup_function
执行顺序:setup_module>>setup_function>>setup。其中setup_module表示执行用例只执行一次前置