大多数已建立的语言都可以使用可靠的测试覆盖工具,但是每种工具的功能深度差异很大。

同样,所有各种VM和编译器都具有这种异构结构,例如,编写代码覆盖率工具与使用Lisp相比,在C语言中必须是非常不同的工作。

  • Python有sys.settrace可以直接告诉您哪些行正在执行
  • Clover(用于Java)使用其自己的编译器并添加调试元数据(无论如何我上次使用它)
  • Emma(用于Java)具有ClassLoader,可即时重写字节码
  • COVER(用于Lisp)具有注释通行证,以检测
  • 代码

    我对不同语言的代码覆盖率的实现感兴趣:
  • 获得C0覆盖率的主要方法是什么,您可以在其中跟踪已执行了哪些代码行?我在上面提到了 native VM自省(introspection)以及静态和动态代码检测-还有其他方法吗?
  • 与C0相比,获得更多开明的覆盖率数据(如C1 or C2)似乎是语言不可知的任务。对我来说是些大的Karnaugh map操纵;在实际操作中是否有最佳做法?像fuzziness这样的更现代的逻辑技术是否起作用?
  • 测试覆盖率的一个被忽视的方面是将结果显示给程序员,这对于C1和C2数据变得越来越困难。坦白地说,尽管他们完成了C0的工作,但大多数测试覆盖界面让我不知所措;您看到了哪些新颖,直观的覆盖数据数据界面?
  • 最佳答案

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

    根据您提供的链接中的定义,从编写工具的人的角度来看,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进行采样是进行代码覆盖的一种特别糟糕的方法,因为您可能会错过某些语句,因为它们执行得太快了。通常,您希望代码覆盖率是确定性的。

    Karnaugh映射用于最小化 bool 函数,我看不到代码覆盖工具的任何有用链接。

    另外,您的问题有时并不十分清楚:您是要使用技术来实现更好的代码覆盖率,还是只是使您感兴趣的代码覆盖率工具的实现?

    10-07 19:11
    查看更多