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

钱忠胜 等: 面向两阶段分组的测试用例优先级排序方法                                                      2049


                 例的用例潜力度效率, 并根据迭代次数对关键用例进行细粒度分组.
                    我们使用多列表储存排序过程所需的数据, 在后续排序过程中会动态更新这些列表, 减少冗余数据访问. 各列
                 表相关描述如表      3  所示.

                                                    表 3 各列表信息描述

                                      名称                                 功能
                                  语句-用例数表SC                   记录每条语句被测试用例覆盖的次数
                                  用例-语句数表TC                     记录每个测试用例覆盖的语句数
                                                             记录每条语句是否被已选择测试用例覆盖
                                   语句标记表S cov
                                                                  记录测试用例是否被选择
                                   用例标记表T cov

                    本文设计语句-用例数表        SC  用于存储计算用例潜力度所需数据, 加快排序的效率. 其中, 用例潜力度是我们提
                 出的一个二次排序指标, 用于表示一个测试用例发现重要问题快慢的能力.
                    对于单个测试用例, 统计它覆盖的每条程序语句在所有测试用例中被覆盖的次数, 从中选取次数的最小值, 并
                 将该最小值的倒数定义为测试用例的“用例潜力度”, 见公式                  (2).

                                                              1
                                                       tp i =                                         (2)
                                                           min(SC i )
                 其中,  SC i = [cov 1 ,cov 2 ,...,cov n ] 表示测试用例  t i 的语句-用例数表, cov j 表示语句  j 被用例覆盖的次数. min(SC i ) 表
                 示用例   t i 覆盖的程序语句分别被全体用例覆盖次数的最小值, tp i 表示             t i 的用例潜力度.

                    一方面, 一个测试用例覆盖的程序元素被其他用例覆盖的次数越少, 意味着该用例覆盖的代码部分相对独特,
                 暴露潜在重要问题的可能性更高, 用例潜力度越大. 优先考虑执行用例潜力度较大的测试用例可更快地检测程序
                 中难以发现的问题. 另一方面, 根据用例潜力度, 我们能利用原始的覆盖信息帮助排序, 当两个测试用例的语句覆
                 盖数  (未被已选择的用例覆盖的剩余语句) 相等, 即额外覆盖数一样时, 将优先选择更具代表性和影响力的用例,
                 即潜力度更大的用例, 可加快发现重要问题的速度, 同时提高测试的有效性和效率.
                    例  2: 见表  2, SC = [8, 4, 5, 5, 2, 2, 2, 1], 即  e 1 –e 8 元素被覆盖的次数分别为  8、4、5、5、2、2、2、1. 其中, t 1
                 覆盖了   e 1 、e 2 、e 3 、e 4 这  4  个元素, 由  SC  表可知  SC 1  = [8, 4, 5, 5], 故  t 1 的用例潜力度为  SC 1 表中最小值的倒数,
                 即结果为   1/4; t 2 覆盖了  e 1 、e 5 、e 7 、e 8 这  4  个元素, 由  SC  表可知  SC 2  = [8, 2, 2, 1], 故  t 2 的用例潜力度为  1; t 3 覆盖
                 了  e 1 、e 3 、e 4 、e 6 这  4  个元素, 由  SC  表可知  SC 3  = [8, 5, 5, 2], 故  t 3 的用例潜力度为  1/2. 因此, 在  t 1 、t 2 、t 3 均未被
                 选择且其覆盖元素个数相同时, 根据           t 1 、t 2 、t 3 的用例潜力度大小关系  tp 2  > tp 3  > tp 1 , 优先选择  t 2 .
                    此外, 我们还根据迭代次数对关键用例进行细粒度分组. 每完成一轮迭代, 根据                        TP-Additional 策略部分关键
                 用例会被选择, 我们将这些用例视为能更快暴露问题的用例组; 剩余关键用例自动成组. 每当某个测试用例被选
                 择, 将其覆盖的语句标记为“已覆盖”, 持续地选择测试用例直到所有可能语句均被覆盖并已标记完, 根据给定策略
                 进行测试用例排序, 然后将所有可能语句重置为“未覆盖”的过程, 我们称其为一次迭代, 即语句标记表                              S co 的值由
                                                                                                  v
                 初始为全   0  经过多次更新转化为全       1, 再重置为全   0  的过程, 见公式   (3):

                                                           1, if语句i被已选用例覆盖
                                                          
                                                          
                                      S cov = [a 1 ,a 2 ,...,a n ] 且a i =                            (3)
                                                            0, if语句i未被已选用例覆盖
                    例  3: 以表  2  和例  1  中的关键用例组为例. 初始时, 语句标记表        S cov  = [0, 0, 0, 0, 0, 0, 0, 0], 关键用例组  K = [t 1 ,
                 t 2 , t 3 , t 4 , t 5 , t 8 ], t 1 、t 2 、t 3 、t 4 、t 5 、t 8 的覆盖语句数分别为  4、4、4、3、3、4. 先选出覆盖语句数多的用例, 即  t 1 、
                 t 2 、t 3 、t 8 , 再根据用例潜力度进行选择, t 1 、t 2 、t 3 、t 8 的用例潜力度分别为  1/4、1、1/2、1/2, 故排序时优先选择
                 t 2 , 并更新  S cov  = [1, 0, 0, 0, 1, 0, 1, 1]; 接下来, 根据  S co 计算  t 1 、t 3 、t 8 的额外覆盖语句数分别为  3、3、2, 通过覆
                                                          v
                 盖语句数选出     t 1 和  t 3 , 再比较  t 1 和  t 3 的用例潜力度大小优先选择  t 3 , 并更新  S cov  = [1, 0, 1, 1, 1, 1, 1, 1]; 继续根据
                 S co 计算  t 1 和  t 8 的额外覆盖语句数分别为  1  和  0, 故直接选择  t 1 , 无需考虑用例潜力度, 并更新    S cov  = [1, 1, 1, 1, 1,
                   v
                 1, 1, 1]. 这样, 当依次选择  t 2 、t 3 、t 1 后, 所有可能语句已被全覆盖, 在下一轮迭代之前将       S co 重置为  0. 在本轮迭代
                                                                                       v
   165   166   167   168   169   170   171   172   173   174   175