gpt4 book ai didi

python - 使覆盖率仅计算成功的测试并忽略 xfailing 测试

转载 作者:行者123 更新时间:2023-12-01 08:49:19 24 4
gpt4 key购买 nike

我有许多项目,我使用 pytest.mark.xfail 标记来标记失败但不应该失败的测试,以便失败的测试用例可以在问题解决之前添加。我不想跳过这些测试,因为如果我所做的某些事情导致它们开始通过,我希望得到通知,以便我可以删除xfail标记避免回归。

问题是,由于 xfail 测试实际上会运行直到失败,因此导致失败的任何行都会被视为“已覆盖”,即使它们是未通过测试的一部分,这给了我一些误导性的指标,让我知道有多少代码实际上经过了测试,可以正常工作。一个最小的例子是:

pkg.py

def f(fail):
if fail:
print("This line should not be covered")
return "wrong answer"

return "right answer"

test_pkg.py

import pytest
from pkg import f

def test_success():
assert f(fail=False) == "right answer"

@pytest.mark.xfail
def test_failure():
assert f(fail=True) == "right answer"

运行python -m pytest --cov=pkg,我得到:

platform linux -- Python 3.7.1, pytest-3.10.0, py-1.7.0, pluggy-0.8.0
rootdir: /tmp/cov, inifile:
plugins: cov-2.6.0
collected 2 items

tests/test_pkg.py .x [100%]

----------- coverage: platform linux, python 3.7.1-final-0 -----------
Name Stmts Miss Cover
----------------------------
pkg.py 5 0 100%

如您所见,所有五行都被覆盖,但第 3 行和第 4 行仅在 xfail 测试期间被命中。

我现在处理这个问题的方法是设置tox来运行pytest -m "not xfail"--cov && pytest -m xfail之类的东西,但是在除了有点麻烦之外,这只是过滤掉带有 xfail 标记的东西,这意味着 有条件的 xfails 也会被过滤掉,无论条件是否满足遇见了。

有没有办法让覆盖率pytest不计算失败测试的覆盖率?或者,我可以使用一种忽略 xfail 测试覆盖率的机制,该机制仅在满足条件时忽略条件 xfail 测试。

最佳答案

由于您使用的是 pytest-cov 插件,请利用它的 no_cover标记。当使用 pytest.mark.no_cover 注解时,测试时将关闭代码覆盖率。唯一需要实现的是将 no_cover 标记应用于所有标有 pytest.mark.xfail 的测试。在您的 conftest.py 中:

import pytest

def pytest_collection_modifyitems(items):
for item in items:
if item.get_closest_marker('xfail'):
item.add_marker(pytest.mark.no_cover)

运行您的示例现在将产生:

$ pytest --cov=pkg -v
=================================== test session starts ===================================
platform darwin -- Python 3.7.1, pytest-3.9.1, py-1.7.0, pluggy-0.8.0
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private/stackoverflow, inifile:
plugins: cov-2.6.0
collected 2 items

test_pkg.py::test_success PASSED [ 50%]
test_pkg.py::test_failure xfail [100%]

---------- coverage: platform darwin, python 3.7.1-final-0 -----------
Name Stmts Miss Cover
----------------------------
pkg.py 5 2 60%


=========================== 1 passed, 1 xfailed in 0.04 seconds ===========================

编辑:处理xfail标记中的条件

标记参数可以通过 marker.argsmarker.kwargs 访问,因此,如果您有标记

@pytest.mark.xfail(sys.platform == 'win32', reason='This fails on Windows')

访问参数

marker = item.get_closest_marker('xfail')
condition = marker.args[0]
reason = marker.kwargs['reason']

为了考虑条件标志,上面的钩子(Hook)可以修改如下:

def pytest_collection_modifyitems(items):
for item in items:
marker = item.get_closest_marker('xfail')
if marker and (not marker.args or marker.args[0]):
item.add_marker(pytest.mark.no_cover)

关于python - 使覆盖率仅计算成功的测试并忽略 xfailing 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53191930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com