一种轻量级的代码分支覆盖率检测方法与流程

文档序号:12363501阅读:656来源:国知局
一种轻量级的代码分支覆盖率检测方法与流程

本发明属于软件测试领域,具体是指一种轻量级的代码分支覆盖率检测方法。



背景技术:

白盒测试是软件测试的一种重要的测试方法,在白盒测试中,主要有以下几种代码覆盖率:语句覆盖、分支覆盖(也称判定覆盖)、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖。

在语句覆盖和分支覆盖中,我们关心的是每一条语句或者每一条分支是否被执行过,因此需要一种检测方法来解决这一情况。



技术实现要素:

本发明提供了一种轻量级的代码分支覆盖率检测方法,可以检测每一条语句或分支在测试中是否被执行过,完成在白盒测试中语句覆盖率和分支覆盖率的检测。

本发明提供的轻量级的代码分支覆盖率检测方法,实现步骤如下:

步骤1,输入被测试函数的代码,统计代码中的分支总数N,并对各分支进行编号0,1,…,N-1。

步骤2,在被测函数的入口插入代码,定义数组branch[N/K+1],并设置数组中的元素均为0。K表示机器字长。

步骤3,对于每个分支i,插入代码:branch[i/K]|=1<<(i%K)。i=0,1,…,N-1。

其中,branch是整型数组;|是按位或运算符,a|=b表示将变量a和b按位或运算后的结果赋值给变量a;<<是左移位运算符,c<<d的结果是将变量c对应的二进制位向左移动d位,右边空缺部分补0。

步骤4,在被测函数的出口插入代码,输出数组branch[N/K+1]的值。

步骤5,输入测试用例集合,执行测试代码,在测试完成后,统计数组branch[N/K+1]中所有元素对应的二进制位为1的个数n,获得代码分支覆盖率为n/N。

本发明的优点与积极效果在于:

(1)在本发明中,使用1个比特位即可记录1个分支的执行情况,数据量被大幅度的压缩,减少了内存资源的占用。

(2)在实际分支中需要插桩的代码非常简单,只需要将分支对应的比特位置1即可。在测试程序运行过程中,不进行数据输出工作,测试程序运行完毕后,再一次性输出记录结果,这样不仅可以大幅度提高测试的执行速度,而且可以大大减少测试的数据量,减少了后期数据给分析的工作量。

(3)由于在测试程序执行的过程中,并不产生数据的输出,所以对于同一个程序测试输出结果是固定的,不会随着测试程序的输入数据规模的扩大而变大。

附图说明

图1是本发明提供的代码分支覆盖率检测原理图;

图2是本发明的代码分支覆盖率检测方法整体流程图;

图3是采用本发明方法在求最大值算法中的实际执行流程图。

具体实施方式

下面将结合附图和实施例对本发明作进一步的详细说明。

本发明可以遵照所述原理由软件编码实现。其工作原理如图1所示。

图1中直角矩形表示测试过程中的数据,圆角矩形表示各种处理和操作。代码的覆盖率检测需要输入两种数据,分别是被测代码和测试所使用的用例集。设置有中间数据测试结果产生,经过最后的分析和计算,即可产生本次测试的分支覆盖率。

图1中①是对被测代码的初步处理,对被测代码进行静态分析,对每一个分支和跳转进行编号,编号从0开始,设记录的分支和跳转的总数为N。下面将分支和跳转统称为分支。

图1中②表示对被测代码的插桩操作,这是本发明的关键操作。本发明只使用1个比特位来记录每个分支的执行情况。比如以32位机器为例,即K=32,使用数组branch[N/32+1]即可完成所需要的记录,数组元素的类型是32位的整型。对于分支编号为i的分支,插入代码

branch[i/32]|=1<<(i%32),

branch是整型数组,每个元素可以记录32个分支的执行情况。这段代码意义就是找到分支对应的比特位,并对其进行置1操作,即将第i%32位置1。下面详细说明这段代码每一步的操作。

(1)i/32是做除法,并且结果保留整数,比如33/32的结果是1。

(2)|是按位或运算符,a|b的结果是将变量a和b的每一个二进制位进行对应位的或运算,比如3(二进制是00000011)和5(二进制是00000101),3|5的结果是7(二进制00000111)。a|=b等同于a=a|b。即将a|b的结果赋值给变量a。

(3)<<是左移位运算符,c<<d的结果是将变量c对应的二进制位向左移动d位,右边空缺部分补0。比如1<<2的结果是4,即将二进制00000001左移2位的结果是二进制00000100。这样上面的代码1<<(i%32)的意思是得到了标号为i的分支对应比特位的位置,比如i=33,1<<(i%32)得到的结果是2。其中的%表示模运算,即求余数。

例如,i=1时,1/32的值是0,对应的代码是branch[0]|=2,将branch数组下标为0的元素第2位置为1,2的二进制是00000010,右数第二位是1。当i=33时,33/32的值是1,对应的代码是branch[1]|=2,是将branch数组下标为1的元素的第2位置为1。对于32位机器,在用二进制表示时为32个比特位,上面是以8位二进制来举例说明的。

这样只要相应的分支执行过后,此分支对应的比特位就会被置1。最后,在函数的每个出口,插入代码,将本函数的branch数组的值全部输出,供下一步计算使用。

图1中③表示执行插桩后的被测代码,执行结束后,可以获得每个函数的branch数组的值。

图1中④表示对于branch数组的进一步计算。具体方法是统计数组branch的所有元素对应二进制位中1的个数n,最终可以得到代码的分支覆盖率BRC=n/N。

图2为本发明的轻量级的代码分支覆盖率检测方法的整体流程示意图,各步骤如下。

步骤1,输入被测试函数的代码,统计代码中的分支总数N,并对各分支进行编号0,1,…,N-1。

步骤2,在被测函数的入口插入代码,用于定义数组branch[N/32+1],并设置数组中的元素均为0。

步骤3,对于每个分支i,插入代码:branch[i/32]|=1<<(i%32)。i=0,1,…,N-1。

步骤4,在被测函数的出口插入代码,用于输出数组branch[N/32+1]的值。

步骤5,输入测试用例集合,执行测试代码,在测试完成后,统计数组branch[N/32+1]中比特位为1的个数n,获得代码分支覆盖率为n/N。

图3是以求最大值算法为例,展示了对代码插桩后的流程图。图中黑色的框图表示原被测代码的执行过程,带点虚线的框图表示根据本发明原理,插入的代码执行流程。因为本例中分支总数较少,为了表示方便,以branch变量代替了原理中的branch数组,基本原理是保持不变的。如图3所示,设置变量branch,初始值为0,在求最大值的过程中一共有4个分支,标号分别为0,1,2,3。当执行某个分支时,例如branch|=1<<1,则将变量branch的第1位置为1。

本发明方法先统计分支的个数,再设置相应的数组branch,然后使用数组branch中的每个元素的比特位来记录分支的执行情况,理论上使用了最少的变量,对于像在开发板或者单片机等内存资源稀缺的环境中,这样做是意义重大的。而且,在每次分支执行的时候,只要对相应的比特位进行置位操作就可以,没有信息的输出。因为计算操作比输出操作要快得多,这样不仅大大加快了执行速度,而且对于输出信息的统计计算也非常简单。相对于直观的统计方法,本发明降低了内存的使用量,同时避免了频繁的输出操作,如果使用在分支中输出信息,将会大大增加程序的运行速度,而且对于输出信息的计算统计也比较本发明的方法复杂。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1