Python pytest 测试用例之 setup 与 teardown 方法

pytest框架用例运行级别

  • 模块级(setup_module/teardown_module)开始于横块始末,全局的,(不在类中)

  • 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)

  • 类级(setup_class/teardown_calss)只在类中执行用例时 运行一次(在类中)

  • 方法级(setup_method/teardown_method)开始于方法始末(在类中)

  • (setup/teardown)运行在调用方法前后(类中类外均可)

01 模块级 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 ==============================

控制台输出解析

模块级前置后置只打开一次就执行所有的测试用例

02 函数级 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 ==============================

输出解析

函数式在每条测试用例执行前都会去执行一次

03类里面的,函数级别 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 ==============================

输出解析

类里面的在每条测试用例执行前都会去执行一次

04类级 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_class和teardown_class,不关心测试类内有多少个测试函数。

05方法级 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 ==============================

方法级的setup_method、teardown_method控制台输出解析

方法级的在每条测试用例执行前都会去执行一次

06类级+方法级+类里面的

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

07 setup_module、setup_function

执行顺序:setup_module>>setup_function>>setup。其中setup_module表示执行用例只执行一次前置


Python pytest 测试用例之 setup 与 teardown 方法
https://flepeng.github.io/021-Python-32-框架-pytest-Python-pytest-测试用例之-setup-与-teardown-方法/
作者
Lepeng
发布于
2021年4月27日
许可协议