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

