Python pytest 之 setuo 和 teardown

Pytest 的 setup 和 teardown 函数

setup 和 teardown 主要分为:模块级别、类级别、函数级别、方法级别、方法细化级别,分别如下:

方法 描述
setup_module() 在每个模块之前执行
teardown_module() 在每个模块之后执行
setup_class() 在每个类之前执行,即:在一个测试类只运行一次 setup_classteardown_class,不关心测试类内有多少个测试函数。
teardown_class() 在每个类之后执行,即:在一个测试类只运行一次 setup_classteardown_class,不关心测试类内有多少个测试函数。
setup_function() 在每个函数之前执行。
teardown_function() 在每个函数之后执行。
setup_method() 在每个方法之前执行
teardown_method() 在每个方法之后执行
setup() 在每个方法之前执行
teardown() 在每个方法之后执行

扩展:在unittest中前后置只有 setup 和 teardwon、setupClass 和 teardwonClass 两大类。 |

模块级 setup_moduleteardown_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_functionteardown_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_classteardown_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_methodteardown_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表示执行用例只执行一次前置


Python pytest 之 setuo 和 teardown
https://flepeng.github.io/021-Python-34-框架-pytest-Python-pytest-之-setuo-和-teardown/
作者
Lepeng
发布于
2021年4月27日
许可协议