Page 172 - 《软件学报》2026年第5期
P. 172
钱忠胜 等: 面向两阶段分组的测试用例优先级排序方法 2051
29. else
30. Reset SC, TC, S cov ; // 重置 SC、TC、S co 表
v
31. end if
32. end for
33. else
34. g count = g count – 1;
35. end if
36. end if
37. end while
38. Output P';
/* 更新分区子函数 UpdateG */
39. Method UpdateG(G)
40. for t count in TC // 遍历用例-语句数表 TC
41. if G.containsKey(t count ) // 分区集 G 中存在语句覆盖值键
42. Add (t i , t count ) to G[t count ]; // 将用例加入分区覆盖语句数为 t coun 的子分区
t
43. else // G 中不存在语句覆盖值键
44. G.put(t count , [(t i , t count )]); // 新建分区覆盖语句数为 t coun 的子分区
t
45. end if
46. end for
End
在算法 2 中, 第 1, 2 行是初始化操作. 第 3 行将当前分区覆盖语句数的初始值设为语句标记表 S co 的长度.
v
第 4 行是子函数 UpdateG(), 用于新建分区 G 并将测试用例加入子分区. 第 5–37 行对部分关键用例进行优先级排
序. 每轮迭代均尝试找到与当前检索分区覆盖语句数相同的测试用例, 并将其添加到主用例序列 P'中. 其中, 第
6–15 行按分区覆盖语句数从大到小选择子分区. 若当前搜索用例的覆盖语句数与分区覆盖语句数不相等, 则对分
区进行更新; 若相等, 则将子分区中的所有用例添加到待排分区集 WG 中. 第 18–24 行选择待排分区集 WG 中具
有最大潜力度的用例加入主用例序列 P', 并将此用例从分区 G 中删除. 第 25–32 行检查是否存在语句未被 P'中的
用例覆盖. 若仍存在语句未被覆盖, 则根据 P'中的用例更新 SC、TC、S cov 、T co 表; 若所有语句均已被覆盖, 则重
v
置 SC、TC、S co 表. 在第 34 行, 若待排分区集 WG 无测试用例可选择, 则检索下一个分区. 第 38 行输出主用例序
v
列 P'. 值得注意的是, 虽然用例潜力度被作为二次排序的指标, 但也有可能出现两个用例潜力度相等的情况, 在这
种情况下, 与 Additional 策略类似, 我们的方法随机选择某一测试用例.
2.3 测试用例优先级排序过程
已有工作 [8] 表明, 少数测试用例的顺序变化才会对故障百分比指标产生较大影响, 这些用例更具有代表性且
更能暴露问题. 基于此, 首先, 我们采用基于多种指标排序的 TP-Additional 策略对第 2.2 节中能更快暴露问题的用
例组进行排序, 得到主用例序列 P' = < t 1 ,t 2 ,...,t n >. 然后, 针对普通用例 (见第 2.1 节) 与经过多轮迭代未被选择的
测试用例 (见第 2.2 节) 随机合并后的大多数用例, 使用更加简单高效的 Total 策略进行排序, 即按照用例的语句覆
盖数大小排序, 得到次用例序列 P'' = < t ,t ,...,t >. 最后, 我们将主用例序列 P'与次用例序列 P''进行线性拼接得
′
′
′
1 2 n
到 P temp = P' ⊕ P'', 即< t 1 ,t 2 ,...,t n ,t ,t ,...,t >.
′
′
′
n
1
2
例 4: 以表 2、例 1 的普通用例组, 以及例 3 的分组结果为例. 普通用例组 N = [t 6 , t 7 ], t 1 、t 2 与 t 3 已通过 TP-
Additional 策略完成排序, 得到主用例序列 P' = <t 2 , t 3 , t 1 >, 剩余用例组为 [t 4 , t 5 , t 8 ]. 将普通用例组 N 与剩余用例组
的用例随机合并得到待排集{t 4 , t 5 , t 6 , t 7 , t 8 }, 它们的语句覆盖数分别为 3、3、3、4、4. 按照语句覆盖数大小对其
排序 (若覆盖数相等, 则随机选择), 可得到次用例序列 P'' = <t 8 , t 7 , t 5 , t 4 , t 6 >. 将 P'与 P''进行线性拼接得到 P temp =

