python中的条件覆盖率

时间:2009-03-24 12:47:09

标签: python unit-testing code-coverage

是否有任何工具/库可以计算python代码的“条件/决策覆盖率”的百分比。我发现只有coverage.py,但它只计算“语句覆盖率”的百分比。

7 个答案:

答案 0 :(得分:8)

Coverage.py now includes branch coverage

对于好奇:在运行之前不修改代码。跟踪功能跟踪执行中的哪些行,并将该信息与已编译字节代码的静态分析进行比较,以找出未执行的路径可能性。

答案 1 :(得分:2)

您在寻找cyclomatic complexity (Wikipedia)吗?它基本上计算通过一段代码的路径数。有一些项目可以为Python代码计算,例如PyMetricsthis one。谷歌肯定会带来更多。

但我不知道是否会进一步整合单元测试,以显示覆盖范围。

答案 2 :(得分:2)

我不知道Python的任何分支覆盖工具,尽管我已经考虑过编写一个。我的想法是从AST开始并为每个分支点插入额外的仪器。这是可行的,但有一些棘手的案例。

例如,

raise SomeException(x)

此分支覆盖需要检查SomeException(x)是否已完全实例化,并且没有引发自己的异常。

assert x, "Oh No!: %r" % (x, y)

这需要检查断言语句右侧的文本是否已完全评估。

return args.name or os.getenv("NAME") or die("no name present")

前两个术语中的每一个都必须检查真/假路径,但不是最后一个。事实上,最后一个甚至可能不会回来。

有很多案例需要担心,除了好奇心我没有迫切的需要,所以我没有去任何地方。我也想知道我是否会得到很多误报,我需要某种方法来压制特定的警告。

如果您想尝试这条路线,请从Python 2.6或3.0开始。在这些版本中,AST模块已记录在案,您可以在生成代码或.pyc文件之前创建自己的AST节点。

答案 3 :(得分:2)

我自己没有使用它,但是如果你愿意用mutation testing替换覆盖率分析,我听说过一个名为“pester”的变异测试器。

当我在谷歌搜索时,我也遇到了a list of python testing tools,它提到了一些可能的代码覆盖工具。

答案 4 :(得分:1)

coverage.py的维护者有一篇文章讨论了get coverage information at the bytecode level的方法。该方法有点笨拙:它涉及使用经过调整的行号重新组装.pyc文件。但是,它提供的覆盖率测量的粒度与您所要求的一样多。

答案 5 :(得分:0)

解析并修改AST是正确答案,恕我直言。见本文 有关您需要做什么的完整描述: “任意语言的分支覆盖范围很容易”

http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

答案 6 :(得分:0)

看起来像是"乐器"实现条件覆盖:

Instrumental on Pypi

Link about coverage.py and instrumental

有人试过吗?它有一个很小的版本号。我需要一些值得信赖的东西。