您的位置:首页 > 其它

软件测试实验学习笔记系列5-单元覆盖测试

2013-08-02 20:11 661 查看

单元覆盖测试

覆盖测试是衡量软件质量的一个重要的指标,是一种”白合”测试方法,覆盖的标准有逻辑覆盖,循环覆盖,基本路径覆盖。其中逻辑测试包括语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,条件组合覆盖和路径覆盖。
覆盖测试必须拥有程序的规格说明书和程序清单,以程序的内部结构为清单设计测试用例。覆盖测试主要使用在具有高可靠性要求的软件领域(军工企业,航空航天软件,工业控制软件).覆盖测试需要借助一定的工具软件,工具软件具有的功能特点:

分析软件内部接口,帮助定制覆盖策略及设计测试用例

与适当的编译器结合,对被测软件实施自动插桩,以便在其运行过程中生成覆盖信息并收集这些覆盖信息

根据收集的覆盖信息计算覆盖率(Coverage),帮助测试人员找到未被覆盖的软件部分,以改进测试用例,提高覆盖率

对主流开发语言的支持,因为对不同的开发语言来说,测试工具的实现的方式和内容差别是较大的。目前测试工具主要支持的开发语言是:标准C,C++,Visual
C++,Java等,

进行动态覆盖测试的三项任务:1.设计测试用例;2.对被测代码进行插桩;3.收集覆盖信息并进行分析。

2.1覆盖测试工具介绍

xUnit基本不支持覆盖测试(白盒测试中重要的内容)。覆盖测试工具实现的技术方式和具体的语言是紧耦合的。不同语言使用的覆盖测试的策略是不一样的。实例如下:

Java(EclEmma+JUnit,JCoverage)
NET(NCover+NUnit)
CppUnit框架很难提供覆盖测试的功能,c/c++测试覆盖测试是通过插桩实现的.C/C++覆盖测试工具:gcov



2.2JUnit下的覆盖工具EclEmma

时至今日,IT人士更加关注测试的重要性。 测试驱动开发(TDD)被证明是一种能有效提高软件质量的方法,测试优先原则,EclEmma2006年入围Eclipse
Community Awards Winners 决赛

2.2.1 EclEmma

Emma是Sourceforge上的开源项目,某种程度上,EclEmma是Emma的图形开发工具。
Eclipse,OpenJDK,JUnit,Ant,CVS或者Subversion,Emma
-- java开发成套开源的解决方案。
Emma的同类产品:Coverlipse,Cobertura,Quilt,JCoverage.
EclEmma的特点:快速的开发和测试周期,非常丰富覆盖信息分析以及非入侵方式。
EclEmma:一个封装Emma覆盖工具的Eclipse的插件。Eclemma的官方地址:http://sourceforge.net/projects/eclemma
EclEmma使用不同颜色标识的源代码测试的情况,绿色-完整执行,红色-根本没有执行,黄色-部分被执行,其视图能够分层显示代码的覆盖测试率。

2.2.2 EclEmma安装

EclEmma的安装是就是Eclipse插件的安装,共有这样三种方式安装.

1.Eclipse自身的Software Update机制.

选中菜单栏中Help/Install New Softeware,在如下图中对话框中填入插件的站点的信息。



本人是在Ubuntu12.04下使用eclipse的,如果是在windows下的话,具体操作可以参考[2]
缺点是:当安装了许多插件之后,eclipse的plugins中会充满各种旧的或废弃的插件,不便于更新和管理

2.蛮力法安装

将插件的压缩包解压,然后将其中的plugins和features与eclipse安装包中的同名文件夹合并,这样就可以在Eclipse中使用新插件。实际上第一个方法自动安装也是使用的这种方法,只不过由机器自动改成了手动。缺点同上。

3. links文件

首先从eclemma官方站点下载最新的eclemmaEclipse插件包:http://sourceforge.net/projects/eclemma/files/?source=navbar
在eclipse安装的目录下新建一个links文件夹,将相应的插件(例如eclemma-2.2.0)包拷贝到links文件夹下,并在links下新建一个eclemma.link空白的文本,在起中写入:path=/usr/lib/eclipse/links/eclemma-2.2.0 。注意path=xxx是eclemma在系统中的绝对路径, 由于我使用的Linux系统,在windows下可能是D:\xxx\eclipse\links\eclemma-2.2.0。
重新启动一下eclipse就可以看到eclemma被安装上的标志,最左边的就是Eclemma的图标。



备注: 上面的步骤在windows上已经算是安装完成了,但是在Ubuntu下好像不太行,至少我自己的实践表明是这样的,Ubuntu下还要在加上两步:

进入eclemma-2.2.0文件夹中,在其中建立一个eclipse文件夹并将eclemma目录下其他的文件移到 eclipse目录下
进入eclipse目录,在其中建立一个空的.eclipseextension的隐藏文件(注意"."不可少),并为这个文件加上执行权限。具体的命令如下:

cd /usr/lib/eclipse/links/eclemma-2.2.0/
sudo mkdir eclipse
sudo mv * eclipse/
cd eclipse/
vi .eclipseextension
chmod +x .eclipseextension
注意命令中是否需要使用sudo提升权限视情况而定, 如果不是类似 /usr/lib这样的只有root权限才可以操作的目录的话,就不需要使用sudo。

2.2.3 EclEmma的使用

关于Eclemma的使用,网上一堆,不再赘述,推荐一篇文章:

使用Eclemma进行覆盖测试:http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/

2.3 C++的覆盖测试工具gcov

