Page 189 - 《软件学报》2021年第7期
P. 189
周小莉 等:基于偶然正确性概率的回归测试选择方法 2107
句被执行到,则 PR(E)=1,否则,PR(E)=0.PR(I|E)表示在“执行”被满足的情况下“感染”发生的概率,也就是错误语
句被执行时产生错误的中间状态的概率.这个概率可以通过统计实验或者根据经验而设定.PR(P|EI)表示在满
足“执行”和“感染”两个条件的情况下满足“传播”条件的概率,即当错误语句被执行并产生了错误的中间结果
时,这个错误的状态被传播到输出的概率.通过对实际场景的观测,我们发现错误的中间结果通过下面两种途径
将这种错误的中间状态传递到其他语句的执行实例,并最终影响程序输出值的正确性.
(1) 参与运算
当错误的中间结果被计算性使用时,例如被用于赋值语句表达式、输出语句、当作函数调用的参数或被用
于索引表达式中,此时可能会导致运算结果出错.对于包含运算的语句,其结果的正确性和操作数的正确性有很
大关系.在操作数都正确的情况下,运算结果也一定是正确的;如果至少一个操作数是错误的,运算结果也很可
能是错误的.对于不同的运算,操作数对运算结果正确性的影响程度也不同.对不同类型的运算,通过为每个操
作数都设定不同的影响因子来量化该操作数对运算结果正确性的影响程度,从而可以根据操作数的取值及其
正确性概率来估算运算结果的正确性概率.
(2) 影响控制流
当错误的中间结果被判定性使用时,即被用于分支语句的条件表达式时,会导致程序的执行路径出错,被实
际执行的路径上和应该被执行的路径上的语句所改变的变量值的正确性都受到了影响.对于一条语句实例 s,
为了估算控制流对其结果的正确性概率的影响,我们首先找到影响其执行的所有控制表达式的执行实例,然后
根据这些表达式的正确性概率修正 s 的结果的正确性概率.
通过对 PR(E)、PR(I|E)和 PR(P|EI)的估计,可以估算出语句 s 中所包含的错误被发现的概率,同样可以估
算偶然正确性现象发生的概率.假设 s 包含错误,而该错误在执行 t 时因偶然正确性现象被掩盖的概率为
CCP(s,t)=PR(E)(1–PR(I|E)PR(P|EI)) (2)
这个概率是满足“执行”条件,却没有满足“传播”条件的概率.发生偶然正确性现象,首先需要满足“执行”
条件.在执行条件满足的情况下,如果同时满足“感染”和“传播”,那么错误会被发现,否则,错误会被隐藏.此时,
偶然正确性概率的估算是针对一个测试用例和程序中一条语句的,可以比较精细地分析出偶然正确性现象
的发生情况.
3 基于偶然正确性概率的回归测试选择技术
以往回归测试选择相关工作的重点集中在如何根据代码修改找出与代码修改相关的用例,并将这些用例
作为回归测试用例.然而,不是每个覆盖了被修改代码的用例都能够检测出故障.即使覆盖了被修改代码,也可
能因偶然正确性现象而无法发现故障.
即使测试用例集合对被修改的代码覆盖过很多次,如果这些用例发生偶然正确性现象的概率高,则被修改
代码中的错误仍很可能会被掩盖.因此,需要对覆盖修改的用例作进一步的分析,以提高测试选择的准确性.本
文提出的回归测试选择方法考虑了偶然正确性现象的影响,将回归测试用例集合因发生偶然正确性现象而导
致错误未被发现的可能性控制在一定程度内.
如果一个测试用例对所有被修改语句所估算的偶然正确性概率都高,这个用例很可能发生偶然正确性现
象.如果一个测试用例针对至少一条被修改语句的偶然正确性概率非常低,那么该用例很可能是故障检测用例.
因此,本文根据估算得到的偶然正确性概率,来评判覆盖修改代码用例中哪些用例更可能检测到修改代码中的
故障,将这些更可能检测故障的用例加入到回归测试集合中.
图 2 展示了基于偶然正确性概率进行回归测试选择的工作流程,其中,P 和 P分别表示修改前后的程序,T
和 T分别表示原始测试集合和回归测试集合.在对原始程序 P 进行测试时,获取 P 执行 T 中各个测试用例时发
生偶然正确性的概率.当代码进行修改后,通过代码修改分析,根据 P 在 T 上的偶然正确性概率估计被修改后的
程序 P在执行 T 中各测试用例时发生偶然正确性现象的概率.最后,基于被修改后代码的偶然正确性现象的发
生概率,选择出测试集合 T作为回归测试集合.