如何解释 Python coverage.py 分支覆盖结果?

Posted

技术标签:

【中文标题】如何解释 Python coverage.py 分支覆盖结果?【英文标题】:How do I interpret Python coverage.py branch coverage results? 【发布时间】:2016-09-15 04:53:26 【问题描述】:

我正在使用coverage.py 来衡量我的测试的代码覆盖率。我已启用分支覆盖,但我无法完全理解报告。

没有分支覆盖,我得到 100% 的覆盖:

Name                           Stmts   Miss  Cover   Missing
------------------------------------------------------------
mylib/queries.py                  44      0   100%

启用分支覆盖:

Name                           Stmts   Miss Branch BrPart  Cover   Missing
--------------------------------------------------------------------------
mylib/queries.py                  44      1     20      3    94%   55, 21->10, 53->-48, 59->-58

有问题的来源可以在here找到。

21->10 有道理; if 子句永远不会计算为 False (跳回到外部 for 循环的开头)。

但是,53->-4859->-58 让我摸不着头脑。它们是什么意思?

【问题讨论】:

它可能是该 for 循环内的一个空列表,因此它永远不会执行循环内的代码。 嗯,是的,在我提供的测试用例中,循环总是有一些需要咀嚼的东西。那么缺少的“分支”是空集的情况吗? 【参考方案1】:

丹的评论很接近。首先,负数表示从该行号开始的函数退出。所以 -48 表示,从第 48 行开始退出函数。

问题不在于空循环:如果循环完成,这些分支就会发生。看起来他们可能没有。

顺便说一句:Coverage.py 4.1b3 改变了一些这种行为:它们将被标记为53->exit, 59->exit。此外,分支本身的标识可能不同。试试看吧。

【讨论】:

Ned,感谢您抽出宝贵时间回答我的问题,并感谢您提供这个真正有用的软件包。 4.1b3 中的输出肯定更有意义,但我仍然对53->exit 感到困惑;这里的第 53 行是 a for-loop inside a generator function 而不是真正的分支。我错过了什么? 你的 for 循环永远不会结束,所以它永远不会自然地退出函数。不过,我不确定它的作用。也许是个例外? 我明白了。这给了我足够的继续。再次感谢。

以上是关于如何解释 Python coverage.py 分支覆盖结果?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python coverage.py API 中使用省略标志

如果 py.test 从另一个目录执行它,coverage.py 不会覆盖脚本

如何在目录上运行coverage.py?

是否可以从 coverage.py 报告中排除测试目录?

coverage.py:排除文件

Python代码覆盖率工具coverage使用教程