gcov是GNU/GCC的工具组件,可以C/C++代码覆盖率的测试工具,使用便捷,不要配置,不是可视界面,只支持CLI命令行界面.如果要使用可视界面,使用Ggcov。

2.3.1 gcov环境

gcov是gcc的内部工作组件。利用gcc内部的工具进行代码插桩。

2.3.2gcov测试功能及使用流程

grov的基本功能:可以查看测试时代码执行的覆盖率信息,支持函数覆盖,语句覆盖和分支覆盖等覆盖测试内容,帮助我们分析测试程序中的缺陷。使用该工具还可以查看程序在某个分析执行的频率,进而分析程序的性能。
Gcc的覆盖测试工具gcov,gcov必须和gcc编译器联合使用(需要在程序中插桩,参考百度百科程序插桩的解释)。使用步骤:

在编译时加上”-ftest-coverage-fprofile-arcs”,a.out(设置了-o选项就是输出的文件名)和.gcda文件;
执行./a.out时,根据源程序的语句,条件,路径,边界等因素,以及设计好的输入测试用例数据
,执行的信息保存到.gcno和.gcda文件中-->gcov-b
xxx.c-->xxx.c.gcov(里面显示了每条语句执行的次数,没有执行的语法则以“####”标注)

注意:使用gcov时,每次重新编译,统计数据都会清空,所以项目测试必须在确定的版本上进行。

gcov的其他的选项命令可以查看gcov的在线文档(man gcov)

/*Program: testgcov.c -- interpert the workflow of gcov */
#include<stdio.h>
int main(){
printf("Hello,World\n");
}


编译执行:gcc-o testgcov -ftest-coverage
-fprofile-arcs testgcov.c
./testgcov--->执行程序,各种执行语句将会被写到testgcov.gcda和testgcov.gcno中

gcov-b testgcov.c --->testgcov.c.gcov详细的覆盖信息
testgcov.c.gcov 详细信息:
-: 0:Source:testgcov.c
-: 0:Graph:testgcov.gcno
-: 0:Data:testgcov.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:/*Program: testgcov.c -- interpert the workflow of gcov */
-: 2:#include<stdio.h>
1: 3:int main(){
1: 4: printf("Hello,World\n");
1: 5:}
注:gcov -b查看分支执行的频率,-f查看每个函数执行的情况。

2.3.3 gcov覆盖测试应用举例

/*Program:autosell.c -- design the input test case and get the code coverage of program */
#include<stdio.h>
void welcome();
void nochange(int num5coins);
void getcoin(int *coin);
void pushbutton(int *button);
void process(int* coin,int* button,int* num5coins);
int main(){
int coin=0,button=0,num5coins=2;
int i;
for(i=0;i<10;++i){
welcome();
nochange(num5coins);
getcoin(&coin);
pushbutton(&button);
process(&coin,&button,&num5coins);
}
return 0;
}
void welcome(){
system("clear");//library function,which
printf("welcome to this auto selling machine!\n\n");
}
void nochange(int num5coins){
if(num5coins == 0)
printf("No change now!\n");
}
void getcoin(int* coin){
int flagredo;
do{
printf("Please pitch your coin(5-5角,10-1元):");
scanf("%d",coin);
if(*coin!=5 && *coin!=10){
printf("Wrong coin!Return this coin.\n");
flagredo=1;
} else
flagredo=0;
}while(flagredo);
}
void pushbutton(int *button){
int flagredo;
do{
printf("Please select your drink(1-orange juice,2-beer):");
scanf("%d",button);
if(*button!=1 && *button!=2){
printf("Wrong input,Please re-select.\n");
flagredo=1;
} else
flagredo=0;
} while(flagredo);
}
void process(int* coin,int* button,int* num5coins){
if(*coin == 10 && *num5coins ==0){
printf("No change!\n");
printf("Return 1 yuan coin.\n");
} else {
if(*coin == 10){
if(*button ==1)
printf("Please take your orange juice.\n");
else
printf("Please take you beer\n");
(*num5coins)--;
printf("Return 5 jiao coin.\n");
}
if(*coin == 5){
if(*button ==1)
printf("Please take your orange juice.\n");
else
printf("Please take you beer\n");
(*num5coins)++;
}
}
printf("\nPress Enter to continue");
getchar();getchar();

*coin =0;
*button=0;
}


编译命令:gcc-o autosell -fprofile-arcs -ftest-coverage autosell.c
执行程序(./autosell)随便输入一些测试用例:
测试结果:
显示总体覆盖率:gcov autosell.c
File'autosell.c'
Linesexecuted:94.55% of 55
Creating'autosell.c.gcov'
显示函数覆盖信息:gcov-f autosell.c
Function'process'
Linesexecuted:90.00% of 20
Function'pushbutton'
Linesexecuted:100.00% of 9

Function'getcoin'
Linesexecuted:100.00% of 9
Function'nochange'
Linesexecuted:75.00% of 4

Function'welcome'
Linesexecuted:100.00% of 4

Function'main'
Linesexecuted:100.00% of 9

File'autosell.c'
Linesexecuted:94.55% of 55
Creating'autosell.c.gcov'

显示分支信息:gcov-b autosell.c
File'autosell.c'
Linesexecuted:94.55% of 55
Branchesexecuted:100.00% of 28
Takenat least once:92.86% of 28
Callsexecuted:87.50% of 24
Creating'autosell.c.gcov'
具体的autosell.c.gcov信息自行查看

参考资料

[1]软件测试实验指导教程/蔡建平,
清华大学出版社, 2009.11

[2]软件测试学习:测试覆盖率工具EclEmma安装与使用:/article/4386314.html
[3]使用Eclemma进行覆盖测试:http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: