Page 75 - 《软件学报》2025年第7期
P. 75

2996                                                       软件学报  2025  年第  36  卷第  7  期


                 陷. 当待测系统加载完系统配置文件并启动系统后, 步骤                 2、3  不停迭代执行直到待测系统覆盖率收敛为止, 结束
                 步骤  2、3. 随后系统重新加载新的系统配置文件, 重新执行步骤                2、3  的测试流程, 直到用户中断或定时器到时.
                    表  6  展示了多维度测试输入工具        MultiGen  在  3  个待测分布式系统上运行     24 h  后的测试表现. 与这   4  个典型
                 先进动态测试工具相比, MultiGen 在      3 个待测分布式系统上总是能取得更好的代码行覆盖率和分支覆盖数. 与表                       4
                 中的测试工具 ECFuzz、 DUPTester、 Tyr 和 Chronos 相比, 表   6  中的  MultiGen 分别提升了 31%、 18%、 38%  和
                 34%  的代码行覆盖率, 能够多测试分支覆盖数 27%、 12%、 28% 和 23%. 根据这些数据我们可以发现多维度输
                 入策略能够有效提高测试效率, 从而提升测试工具的代码覆盖情况. 这是因为不同维度的输入之间存在依赖关系,
                 例如同样的客户请求在不同系统配置下的代码执行路径可能不同                       (即执行了不同的代码分支). 通过将不同维度的
                 输入简单集成, 能够有效生成一些跨输入维度的测试场景, 从而提高整体测试覆盖效果.

                                          表 6 MultiGen  在待测分布式系统上的测试表现

                                                    测试覆盖                     缺陷发现
                                分布式系统
                                           代码行覆盖率 (%)      分支覆盖数        崩溃缺陷       逻辑缺陷
                                  HDFS          31.48        43 148       5          7
                                ZooKeeper       21.93        16 185       5          5
                                  IPFS          20.47         2 743       3          4

                    MultiGen  除了能覆盖原本测试工具发现的所有           21  个缺陷外, 还在   HDFS、ZooKeeper 和  IPFS  系统上分别多
                 找到  2、3、3  个系统缺陷, 并且成功复现了缺陷          HDFS-13279. 这表明不同测试维度输入的简单随机组合, 也能有
                 效覆盖一些深层次系统行为逻辑, 从而揭露新的未知缺陷.
                    总体而言, 尽管目前简单多维度集成工具             MultiGen  在测试效果上取得了一些进步, 但对分布式系统的代码覆
                 盖率仍然较低, 挖掘的缺陷总数          29  仍与系统中的实际缺陷数量存在较大差距. 第             1, 这是因为分布式系统交互复
                 杂, 不同开发人员在开发各自模块时往往会采取防御性编程策略, 从而存在许多无法被触发执行的“死代码”. 第                                 2,
                 由于分布式系统的不同维度输入之间交互逻辑庞大且复杂, 目前的动态测试工具无法生成足够复杂的测试场景来
                 触发执行系统的深层代码路径. 针对第            1  种情况, 可以通过一些静态分析工具并辅以人工分析, 识别出这些“死代
                 码”, 在进行测试覆盖率统计时将其剔除. 针对第             2  种情况, 分布式系统的     4  个输入维度不是独立存在的, 它们逻辑
                 交织、交互依赖, 共同作用于整个分布式系统, 保证整体系统的可用性与安全性. 目前                          MultiGen  的多维度输入策
                 略较为简单, 但仍取得了不错的初步成效. 未来的测试方案应该着眼于开发更高效且智能化的多维度测试输入方
                 法, 更加深入挖掘不同维度的逻辑依赖关系, 并基于此分析建立详尽的测试场景模型, 探索高效的多维度测试输入
                 生成技术, 以进一步优化测试效果.

                 5   总结与展望

                 5.1   分布式系统动态测试工作的总结

                    分布式系统在现代计算和存储密集型应用中发挥着重要作用, 保障其安全性和可靠性至关重要, 因此挖掘潜
                 在的代码缺陷成为学术界和工业界的研究重点. 近期也逐步涌现出大量分布式系统动态测试工具. 其中, 部分工具
                 专注于分布式系统的逻辑缺陷, 如           NEAT、Fluffy  和  DUPTester 等工具通过定义和探索逻辑问题的测试准则来检
                 测缺陷; 一些工具聚焦于安全漏洞检测, 如            LOKI 用于内存安全检测, MPChecker 用于权限安全检测; 另有工具专
                 注于一致性缺陷检测, 如       Tyr 的分布式共识一致性检测, CoFi 和        Modulo  的崩溃一致性检测, 以及     FlyMC、TSVD
                 等工具的并发数据一致性检测. 此外, IASO           和  Perseus 等工具专注于性能问题的测试, CrashFuzz 和      Phoenix  则针
                 对鲁棒性问题进行测试, ScaleCheck       和  ChaT  等工具关注系统扩展性问题. 这些动态测试技术在诸如                  HDFS、
                 ZooKeeper、IPFS  等流行的分布式系统上发现了大量缺陷, 显著提升了系统的可用性、安全性和稳定性.
                    目前, 分布式系统动态测试的局限性主要体现在以下                 4  个方面: (1) 覆盖低: 分布式系统的代码规模庞大, 包含
                 复杂的行为逻辑. 目前的动态测试工具覆盖率较低, 许多深层次的代码逻辑未被测试, 可能隐藏着大量缺陷. (2) 维
   70   71   72   73   74   75   76   77   78   79   80