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

