2009-01-18 83 views
9

大多数已建立的语言都为其提供了可靠的测试覆盖工具,但功能深度各不相同。例如,所有各种虚拟机和编译器都有这样的异构结构,编写代码覆盖工具在C语言中的工作必须与Lisp中的工作非常不同。代码覆盖工具如何以不同语言工作?

  • Python有sys.settrace直接告诉你具体哪行执行
  • Clover(用于Java)使用它自己的编译器,并增加了调试的元数据(我最后一次使用它,反正)
  • Emma(用于Java)在运行中具有类加载器,其重新写入的字节码
  • COVER(对于Lisp的)已注释传递到仪器的代码

我间相关捐资代码覆盖的实现为不同的语言:

  1. C0覆盖,在那里你可以跟踪哪些代码行已经执行的主要方法是什么?我提到了本机VM内省和上面的静态和动态代码工具 - 还有其他方法吗?

  2. 与C0相比,获得更多启发式覆盖数据(如C1 or C2)似乎是一种与语言无关的任务。对我来说是很大的Karnaugh map操纵;有没有关于如何真正做到这一点的最佳做法?更多现代逻辑技术如fuzziness发挥作用吗?

  3. 测试覆盖率的一个被忽略的方面是将结果显示给程序员,后者通过C1和C2数据越来越难。坦率地说,虽然他们完成了C0的工作,但我却被大多数测试覆盖界面所困扰;您看到覆盖数据有哪些新颖而直观的界面?

+0

我不太清楚你在这里要求什么,它是如何代码覆盖率在低层次上工作,你基本上取样电脑(http: //en.wikipedia.org/wiki/Program_counter),然后将结果映射到您的源代码?或者他在寻找什么? – Johan 2009-01-18 21:49:00

+0

有趣的..所以对个人电脑进行采样是如何(大多数)覆盖工具为编译为本地代码的语言工作。然而,这只是获得C0的一种方法,而且我对可用于其他语言的技术感兴趣。除了原始问题中的第二个和第三个问题。 – 2009-01-19 12:11:17

回答

6

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

正如您提供的链接所定义的,从编写仪器的人的角度来看,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同样适用于模糊逻辑,它用于推理近似值;通常你希望你的代码覆盖率是确定性的。

卡诺图用于最小化布尔函数,我没有看到任何有用的代码覆盖工具链接。另外,你的问题有时候并不是非常明确:你想要技术来实现更好的代码覆盖,还是只是实现你感兴趣的代码覆盖工具?

-2

在.NET中,优选的方式是使用.NET Profiling API,在CLR本身基本上提供一堆接合点。

0

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

此处发现的技术文章: http://www.semdesigns.com/Company/Publications/TestCoverage.pdf 说明了如何在一般情况下完成此操作。

我公司,语义设计提供,一大套的测试覆盖率工具 提供所谓上述C1覆盖(例如,“科报道”) 所以是的,它通常做法),针对不同的语言 (C,C++,C#,Java,COBOL,PHP,全部为多种 方言)。 See www.semdesigns.com/Products/TestCoverage/index.html