Page 171 - 《软件学报》2026年第5期
P. 171

2050                                                       软件学报  2026  年第  37  卷第  5  期


                 中, 将  t 2 、t 3 、t 1 视为能更快暴露问题的用例组, 剩余   t 4 、t 5 、t 8 成为一组.
                    根据迭代次数将关键用例进行分组的原因是, 经过多轮迭代后, 所有可能语句都已被覆盖了足够的次数. 若持
                 续迭代, 被覆盖的语句再暴露问题的可能性就会降低. 一方面, 若多轮迭代后所有故障均被发现, 则剩余迭代对于
                 故障检测而言只会增加时间成本; 另一方面, 若经过多轮迭代后仍存在部分故障, 则它们较难被发现, 故剩余迭代
                 只是偶然地、个别地揭示错误.
                    因此, 在已达到足够迭代次数的情况下, 将关键用例针对性地分为能更快地暴露问题的用例组和剩余关键用
                 例组, 并利用多种排序策略以应对不同复杂程度的排序场景, 即对不同分组使用不同策略进行排序. 分组排序使排
                 序过程更加灵活和高效, 有助于保证有效性的同时提高方法效率. 细粒度分组排序的一次迭代过程见算法                                 2.
                 算法  2. 基于  TP-Additional 策略的细粒度分组排序.

                 输入: 关键用例集     K, 关键用例覆盖语句集      S k ;
                 输出: 主用例序列     P'.
                 Begin
                 1. 根据算法  1  得到的  S k 初始化  TC、SC、S cov 、T cov ;
                 2. P' ←  ∅, G ←  ∅, WG ←  ∅; // 初始化主用例序列  P'、分区集  G、待排分区集   WG
                 3. g count  = |S cov |; // 当前分区覆盖语句数初始为语句标记表  S co 的长度
                                                               v
                 4. UpdateG(G); // 更新分区
                 5. while G.size > 0
                 6.  for each (t i , t count ) in G
                 7.   if t count  = g count  then // 当前分区覆盖语句值与搜索用例覆盖语句值相等
                 8.    temp = TC[i]; // 从用例-语句数表  TC  读取当前搜索用例的覆盖语句值
                 9.    if temp  , g count  then // 当前搜索用例的覆盖语句值与分区覆盖语句不相等
                 10.     UpdateG(G); // 更新分区
                 11.     else
                 12.     WG ← WG∪{(t i , t count )}; // 将当前搜索用例及覆盖语句值加入待排分区
                 13.     end if
                 14.    end if
                 15.   end for
                 16. if g count  > 0 then
                 17.  if WG.size > 0 then
                 18.   for each (t i , t count ) in WG
                                 1
                 19.    tp i  =      ; // 计算用例  t i 的用例潜力度, 见公式   (2)
                              min(SC i )
                 20.    Add tp i  to tpList; // 将用例潜力度加入潜力度列表
                 21.   end for
                 22.   index = tpList.index(max(tpList)); // 获取单个分区中用例潜力度最大的一个用例位置
                 23.   Add t index  to P';
                 24.   Delete(t, t count ) in G; // 在分区  G  中删除已选用例及其覆盖值
                 25.   for each a i  in S cov  // 见公式  (3)
                 26.    if not a i  then // 仍存在未被覆盖的语句
                 27.     Update SC, TC; // 更新语句-用例数表     SC  和用例-语句数表    TC
                 28.     Update S cov , T cov ; // 更新语句标记表  S co 和用例标记表  T cov
                                                         v
   166   167   168   169   170   171   172   173   174   175   176