9

大多数成熟的语言都有可靠的测试覆盖工具可供它们使用,但功能的深度因人而异。

此外,所有不同的 VM 和编译器都具有如此异构的结构,例如,在 C 中编写代码覆盖工具肯定是与在 Lisp 中非常不同的工作。

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

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

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

  2. 与 C0 相比,获取更多开明的覆盖数据,如C1 或 C2,似乎是一项与语言无关的任务。对我来说是大卡诺图操纵的味道;是否有关于如何实际执行的最佳实践?模糊性等更现代的逻辑技术是否起作用?

  3. 测试覆盖率的一个被忽视的方面是将结果显示给程序员,这对 C1 和 C2 数据变得越来越困难。坦率地说,虽然他们完成了 C0 的工作,但我对大多数测试覆盖率接口并不满意。你见过哪些新颖直观的覆盖数据界面?

4

3 回答 3

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 模糊逻辑也是如此,它用于推理近似值;通常,您希望代码覆盖率具有确定性。

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

此外,您的问题有时也不是很清楚:您想要实现更好的代码覆盖率的技术,还是只是您感兴趣的代码覆盖率工具的实现?

于 2009-01-21T10:47:20.623 回答
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

于 2009-06-14T04:06:01.437 回答
-2

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

于 2009-01-18T13:00:52.827 回答