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 的测试输入是基于分布式系统设计层面建模的, 从而会遗漏一些代码实现上的功能
                 逻辑.
   67   68   69   70   71   72   73   74   75   76   77