python - pytest:将测试标记为“必须通过”,如果失败则停止测试
问题描述
我正在尝试实现一个pytest
名为 的新标记,@pytest.mark.must_pass
以指示如果标记的测试失败,pytest 应该跳过所有后续测试并终止。
如果标记的测试失败,我已经能够使用pytest_runtest_call
钩子让 pytest 终止,但我正在使用pytest.exit
,它不会打印回溯,也不会显示相关测试的失败指示。
我需要将此失败显示为任何其他测试失败,除了 pytest 在打印需要打印的任何内容以详细说明失败后停止测试。
到目前为止我的代码:
# Copied this implementation from _pytest.runner
def pytest_runtest_call(item):
_update_current_test_var(item, "call")
try:
del sys.last_type
del sys.last_value
del sys.last_traceback
except AttributeError:
pass
try:
item.runtest()
except Exception:
# Store trace info to allow postmortem debugging
type, value, tb = sys.exc_info()
assert tb is not None
tb = tb.tb_next # Skip *this* frame
sys.last_type = type
sys.last_value = value
sys.last_traceback = tb
del type, value, tb # Get rid of these in this frame
# If test is marked as must pass, stop testing here
if item.iter_markers(name = "must_pass"):
pytest.exit('Test marked as "must_pass" failed, terminating.')
raise
pytest 中是否已经有这样做的机制?
任何帮助将不胜感激。
谢谢。
解决方案
所以这可以通过使用pytest_runtest_makereport
和来实现pytest_runtest_setup
在您的conftest.py
中,您将放置以下内容:
import pytest
def pytest_runtest_makereport(item, call):
if item.iter_markers(name='must_pass'):
if call.excinfo is not None:
parent = item.parent
parent._mpfailed = item
def pytest_runtest_setup(item):
must_pass_failed = getattr(item.parent, '_mpfailed', None)
if must_pass_failed is not None:
pytest.skip('must pass test failed (%s)' % must_pass_failed.name)
现在,当我们使用以下内容对其进行测试时:
import pytest
def foo(a, b):
return a + b
def test_foo_1():
assert foo(1, 1) == 2
@pytest.mark.must_pass
def test_foo_2():
assert foo(2, 2) == 6
def test_foo_3():
assert foo(3, 3) == 6
def test_foo_4():
assert foo(4, 4) == 8
我们看到了想要的输出:
▲ = pytest test.py
=============================================================== test session starts ================================================================
platform darwin -- Python 3.6.5, pytest-4.6.2, py-1.8.0, pluggy-0.12.0
rootdir: /Users/foo/Desktop/testing, inifile: pytest.ini
plugins: cov-2.7.1
collected 4 items
test.py .Fss [100%]
===================================================================== FAILURES =====================================================================
____________________________________________________________________ test_foo_2 ____________________________________________________________________
@pytest.mark.must_pass
def test_foo_2():
> assert foo(2, 2) == 6
E assert 4 == 6
E + where 4 = foo(2, 2)
test.py:14: AssertionError
================================================== 1 failed, 1 passed, 2 skipped in 0.08 seconds ===================================================
推荐阅读
- kubernetes - 在 GCP 上部署 Weaviate k8s 设置时无法在 API 组中列出资源“configmaps”
- ios - iOS:我的绘图弹出框出现问题,自 iOS13 以来显示效果不佳
- android - Android 应用程序在 logcat 上没有堆栈跟踪而崩溃
- java - java中的数组到堆栈,并删除运算符
- sql - 用sql加入记录?
- podman - 使用非默认网络运行 podman 创建的容器中的网络不可用
- python - 如何升级 pip 包管理器?
- drupal - 如何在树枝模板中显示内容类型自定义字段?
- python - 无法通过python中的sqlalchemy从postgresql创建表
- angular - 特定 div 上的 Mat-dialog