Page 190 - 《软件学报》2021年第7期
P. 190
2108 Journal of Software 软件学报 Vol.32, No.7, July 2021
Fig.2 The process of CCP-based regression selection
图 2 基于 CCP 的回归测试选择的工作流程
本文提出的测试选择方法主要包含两部分工作,首先根据原始测试集合在原始版本程序上的偶然正确性
现象的发生情况,来估计该测试集合在修改后代码上的偶然正确性现象的发生概率.然后,基于被修改代码执行
时发生偶然正确性现象的概率来指导测试选择,将发生偶然正确性现象的概率控制在一定程度内.根据对测试
用例缩减和其故障检测能力之间不同程度的折中,我们分别在基于代码覆盖的最小化和安全的选择技术基础
上,给出两种利用偶然正确性概率指导测试用例选择的策略.
3.1 被修改后程序的偶然正确性概率的估算
为了能够为 P选择适当的测试用例,需要得到 P在执行这些测试用例时发生偶然正确性现象的概率,这个
概率是通过原始程序 P 执行各测试用例时的偶然正确性概率来进行估算得到的近似值.
假设程序 P 中的语句 s 被修改为 s,这里用 CCP(P,s,t)表示在 s 包含错误的情况下 P 在执行测试用例 t 时
发生偶然正确性的概率,CCP(P,s,t)表示在 s包含错误的情况下 P在执行测试 t 时发生偶然正确性现象的概率.
在行回归测试用例选择时,CCP(P,s,t)只能通过之前测试 P 时获得的偶然正确性信息来估算得到一些近似值.
如果 s 和 s都是运算语句,且其中间结果被存放到同一个内存地址中,那么 P执行时语句 s产生的中间结果和 P
执行时 s 产生的中间结果被传播到输出的过程很可能是类似的,因此,本文将 CCP(P,s,t)作为 CCP(P,s,t)的一个
近似值使用.另外,还有两种特殊情况需要进行处理.
(1) 语句 s 和 s都是运算语句,但是它们写入的内存有所不同.
例如,P 中的语句“x=a+b”在 P′中被修改为“y=a–b”.比较 P 和 P'运行测试用例 t 的过程,P 执行语句 s 时会把
某个值存放到 x 中,而 P'相应地执行 s时没有对 x 进行赋值、但对 y 进行了赋值.也就是说,与 P 执行时相比,P
执行时变量 x 和 y 中存放的值都发生了改变.本文的估算方法是对源程序进行静态分析,如果 s 所在的基本块内
可以找到 s 之前的另一语句 s1,其写入的内存位置与 s相同,那么,P运行时 y 中值被传播到输出的过程和 P 运
行时把 s 运算得到的中间结果传播到输出的过程是类似的,同时,P 和 P运行时在 y 中存放的值是不同的,也就
是说,对 s 的修改也影响了 y 中存放的值.如果这个影响被传播到了输出,测试人员可在某种程度上判断对 s 的修
改是否正确.因此,本文将 1–(1–CCP(P,s,t))(1–CCP(P,s1,t))作为 CCP(P,s,t)的估算值.如果同一基本块中存在
多条语句与 s写入的内存位置相同,则选择距 s 最近的一条语句进行估算.如果找不到满足条件的语句 s1,此时
就将 CCP(P,s,t)作为 CCP(P,s,t)的估算值.
(2) 语句 s 为控制语句.
此时将 CCP(P,s,t)直接作为 CCP(P,s,t)的估计值.虽然这种估算不是特别精细,但 CCP(P,s,t)和 CCP(P,s,t)
仍然存在一定的相关性.
程序被修改后,在执行同一个测试用例时,其执行路径和运行时的动态数据流关系都会发生变化.因此,
上述方法只是较粗略地估算出测试用例在新版本程序上运行时发生偶然正确性现象的概率,但是这些估算
结果仍然能够在一定程度上反映各测试用例对修改后语句的测试有效性,本文的实验结果也表明这种估算
是有效的.