Page 72 - 《软件学报》2025年第7期
P. 72
陈元亮 等: 分布式系统动态测试技术研究综述 2993
进行实时覆盖率信息收集. 该方法的覆盖率收集流程主要包含 3 个主要步骤: (1) 启动待测分布式系统时加上
“-javaagent: path_to_jacocoagent”选项启动 JaCoCo 的代理模式; (2) 在插装后的待测系统上执行测试; (3) 测试结束
后, 使用“java -jar jacococli.jar report path_to_report”生成详细的覆盖率报告. 同样, 对于 Go 语言项目 IPFS, 我们实
现了 go-cov [105] 的代理模式: 在待测系统运行时启动覆盖率收集监听器 cov-server, 实时统计覆盖率信息, 形成覆盖
测试报告. 使用“go-cov -report path_to_report”命令查看详细的覆盖率信息, 报告内容包括文件覆盖率、函数覆盖
率、代码行覆盖率以及分支覆盖率. 我们选取了大多数测试工具中最常用的代码行覆盖率和分支覆盖数信息作为
测试评估指标, 具体的覆盖信息如表 4 所示.
表 4 各动态测试工具在待测分布式系统上的覆盖数据
分布式系统 HDFS ZooKeeper IPFS
工具名 代码行覆盖率 (%) 分支覆盖数 代码行覆盖率 (%) 分支覆盖数 代码行覆盖率 (%) 分支覆盖数
CTests 23.45 31 683 16.15 12 640 14.49 2 011
ECFuzz 24.38 32 588 16.83 13 247 15.02 2 079
DUPTester 27.42 38 194 18.65 14 369 16.58 2 391
Mocket 25.91 335 392 17.48 13 559 15.85 2 396
LOKI 21.09 29 539 13.76 11 381 16.93 2 462
Tyr 21.83 30 523 14.02 11 639 17.59 2 517
CrashFuzz 23.01 31 592 14.23 11 662 15.76 2 399
Chronos 24.27 32 908 15.04 12 298 15.98 2 448
此外, 考虑到各个测试工具除了针对分布式系统的不同目标逻辑设计了各自的缺陷检测器外, 都还支持分布
式系统的崩溃缺陷检测. 因此, 我们收集了各个动态测试工具在 24 h 内发现的缺陷数目, 包括崩溃缺陷数目以及
逻辑缺陷数目, 如表 5 所示. 对于崩溃缺陷, 我们使用统一的基于错误栈信息的去重方法, 进行人工分析以过滤重
复的缺陷; 对于逻辑缺陷, 我们使用各工具自带的去重策略对报告的缺陷进行分析去重. 考虑到不同工具找到的缺
陷可能会有交叉重复, 我们通过对上述工具报出的所有缺陷进行人工分析、分类和去重处理, 最终统计出各待测
分布式系统基于这些测试工具发现的总缺陷数.
表 5 各动态测试工具在待测分布式系统上的缺陷检测数
分布式系统 HDFS ZooKeeper IPFS
工具名 崩溃缺陷 逻辑缺陷 崩溃缺陷 逻辑缺陷 崩溃缺陷 逻辑缺陷
CTests 2 1 0 1 0 0
ECFuzz 2 1 1 1 0 1
DUPTester 1 2 1 1 0 1
Mocket 1 1 0 1 0 0
LOKI 0 0 1 0 1 1
Tyr 0 1 1 0 1 2
CrashFuzz 1 1 0 2 0 0
Chronos 1 1 1 2 0 1
总缺陷数 4 6 3 4 1 3
由表 4 中数据可以看出, 所有工具在各分布式系统上的代码行覆盖率均不超过 30%, 处于较低水平. 这主要是
因为分布式系统功能复杂多样, 但大部分测试工具目前都只关注于其中的某些功能组件进行测试, 导致大量丰富
的不同组件交互逻辑难以深入覆盖. 从表中数据可以看出, 用户请求输入生成工具 Mocket 和 DUPTester 总是能覆
盖最多的代码行和分支覆盖数. 这是因为它们生成的测试输入是与待测系统的功能逻辑相关的, 而一个分布式系
统中功能处理代码往往占比较多且更容易触发. 与 Mocket 相比, DUPTester 在 3 个待测系统上均表现出更佳的测
试覆盖率, 这是因为 Mocket 的测试输入是基于分布式系统设计层面建模的, 从而会遗漏一些代码实现上的功能
逻辑.

