gpt4 book ai didi

unit-testing - 代码覆盖工具如何以不同的语言工作?

转载 作者:行者123 更新时间:2023-12-04 08:46:38 24 4
gpt4 key购买 nike

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

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

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

  • 我对不同语言的代码覆盖率的实现感兴趣:
  • 到达 C0 的主要途径是什么?覆盖率,您可以在哪里跟踪已执行的代码行?我在上面提到了 native VM 内省(introspection)以及静态和动态代码检测 - 还有其他方法吗?
  • 获取更开明的覆盖率数据,例如 C1 or C2 ,与 C0 相比,这似乎是一个与语言无关的任务。有点大Karnaugh map对我的操纵;是否有关于如何实际执行的最佳实践?做更多现代逻辑技术,如 fuzziness扮演一个角色?
  • 测试覆盖率的一个被忽视的方面是将结果显示给程序员,这对 C1 和 C2 数据变得越来越困难。坦率地说,虽然他们完成了 C0 的工作,但我对大多数测试覆盖率接口(interface)并不满意。你见过哪些新颖直观的覆盖数据界面?
  • 最佳答案

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

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

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

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

    关于unit-testing - 代码覆盖工具如何以不同的语言工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/455046/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com