pytest-assume
# pytest-assume
# 什么是 pytest-assume
- 一个可以允许 pytest 测试用例中执行多个失败的断言的插件
- 即使上面的断言1,断言2,断言3 都失败的情况下,其下的断言都能被执行
- 源于
pytest-expect
插件并进行了改进- 支持 showlocals(即 Pytest 命令行的
-l
参数, 显示执行过程中的局部变量) - 可以全局使用,无需指定 fixtrue 装饰器(即任意
test_xxx
函数中都能用) - 对断言输出做了一些格式上的美化
- 支持 showlocals(即 Pytest 命令行的
# 为什么要使用 pytest-assume
- 使用原生 python 的 assert,就会遇到一个断言失败则全部失败的情况,比如说,断言1 结果为 Failed,那么其下的断言2 和断言3 都不会被执行
- 如果希望其下的断言1 和断言2 继续执行,就可能获取更多的断言结果更好的定位问题
# pytest-assume 安装
pip install git+https://github.com/astraw38/pytest-assume.git
或者
pip install pytest-assume
1
2
3
2
3
# pytest-assume 使用
# 简单例子
# Python 的 assert 断言
def test_add1():
assert 1 + 4 == 5
assert 1 + 3 == 3
assert 2 + 5 == 7
assert 2 + 5 == 9
print("执行完成")
# Pytest 的 assume 断言
import pytest
def test_add2():
pytest.assume(1 + 4 == 5)
pytest.assume(1 + 3 == 3)
pytest.assume(2 + 5 == 7)
pytest.assume(2 + 5 == 9)
print("测试完成")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
执行结果:
点击查看结果
test_assume.py::test_add1 FAILED
test_assume.py:1 (test_add1)
4 != 3
Expected :3
Actual :4
<Click to see difference>
def test_add1():
assert 1 + 4 == 5
> assert 1 + 3 == 3
E assert 4 == 3
test_assume.py:4: AssertionError
test_assume.py::test_add2 测试完成
FAILED
test_assume.py:10 (test_add2)
tp = <class 'pytest_assume.plugin.FailedAssumption'>, value = None, tb = None
def reraise(tp, value, tb=None):
try:
if value is None:
value = tp()
if value.__traceback__ is not tb:
> raise value.with_traceback(tb)
E pytest_assume.plugin.FailedAssumption:
E 2 Failed Assumptions:
E
E test_assume.py:13: AssumptionFailure
E >> pytest.assume(1 + 3 == 3)
E AssertionError: assert False
E
E test_assume.py:15: AssumptionFailure
E >> pytest.assume(2 + 5 == 9)
E AssertionError: assert False
E:\venv-path\pytest-path\lib\site-packages\six.py:718: FailedAssumption
================================== FAILURES ===================================
__________________________________ test_add1 __________________________________
def test_add1():
assert 1 + 4 == 5
> assert 1 + 3 == 3
E assert 4 == 3
test_assume.py:4: AssertionError
__________________________________ test_add2 __________________________________
tp = <class 'pytest_assume.plugin.FailedAssumption'>, value = None, tb = None
def reraise(tp, value, tb=None):
try:
if value is None:
value = tp()
if value.__traceback__ is not tb:
> raise value.with_traceback(tb)
E pytest_assume.plugin.FailedAssumption:
E 2 Failed Assumptions:
E
E test_assume.py:13: AssumptionFailure
E >> pytest.assume(1 + 3 == 3)
E AssertionError: assert False
E
E test_assume.py:15: AssumptionFailure
E >> pytest.assume(2 + 5 == 9)
E AssertionError: assert False
E:\venv-path\pytest-path\lib\site-packages\six.py:718: FailedAssumption
=========================== short test summary info ===========================
FAILED test_assume.py::test_add1 - assert 4 == 3
FAILED test_assume.py::test_add2 - pytest_assume.plugin.FailedAssumption:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
可以看出:
- test_add1 断言失败后正确的断言没有执行
- test_add2 断言失败后正确的断言继续执行
# pytest-assume 上下文管理器 with
import pytest
from pytest import assume
@pytest.mark.parametrize(('x', 'y'), [(1, 1), (1, 0), (0, 1)])
def test_simple_assume1(x, y):
with assume: assert x == y
with assume: assert True
with assume: assert False
@pytest.mark.parametrize(('x', 'y'), [(1, 1), (1, 0), (0, 1)])
def test_simple_assume2(x, y):
with pytest.assume:
assert x == y
assert True
assert False
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
注意
如果上下文管理器里面包含多个断言,如果第一个断言失败,后面的不会被执行
# 参考文档
官方文档-pytest-assuem (opens new window)
(完)