考虑以下代码:
import math
def dumb_sqrt(x):
result = math.sqrt(x) if x >= 0 else math.sqrt(-x)*j
return result
def test_dumb_sqrt():
assert dumb_sqrt(9.) == 3.
测试可以这样执行:
$ pip install pytest pytest-cov
$ pytest test_thing.py --cov=test_thing --cov-report=html --cov-branch
覆盖率报告将考虑 100% 覆盖的所有行,即使启用了分支覆盖率:
但是,这段代码有一个错误,有敏锐眼光的人可能已经看到了。如果它进入“else”分支,将会有一个例外:
NameError: global name 'j' is not defined
修复错误很容易:将未定义的j
名称更改为文字1j
。添加另一个可以揭示错误的测试也很容易:assert dumb_sqrt(-9.) == 3j
. 这个问题所问的也不是什么。我想知道如何找到尽管有 100% 的代码覆盖率报告但从未实际执行过的代码部分。
使用条件表达式就是这样的罪魁祸首之一,但在 Python 可以使评估短路的任何地方都有类似的情况(x or y
其他x and y
示例)。
最好,上面的第 4 行可以在报告中被着色为黄色,类似于如果首先避免使用条件表达式,“if”行的呈现方式:
是否coverage.py
支持这样的功能?如果是这样,您如何在您的 cov 报告中启用“内联分支覆盖”?如果没有,是否有任何其他方法可以识别您的测试套件从未实际执行过的“隐藏”代码?