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  =
   167   168   169   170   171   172   173   174   175   176   177