代码之家  ›  专栏  ›  技术社区  ›  James Brady

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

  •  8
  • James Brady  · 技术社区  · 17 年前

    大多数已建立的语言都有可靠的测试覆盖工具可供使用,但不同语言的功能深度差异很大。

    • Python有 sys.settrace 直接告诉您正在执行哪些行
    • Clover
    • Emma (对于Java)有一个类加载器,可以动态地重新编写字节码
    • COVER (对于Lisp)具有用于插入代码的注释过程

    1. 到达目的地的主要途径是什么 C0 覆盖率,您可以在其中跟踪已执行的代码行?我在上面提到了本机VM内省以及静态和动态代码插装——还有其他方法吗?

    2. 获取更开明的覆盖率数据,如 C1 or C2 与C0相比,似乎是一项语言不可知的任务。有点大 Karnaugh map 操纵我;有没有关于如何真正做到这一点的最佳实践?更现代的逻辑技术,比如 fuzziness 扮演角色

    3 回复  |  直到 17 年前
        1
  •  5
  •   user51568    17 年前

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

    正如您提供的链接中所定义的,从编写仪器的人员的角度来看,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次,在另一个测试中至少执行了一次)。

    卡诺映射用于最小化布尔函数,我看不到与代码覆盖工具有任何有用的联系。

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

        2
  •  0
  •   Ira Baxter    16 年前

    使用程序转换系统。

    以下是一篇技术论文: http://www.semdesigns.com/Company/Publications/TestCoverage.pdf 说明了一般情况下如何执行此操作。

    我的公司Semantic Design提供了一整套测试覆盖率工具 提供上述所谓的C1覆盖(例如,“分支覆盖”) 所以是的 是 常用),适用于不同的语言 (C++,C+,C,java,COBOL,PHP,所有的多个) 方言)。 请参见www.semdesigns.com/Products/TestCoverage/index.html

        3
  •  -2
  •   Romain Verdier    17 年前

    .NET Profiling API ,它基本上在CLR本身中提供了一系列连接点。

    推荐文章