我注意到 pytest 正在覆盖自定义断言语句,除非它们在测试主体中直接调用 or 语句是明确的
assert False
。这是一些显示交互的示例代码:
def assert_equality():
assert 1 == 0, 'pytest will not display this message'
def assert_boolean():
assert False, 'this message will be displayed'
def test_nested_assertion_equality():
assert_equality()
def test_nested_assertion_boolean():
assert_boolean()
def test_assertion_equality():
assert 1 == 0, 'this message also will be displayed'
这些测试的输出:
test_experiment.py:8 (test_nested_assertion_equality)
1 != 0
Expected :0
Actual :1
<Click to see difference>
def test_nested_assertion_equality():
> assert_equality()
test_experiment.py:10:
test_experiment.py:12 (test_nested_assertion_boolean)
def test_nested_assertion_boolean():
> assert_boolean()
test_experiment.py:14:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
def assert_boolean():
> assert False, 'this message will be displayed'
E AssertionError: this message will be displayed
E assert False
test_experiment.py:6: AssertionError
test_experiment.py:16 (test_assertion_equality)
1 != 0
Expected :0
Actual :1
<Click to see difference>
def test_assertion_equality():
> assert 1 == 0, 'this message also will be displayed'
E AssertionError: this message also will be displayed
E assert 1 == 0
test_experiment.py:18: AssertionError
为什么会这样?有办法阻止吗?
发生这种情况是因为 pytest 的断言重写功能只会重写直接在测试函数体中执行的断言。当您从测试函数中调用 assert_equality() 或 assert_boolean() 时,pytest 无法重写断言消息。 解决此问题的一种方法是将断言消息作为参数传递给自定义断言函数。 例子:
def assert_equality(msg):
assert 1 == 0, msg
def test_nested_assertion_equality():
assert_equality('this message will be displayed')