当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《代码覆盖工具如何在不同语言中工作?》经验,为你挑选了1个好方法。

大多数已建立的语言都有可用的可靠测试覆盖工具,但功能深度各不相同.

此外,所有各种VM和编译器都具有这样的异构结构,例如,编写代码覆盖工具必须是C中与Lisp完全不同的工作.

Python必须sys.settrace直接告诉你哪些行正在执行

Clover(for Java)使用自己的编译器并添加调试元数据(无论如何我上次使用它)

Emma(for Java)有一个ClassLoader,它可以动态重写字节码

COVER(用于Lisp)有一个注释传递来检测代码

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

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

    与C0相比,获得更加开明的覆盖数据(如C1或C2)似乎是一种与语言无关的任务.对我来说是大卡诺的地图操纵吗?有关于如何实际操作的最佳实践吗?像模糊这样的现代逻辑技术会起作用吗?

    测试覆盖范围的一个被忽视的方面是将结果显示给程序员,这对C1和C2数据越来越难.坦率地说,虽然他们完成了C0的工作,但我对大多数测试覆盖接口都不感兴趣; 您在覆盖数据中看到了哪些新颖直观的界面?

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

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

此外,您的问题有时并不十分明确:您是否希望技术能够实现更好的代码覆盖率,还是仅仅是您感兴趣的代码覆盖率工具的实现?



1> user51568..:

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

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

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

此外,您的问题有时并不十分明确:您是否希望技术能够实现更好的代码覆盖率,还是仅仅是您感兴趣的代码覆盖率工具的实现?

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有