在 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
我 运行 使用覆盖率插件 (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