【问题标题】:Is there an equivalent of xfail for coverage?是否有相当于 xfail 的覆盖范围?
【发布时间】:2017-11-02 15:16:35
【问题描述】:

有时我会处理一些我相当肯定会是边缘情况的情况,但我想不出一个会出现的例子,所以我无法为它想出一个测试用例。我想知道是否有一种方法可以在我的代码中添加一个编译指示,这样如果将来测试中的某些更改意外开始覆盖这一行,我会注意到这一事实(因为这种意外覆盖将产生所需的测试用例,但可能作为实现细节,使这条线的覆盖脆弱)。我想出了一个人为的例子:

mysquare.py:

def mysquare(x):
    ov = x * x

    if abs(ov) != ov or type(abs(ov)) != type(ov):
        # Always want this to be positive, though why would this ever fail?!
        ov = abs(ov)  # pragma: nocover

    return ov

然后在我的测试套件中我开始:

from hypothesis import given
from hypothesis.strategies import one_of, integers, floats

from mysquare import mysquare

NUMBERS = one_of(integers(), floats()).filter(lambda x: x == x)

@given(NUMBERS)
def test_mysquare(x):
    assert mysquare(x) == abs(x * x)

@given(NUMBERS)
def test_mysquare_positive(x):
    assert mysquare(x) == abs(mysquare(x))

nocover 线永远不会被击中,但这只是因为我想不出办法到达它!然而,在遥远的未来的某个时候,我决定mysquare 应该支持复数,所以我更改了NUMBERS

NUMBERS = one_of(integers(), floats(),
                 complex_numbers()).filter(lambda x: x == x)

现在我突然出乎意料地覆盖了这条线,但我没有注意到这个事实。是否有类似nocover 的东西更像pytest.xfail - 作为没有测试覆盖该特定行的肯定断言?最好兼容pytest

【问题讨论】:

标签: python testing code-coverage pytest


【解决方案1】:

Coverage.py 还没有这个特性,但它是一个有趣的特性:一个标记为未覆盖的行的警告,实际上被覆盖了。作为一个困难的黑客,你可以做一些事情,比如禁用你的 nocover pragma,并收集覆盖的行,并将它们与带有 pragma 的行号进行比较.... Ick。

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多