3.2.4 实例分析
我们通过几个例子分别详细解释前面已经介绍过的技术。
1.实例1
实例1以图3-2中的粗体部分Path3作为输入生成测试用例。这条路径的IVR过程已经在表3-2中标识过了,可以看出3个变量都是这条路径的相关变量。为了简便起见,将它们的输入区间都定为[-2,2],大小为5。在初始化阶段,区间运算将它们的区间缩减至x 1:[-1,2]、x 2:[-2,1]和x 3:[-1,2]。在按照图3-11所示的方式进行分解之后,PTC按照表3-3所示计算每个变量的路径性质。DVO按照表3-4所示计算第一个要赋值的变量,其结果在最后一列,选出的元素(x 2)被加粗表示。接下来需要从[-2,1]中为x 2选择一个初始值。IDC通过检索路径性质表得到x 2为negative,这意味着适合为x 2选择一个较小的值,之后选出-1。

图3-11 程序test1及其分支函数分解之后的形式
表3-3 x 1、x 2和x 3的路径性质计算过程

表3-4 x 1、x 2和x 3的排序过程

IIC对各个变量的区间进行运算,即x 1:[-1,2]、x 2:[-1,-1]和x 3:[-1,2]。区间运算成功,并将x 1和x 3的区间分别缩减至[0,2]和[0,2]。DVO按照表3-5所示选出下一个待赋值变量,如x 1,用加粗所示。
表3-5 x 1和x 3的排序过程

IDC通过对变量路径性质表的检索得到x 1的路径变量性质为positive,于是从[-1,2]中选择1。IIC对x 1:[1,1]、x 2:[-1,-1]、x 3:[0,2]进行计算。IIC成功,接下来按照相同的方式为x 3选择1。最后,IIC计算出{x 1↦1,x 2↦-1,x 3↦1}无矛盾,是适合Path3的测试用例。再无变量需要排序,BFS-BB求解出一个成功的测试用例{x 1↦1,x 2↦-1,x 3↦1}。表3-6所示是在搜索过程中各个变量区间的变化情况,其中发生变化的区间加粗显示。第四列的区间变化是由于初始区间计算IDC,而第五列的区间变化则是由于区间运算IIC。生成测试用例{x 1↦1,x 2↦-1,x 3↦1}的过程可以表示为图3-12所示的搜索树的形式。图中解路径用加粗箭头所示。可以看出这是一个无回溯的搜索,而这类搜索占据了BFS-BB所执行搜索的大部分。在状态空间搜索阶段对每个变量都进行了一次区间运算,也就是说,每个变量的初始值都成为最终测试用例的一部分,从而为每个变量所进行的爬山过程都是一次到达山顶。
表3-6 搜索过程中变量区间的变化情况

(https://www.daowen.com)
图3-12 BFS-BB为Path3生成测试用例的搜索树
2.实例2
为了更好地说明爬山法求解等式的效果,我们使用图3-13所示的例子来说明其执行过程。图中的例子test2有两个输入变量x 4和x 5,采用语句覆盖,有一条待覆盖路径Path1:0→1→2→3→4→5→6,即经过两个if语句的真分支到达最后的打印语句stmt_3。因为经过了两个真分支T_1和T_2,所以分支条件和相应的分支谓词是一样的,其实际效果相当于解方程组,即只有唯一的一组测试用例{x 4↦60,x 5↦40}满足这两个约束。这对于两个变量的被测程序是很强的约束。将x 4的初始区间设为[70,70],将x 5的初始区间设定为[0,100],如图3-14所示。

图3-13 被测程序test2和对应的控制流图

图3-14 为x 4赋值70的判断过程
由于在第二个分支检测出了矛盾,根据目标函数返回值
)(x 4)=20>0,我们将x 4的区间削减至[70-20(50),70-1(69)],这个区间要远小于[0,100]。所以尽管为x 4选择70并不合适,但它为下一步的赋值指引了方向。假如从[50,69]中为x 4选取了55进行赋值,当前状态转变为S cur=(null,x 4,[50,69],70,active),那么就有图3-15所示的判断过程。由于在第四个分支检测出了矛盾,根据目标函数返回值
(x 4)=-10<0,我们将x 4的区间削减至[55+1(56),55+10(65)],这个区间要远小于[50,69]。尽管为x 4选择55并不合适,但它为下一步的赋值指引了方向。假如从[56,65]中为x 4选取了60进行赋值,当前状态转变为S cur=(null,x 4,[56,65],60,active),那么就有图3-16所示的判断过程。

图3-15 为x 4赋值55的判断过程

图3-16 为x 4赋值60的判断过程
F(60)=
)(x 4)=0意味着60是对应于x 4的山顶。此次爬山的计算过程如表3-7所示。可见在满足第一个分支x 4+x 5=100的条件后两个变量的区间都得到了化简,化简后的区间为D 2={x 4:[60,60];x 5:[40,40]},进入第二个分支条件x 4-x 5=20后,仍然可以让其得到满足,且计算出D 3={x 4:[60,60];x 5:[40,40]},说明x 4取60满足路径上的所有约束,进而这个状态的类型转变为extensive,可以进行搜索算法的下一步,并且由于只有一个值40可以供x 5选取,在为x 5赋值40后,就得到了测试用例{x 4↦60,x 5↦40}。
表3-7 使用爬山法为x 4赋值的过程
