5.1.6 实例分析
本节以图5-7中的程序为例,说明应用启发式引导的k+1循环处理模型对循环内目标自动生成测试用例的过程。被测程序中包含4个循环结构,第8行的语句target被指定为待覆盖的目标语句。

图5-7 包含循环结构的程序
首先,预处理步骤通过扫描程序结构,将L2标记为L target。目标节点的主宰节点集合为St:{1,3,4,7},相应的节点距离集合为d t(St):{4,3,2,1}。(https://www.daowen.com)
由程序入口开始进行符号执行,当访问到L1的入口节点时,收集到的路径中不包含目标,因此L1是L before,利用动态执行获得L1的路径。调用约束求解器,获得满足当前L1的前置路径条件的3个测试用例,假设此时生成的测试用例为TC_1、TC_2、TC_3,测试用例的具体值和相应的执行轨迹如下所示。

测试用例的具体值使用一个整数集和一个整数组成,分别表示输入的数组参数a[]和整型变量n。路径以语句序号的序列表示,超过循环L2的部分被省略以节省篇幅。路径中以下划线标记同一个循环内的部分。这3条路径中,主宰节点以粗体重点表示,根据算法5-1,Path_1和Path_2中包含语句3,因此可以在节点距离集合d t(St)中查到相应的路径距离为3;Path_3包含语句4,因此路径距离为2。更小的路径距离意味着Path_3相比于Path_1和Path_2更接近目标,因此Path_3具有更高的优先级,将Path_3中通过L1的路径1,2,1,2,1,2,1截取出来进行后续的路径搜索。
L2在预处理阶段被标记为L target,因此利用符号执行L2搜索可达路径。目标语句在“a[0]%3==0”取真的分支上,此条件在L2的第一次展开过程中无法成立,在L2展开两次之后,能够得到一条到达目标的部分路径,其约束条件是(n>2)∧(n≤3)∧(max%2≠0)∧(a[0]%3=0),假设利用约束求解器得到一个满足约束的测试用例({-4,6,7,…},3),此用例的实际执行路径为覆盖目标的完整可达路径。