在 pytest 覆盖率报告中,“->”对于缺失行意味着什么?

In a pytest coverage report, what does "->" mean for missing lines?

我 运行 使用覆盖率插件 (pytest --cov) 进行 pytest,在报告中我得到以下行:

Name          Stmts   Miss Branch BrPart  Cover   Missing
---------------------------------------------------------
foo.py            5      1      2      1    71%   3->5, 5

我知道 3-5 意味着它错过了第 3 到 5 行,但我不知道 -> 是什么意思。从测试逻辑来看,我预计只会报告 5。作为参考,这是我使用的代码:

# foo.py

class Test:
    def __lt__(self, other):
        if type(self) == type(other):
            return False
        return NotImplemented


# test_foo.py

def test_lt():
    test = Test()
    assert not (test < test)

我假设你启用了分支覆盖。基本上,根据 link 中的 post,3->5 只是表示从第 3 行跳到第 5 行的分支,在您的情况下,它指的是 if type(self) == type(other)为假并直接跳转到 return NotImplemented(这在您的测试用例中从未发生过)。

归功于这个问题,

Coverage 收集代码中从一行(源)到另一行(目标)的转换对。在某些情况下,某些转换可能会被跳过,例如在条件语句或中断语句中,然后它将被测量为缺少分支(或缺少转换)。

例如,在您的代码中有一个可以跳转的转换。

if type(self) == type(other):
       return False
   return NotImplemented

看到从第 3 行到第 5 行的转换不一定会发生,因为 if 语句可能不会计算为 False。因此,由于缺少从第 3 行到第 5 行的跳转,分支覆盖会将此代码标记为未完全覆盖。

参考资料

分支覆盖率是如何工作的。 https://coverage.readthedocs.io/en/latest/branch.html#how-it-works