软件测试--代码覆盖

关键词:软件测试, 代码覆盖,质量

测试环境:ubuntu 12.04

代码覆盖 CFG(Control flow graph)图。控制流图(CFG)是一个有向图抽象数据结构。它是一个过程或程序的抽象表现。每个在图形中的节点代表一个基本块,例如,没有任何跳跃或跳跃目标的直线代码块;跳跃目标以一个块开始,和以一个块结束。定向边缘被用于代表在控制流中的跳跃。CFG中的每个结点至多只能有两个直接后继。

插桩技术

在实现覆盖测试的过程中,往往需要知道某些信息,如:程序中可执行语句被执行(即被覆盖)的情况,程序执行的路径,变量的引用、定义等。要想获取这类信息,需要跟踪被测程序的执行过程,或者是由计算机在被测程序执行的过程中自动记录。需要在被测程序中插入完成相应工作的代码,即代码插桩技术。如今大多数的覆盖测试工具均采用代码插桩技术。

它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。根据探针插入的时间可以分为目标代码插桩和源代码插桩。

源代码插桩

源代码插桩是在对源文件进行完整的词法分析和语法分析的基础上进行的,这就保证对源文件的插桩能够达到很高的准确度和针对性。但是源代码插桩需要接触到源代码,而且随着编码语言和版本的不同需要做一定的修改。

目标代码插桩

例如gdb插入到目标机的stub代理,实现嵌入式的远程调试。目标操作系统提供支持远程调试协议的通信模块和多任务调试接口,并改写异常处理的有关部分。另外目标操作系统还需要定义一个设置断点的函数;因为有的硬件平台提供能产生特定调试陷阱异常(debug trap)的断点指令以支持调试(如X86的INT 3),而另一些机器没有类似的指令,就用任意一条不能被解释执行的非法(保留)指令代替。目标操作系统添加的这些模块统称为"插桩"。

GCOV工具

Gcov is GCC Coverage, 是一个测试代码覆盖率的工具, 是一个命令行方式的控制台程序。

testcov.c

#include <stdio.h>

int main(void)

{

         int i, total;

         total = 0;

         for(i=0; i<10; i++){

                   total += i;

         }

         if (total != 45){

                   printf("failure\n");

         } else {

                   printf("success\n");

         }

         return 0;

}

编译,并执行。

gcc -fprofile-arcs -ftest-coverage -o testcov testcov.c

./testcov

查看testcov程序代码覆盖情况

$ gcov testcov.c

File ‘testcov.c‘

Lines executed:87.50% of 8

testcov.c:creating ‘testcov.c.gcov‘
时间: 2024-10-10 10:25:37

软件测试--代码覆盖的相关文章

谁把我的代码覆盖了

1.谁把我的代码覆盖了 我们的开发有两个版本,Master.Develop,经常会两边的代码合并 我写的代码在Develop上,上线时线上出错了,上线的版本是Master的,上线前把Develop的合并到了Master,由于新功能开发的比较早,上线时都忘记要上传什么东西了. 访问的页面是http://www.***.com/shiphistory/shiphistory,然而页面中有两个Veiw,一个是 shiphistory.cshtml,一个是 newshiphistory.cshtml ,

Maven工程配置代码覆盖工具Jacoco

本篇博文我们将给出示例理解如何在Maven工程中配置Jacoco和如何使用Jacoco查看代码覆盖报告~ Jacoco是一个开源的Java代码覆盖率工具,Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序.很多第三方的工具提供了对Jacoco的集成,如sonar.Jenkins等. Maven工程 创建Maven工程 打开Eclipse,File->New->Project->Maven Projec

浅谈代码覆盖

在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%.于是乎,测试人员费尽心思设计案例覆盖代码.用代码覆盖率来衡量,有利也有有弊.本文我们就代码覆盖率展开讨论,也欢迎同学们踊跃评论. 首先,让我们先来了解一下所谓的"代码覆盖率".我找来了所谓的定义: 代码覆盖率 = 代码的覆盖程度,一种度量方式. 上面简短精悍的文字非常准确的描述了代码覆盖率的含义.而代码覆盖程度的度量方式是有很多种的,这里介绍一

JSCover+WebDriver/Selenium获得JS 代码覆盖

我们看JSCover(http://tntim96.github.io/JSCover/manual/manual.xml)介绍及使用说明的时候,往往被图形界面所吸引.这样的方式比較适合手工操作,点击和输入就可以. 可是这样的往往界面和真实界面相差比較大,由于真正的网页在JSCover内部的浏览载入框中.这使得原有的Selenium代码可能存在诸多问题. 那么怎样可以尽量少地改变原有的selenium代码而又获取到js的code coverage呢?这可以採用文件模式(File Mode). 1

强制使用远程库的代码覆盖本地的代码

如果你在idea拉取项目代码拉取失败,而且你也不需保存本地修改.或者说,你的本地并没有做任何的修改,你可以通过以下的做法来强制覆盖本地的代码 1.打开idea的termimal,可以进行git命令的输入 2.强制覆盖本地代码 git fetch --all git reset --hard origin/所在分支名 git pull 2.git fetch和git pull的区别 git fetch: 将远程代码更新到本地,用户检查后合并 git pull: 将远程代码更新到本地,自动合并. g

软件测试图覆盖

public static void printPrimes (int n) { int curPrime; int numPrimes; boolean isPrime; int [] primes = new int [MAXPRIMES]; primes [0] = 2; numPrimes = 1; curPrime = 2; while (numPrimes < n) { curPrime++; isPrime = true; for (int i = 0; i <= numPrim

关于代码覆盖 or 冲突

在使用git同步代码时,步骤一般为 commit -> pull -> push 那这个过程的意义何在呢? 首先是区分本地仓库 与 远程仓库,可以理解为本地git仓库和github仓库 commit操作可以让本地仓库确定项目的修改内容 pull可以对比本地仓库某分支与远程仓库某分支,在这个过程中可能会提示出现内容冲突的情况(远程仓库和本地仓库同时修改了代码),比如当本地README.md与远程README.md同时修改,出现如下error error: Your local changes t

《软件测试》总结

<软件测试>Ron Patton著. 这本书很全面地介绍了软件测试的理论基础知识,也就是看了这本书对软件测试有了一定的了解,帮助我找到了一份关于软件测试的工作.在看这本过程中也有一些有疑问的地方,这里主要是针对自学软件测试以来对软件测试的理解的一点总结,并把自己不懂的地方梳理一遍. 一.软件测试工程师究竟要做些什么? 这本书中给到一个相对完整的答案:软件测试员的目标就是尽可能早地找出软件缺陷,并确保其得以修复. 在面试过程中,面试官曾经告诉过我,并不是为了找bug,而是协助开发人员完善产品.有

软件测试中的那些不可遗忘的基础知识

软件测试是一项批判性的工作,目的就是找出软件中的缺陷.这里暂时不去深究为什么要进行软件测试,以及软件测试带来的好处.只介绍软件测试中一些基本的测试方法.根据是否查看代码程序分为黑盒测试和白盒测试:根据是否运行软件又可分为静态测试和动态测试. 黑盒测试:又叫功能测试或行为测试,只需考虑各个功能,不需要考虑整个软件的内部结构及代码. 白盒测试:访问代码,通过检查代码的线索来协助测试. 静态测试:测试软件不运行的部分,只是检查和审核. 动态测试:使用和运行软件进行测试. 1.静态黑盒测试:检查产品说明