用Cobertura测量测试覆盖率2011-04-01 IBM Elliotte Rusty HarolCobertura 是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了 哪些代码和没有执行哪些代码,来测量测试覆盖率。除了找出未测试到的代码并发现 bug 外,Cobertura 还可以通过标记无用的、执行不到的代码来优化代码,还可以提供 API 实际操作的内部信息。Elliotte Rusty Harold 将与您分享如何利用代码覆盖率的最佳实 践来使用 Cobertura。尽管测试先行编程(test-first programming)和单元测试已不能算是新概念,但测 试驱动的开发仍然是过去 10 年中最重要的编程创新。最好的一些编程人员在过去半个世 纪中一直在使用这些技术,不过,只是在最近几年,这些技术才被广泛地视为在时间及成 本预算内开发健壮的无缺陷软件的关键所在。但是,测试驱动的开发不能超过测试所能达 到的程度。测试改进了代码质量,但这也只是针对实际测试到的那部分代码而言的。您需 要有一个工具告诉您程序的哪些部分没有测试到,这样就可以针对这些部分编写测试代码 并找出更多 bug。Mark Doliner 的 Cobertura (cobertura 在西班牙语是覆盖的意思)是完成这项任 务的一个免费 GPL 工具。Cobertura 通过用额外的语句记录在执行测试包时,哪些行被 测试到、哪些行没有被测试到,通过这种方式来度量字节码,以便对测试进行监视。然后 它生成一个 HTML 或者 XML 格式的报告,指出代码中的哪些包、哪些类、哪些方法和哪 些行没有测试到。可以针对这些特定的区域编写更多的测试代码,以发现所有隐藏的 bug 。阅读 Cobertura 输出我们首先查看生成的 Cobertura 输出。图 1 显示了对 Jaxen 测试包运行 Cobertura 生成的报告(请参阅 参考资料)。从该报告中,可以看到从很好(在 org.jaxen.expr.iter 包中几乎是 100%)到极差(在 org.jaxen.dom.html 中完全没有 覆盖)的覆盖率结果。图 1. Jaxen 的包级别覆盖率统计数据

Cobertura 通过被测试的行数和被测试的分支数来计算覆盖率。第一次测试时,两种 测试方法之间的差别并不是很重要。Cobertura 还为类计算平均 McCabe 复杂度(请参阅 参考资料)。可以深入挖掘 HTML 报告,了解特定包或者类的覆盖率。图 2 显示了 org.jaxen.function 包的覆盖率统计。在这个包中,覆盖率的范围从 SumFunction 类的 100% 到 IdFunction 类的仅为 5%。图 2. org.jaxen.function 包中的代码覆盖率

进一步深入到单独的类中,具体查看哪一行代码没有测试到。图 3 显示了 NameFunction 类中的部分覆盖率。最左边一栏显示行号。后一栏显示了执行测试时这一 行被执行的次数。可以看出,第 112 行被执行了 100 次,第 114 行被执行了 28 次。 用红色突出显示的那些行则根本没有测试到。这个报告表明,虽然从总体上说该方法被测 试到了,但实际上还有许多分支没有测试到。图 3. NameFunction 类中的代码覆盖率