如果assert的第二个参数正常使用,它会打印出调试信息。例如使用以下代码:
class TestTest:
def test_test(self):
assert 1 == 2, "TEST"
Run Code Online (Sandbox Code Playgroud)
打印如下调试信息:
tests\test_test.py:1 (TestTest.test_test)
1 != 2
Expected :2
Actual :1
<Click to see difference>
self = <tests.test_test.TestTest object at 0x000002147E5B1B08>
def test_test(self):
> assert 1 == 2, "TEST"
E AssertionError: TEST
E assert 1 == 2
E +1
E -2
test_test.py:3: AssertionError
Run Code Online (Sandbox Code Playgroud)
但是,如果断言发生在辅助函数中,则不会打印:
class TestTest:
def test_test(self):
self.verify(1)
def verify(self, parameter):
assert 1 == 2, "TEST"
Run Code Online (Sandbox Code Playgroud)
结果是:
tests\test_test.py:1 (TestTest.test_test)
1 != 2
Expected :2
Actual :1
<Click to see difference> …Run Code Online (Sandbox Code Playgroud) 我们在一个单独的python文件中定义了所有自定义断言,该文件不是测试模块.
例如:
custom_asserts.py
class CustomAsserts(object):
def silly_assert(self, foo, bar):
assert foo == bar , 'some error message'
Run Code Online (Sandbox Code Playgroud)
如果我们assert直接在测试中使用,我们将获得有关AssertionError的额外信息,这非常有用.
在测试中直接使用断言的输出:
> assert 'foo' == 'bar', 'some error message'
E AssertionError: some error message
E assert 'foo' == 'bar'
E - foo
E + bar
Run Code Online (Sandbox Code Playgroud)
但我们发现,如果我们调用我们在单独模块中定义的断言方法,则不会显示额外信息.
from custom_asserts import CustomAsserts
asserts = CustomAsserts()
def test_silly():
asserts.silly_assert('foo', 'bar')
Run Code Online (Sandbox Code Playgroud)
运行测试后输出:
> assert 'foo' == 'bar', 'some error message'
E AssertionError: some error message
Run Code Online (Sandbox Code Playgroud)
我们还在pytest docs中发现了这一点:高级断言内省
pytest只重写由其测试收集过程直接发现的测试模块,因此在支持模块中断言,这些模块本身不是测试模块,不会被重写.
所以我的问题是,有没有办法让pytest像测试模块那样对其他模块执行相同的断言重写?或者有任何hacky方式来实现这一目标?
我最近学习了使用Pytest在 Python 中进行单元测试。我在Repl.it 中通过对两个应该失败的不同字符串做一个简单的断言来玩弄它。
import pytest
assert 'a' == 'b'
Run Code Online (Sandbox Code Playgroud)
哪个失败并出现错误
Traceback (most recent call last):
File "python", line 2, in <module>
AssertionError
但是 Pytest 不打印 'a' 或 'b'。这对调试非常有帮助,因为我可以比较 2 个不同字符串之间的差异。该单元测试模块在默认情况下此功能。Pytest 有这个功能吗?如果不是我如何启用它?我正在将 Pytest 用于一个更大的项目,并希望在继续工作之前弄清楚这一点。