是否有任何工具/库可以计算python代码的“条件/决策覆盖率”的百分比。我发现只有coverage.py,但它只计算“语句覆盖率”的百分比。
答案 0 :(得分:8)
Coverage.py now includes branch coverage。
对于好奇:在运行之前不修改代码。跟踪功能跟踪执行中的哪些行,并将该信息与已编译字节代码的静态分析进行比较,以找出未执行的路径可能性。
答案 1 :(得分:2)
您在寻找cyclomatic complexity (Wikipedia)吗?它基本上计算通过一段代码的路径数。有一些项目可以为Python代码计算,例如PyMetrics或this 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)