代码覆盖工具如何在不同语言中工作?

时间:2009-01-18 12:24:05

标签: unit-testing language-agnostic code-coverage

大多数已建立的语言都有可靠的测试覆盖工具,但功能深度各不相同。

此外,所有各种虚拟机和编译器都具有这样的异构结构,例如,编写代码覆盖工具必须是C中与Lisp完全不同的工作。

  • Python有sys.settrace直接告诉你哪些行正在执行
  • Clover(对于Java)使用自己的编译器并添加调试元数据(无论如何我上次使用它)
  • Emma(对于Java)有一个ClassLoader,它可以动态重写字节码
  • COVER(对于Lisp)有一个注释传递来检测代码

我对不同语言的代码覆盖率实现感兴趣:

  1. 获取C0覆盖率的主要方法是什么,您可以在哪里跟踪已执行的代码行?我在上面提到了本机VM内省以及静态和动态代码检测 - 还有其他方法吗?

  2. 与C0相比,获取更加开明的覆盖率数据(如C1 or C2)似乎是一种与语言无关的任务。对我来说有点大Karnaugh map操纵;有关于如何实际操作的最佳实践吗?是否有更多现代逻辑技术如fuzziness发挥作用?

  3. 测试覆盖范围的一个被忽视的方面是将结果显示给程序员,这对C1和C2数据越来越难。坦率地说,虽然他们完成了C0的工作,但我对大多数测试覆盖接口都不感兴趣;您在覆盖数据方面看到了哪些新颖直观的界面?

3 个答案:

答案 0 :(得分:5)

基本上所有代码覆盖工具都会检测代码,以便检查代码的哪些部分已执行。

根据您提供的链接中的定义,从编写仪器的人的角度来看,C0和C1非常相似。唯一的区别是您放置代码的位置。我将进一步推测C1比C0更容易,因为仪器发生在抽象语法级别上,其中行结束不太重要。

我说C1更容易的另一个原因是因为它处理句法实体而不是词汇实体:你会如何评价:

if
c > 1 && c
< 10
then
blabla
end

嗯,只是一个想法。

对于C2,我从来没有在实践中看到它。原因是你可以得到一个指数式的爆炸:

if c1 then * else * end
if c2 then * else * end
...
if cn then * else * end

对于n行代码,您需要2 ^ n次测试。另外,你做什么循环?通常,您将它们抽象为简单的if语句(即,对于每个循环,您测试其身体在一次测试中执行0次,在另一次测试中至少执行一次)。

我认为对PC进行采样是一种特别糟糕的代码覆盖方式,因为你可能会错过一些语句,因为它们的执行速度太快了:D同样适用于模糊逻辑,用于推理近似值;通常,您希望代码覆盖率具有确定性。

卡诺图用于最小化布尔函数,我没有看到任何与代码覆盖工具有用的链接。

此外,您的问题有时并不十分明确:您是否希望技术能够实现更好的代码覆盖率,还是只是实现您感兴趣的代码覆盖率工具?

答案 1 :(得分:0)

几乎适用于所有语言的一种方法是插入检测 使用程序转换系统。

此处发现的技术文件: http://www.semdesigns.com/Company/Publications/TestCoverage.pdf 解释了如何做到这一点。

我的公司Semantic Designs提供了大量的测试覆盖工具 提供上面所谓的C1覆盖(例如,“分支覆盖”) 对于不同的语言,所以是 通常已完成) (C,C ++,C#,Java,COBOL,PHP,都是多个 方言)。 见www.semdesigns.com/Products/TestCoverage/index.html

答案 2 :(得分:-2)

在.NET中,首选的方法是使用.NET Profiling API,它基本上在CLR中提供了一堆联合点。