是否有相当于xfail的覆盖范围?

时间:2017-11-02 15:16:36

标签: python testing code-coverage pytest

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

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兼容。

1 个答案:

答案 0 :(得分:0)

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