是否有任何工具/库可以计算 python 代码的“条件/决策覆盖率”百分比。我只找到了coverage.py,但它只计算了“语句覆盖率”的百分比。
7 回答
对于好奇:代码在运行之前没有被修改。跟踪函数跟踪执行中的哪些行,并将该信息与已编译字节码的静态分析进行比较,以找到未执行的路径可能性。
我不知道任何用于 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 节点。
我自己没有用过,但是如果你愿意用变异测试代替覆盖分析,我听说过一个变异测试器,叫做“pester”。
在我进行谷歌搜索时,我还发现了一个 python 测试工具列表,其中提到了一些可能的代码覆盖工具。
您在寻找圈复杂度(维基百科)吗?它基本上计算通过一段代码的路径数。有一些项目可以为 Python 代码计算它,例如PyMetrics或这个。谷歌肯定会带来更多。
但是我不知道与单元测试的任何进一步集成会显示覆盖率。
coverage.py 的同一维护者有一篇文章讨论了一种在字节码级别获取覆盖信息的方法。该方法有点笨拙:它涉及使用经过调整的行号重新组装 .pyc 文件。但是,它提供了您所要求的尽可能多的覆盖测量粒度。
恕我直言,解析和修改 AST 是正确的答案。有关您需要做的事情的完整描述,请参阅本文:“Branch Coverage Made Easy for Arbitrary Languages”
http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf