注意:我使用pytest的2.7.3版本和旧式的夹具。我现在必须使用此版本。我在Linux上使用python 2.7。
我目前正在使用pytest进行测试,需要在每次测试结束时进行检查。为了继续,我已经写了一个带有终结器的夹具来执行检查但是当我引发异常时我得到了一个奇怪的结果。
以下是代码(针对SO编辑,您可以复制/粘贴以进行测试):
# copy/past to foobar.py and run `python -m pytest -v foobar.py`
import pytest
def check():
assert 0
@pytest.fixture(autouse=True, scope='function')
def fixture_foobar(request):
def tear_down():
check()
request.addfinalizer(tear_down)
def test_ok():
assert 1
def test_nok():
assert 0
所以代码目前有效,但输出看起来很奇怪和错误:
# test pass and finalizer raise exception
# expected result : foobar.py::test_ok FAILED
foobar.py::test_ok PASSED
foobar.py::test_ok ERROR
# test fail and finalizer raise exception
# expected result : foobar.py::test_nok FAILED
foobar.py::test_nok FAILED
foobar.py::test_nok ERROR
终结者无所作为的情况。
所以,如果有人知道如何解决它。可能是我没有好的方法,但终结器听起来是个好主意。
感谢。
编辑:我与pytest_runtest_teardown
挂钩具有相同的内容。
答案 0 :(得分:0)
所以解决方案并不那么难。
Pytest提供了很多hooks,我必须使用{/ 1}} >>执行后运行。
解决方案:
pytest_pyfunc_call
结果:
# conftest.py
def check():
assert 0
def pytest_pyfunc_call(pyfuncitem):
check()
# test_foobar.py
def test_ok():
assert 1
def test_nok():
assert 0
改善它:
默认情况下,如果测试失败且test_foobar.py::test_ok FAILED
test_foobar.py::test_nok FAILED
失败,则只跟踪check()
AssertionError
。如果我在测试失败的情况下找到了忽略check()
的解决方案,我会更新答案。如果您有解决方案,欢迎您!