Page 229 - 《软件学报》2024年第6期
P. 229
钱忠胜 等: 结合 SVM 与 XGBoost 的链式多路径覆盖测试用例生成 2805
1. init_pop←Initialize(Pop_Size, CL);
2. test_data←toDecimal(init_pop); // 将初始种群信息转换为十进制
3. iteration←0;
4. FOR iteration IN ET:
5. new_pop_indiv ← init_pop;
6. prepath←Input test_data into C-SVMXGBoost; // 获取预测路径
7. sim_path←comparePath (prepath, Tarpath); // 获取与预测路径相似的目标路径
8. IF sim_path < > ∅ : // 存在相似路径
9. precise_path←getFromInstru(test_data); // 在插桩程序中获取精确路径
10. fit← calculateFitness(test_data); // 根据公式 (13)–公式 (15) 计算适应度值
11. IF fit == 1:
12. UncoveredTarPath←Delete current path from Tarpath; // 删除当前目标路径
13. New_testdata←test_data; // 保存当前测试数据, 用于后续模型更新
被覆盖则完成测试; 否则在进化代数达到阈值时才终止. 第
14. END IF
15. END IF
16. Roulette(Pop_Size, new_pop_indiv, fit); // 轮盘赌法选择个体
17. Pop_list←Crossover (Pop_Size, CL, CP, EI); // 引入新个体进行交叉操作
18. new_pop_indiv←Mutate (Pop_list, CL, MP); // 实施变异操作
19. test_data←toDecimal(new_pop_indiv);
20. iteration += 1; // 统计迭代次数
21. IF UncoveredTarPath== ∅:
22. BREAK;
23. END IF
24. END FOR
25. Output New_testdata, UncoveredTarPath;
END
在算法 2 中, 第 1 行和第 2 行初始化种群并将其转换为十进制数. 第 3–24 行, 借助 C-SVMXGBoost 模型完成
遗传操作, 生成覆盖目标路径的测试数据. 其中第 5 行和第 6 行, 将数据输入链式模型中, 获得预测路径. 第
7–10 行, 根据预测路径寻找目标路径中的相似路径, 将当前测试数据输入到插桩程序, 获取精确路径, 并计算适应
度值. 第 11–14 行, 若适应度值为 1, 表明目标路径被覆盖, 将其删除, 并保存当前测试数据; 第 16–20 行, 当目标路
径未被全覆盖或不存在预测路径与目标路径的相似路径时, 则进行轮盘赌选择、交叉、变异等过程, 在交叉过程
中引入优秀个体基因, 通过变异生成新的种群, 并统计迭代次数. 第 21–23 行, 判断全部目标路径是否被覆盖, 若全
25 行输出新测试数据 (用于更新样本) 以及目标路径
的覆盖情况.
4.3 C-SVMXGBoost 链式模型更新
C-SVMXGBoost 链式模型精度是提高测试效率的关键, 为使每个路径节点的预测结果均较准确, 该模型需进
一步更新, 以提高模型精度. 链式模型更新过程见算法 3.
算法 3. C-SVMXGBoost 链式模型更新.
输入: 链式模型 C-SVMXGBoost, 新测试数据 New_testdata, 目标路径集 TarPath;
输出: Updated_C-SVMXGBoost 模型.