Page 68 - 《软件学报》2025年第7期
P. 68
陈元亮 等: 分布式系统动态测试技术研究综述 2989
测试同样会造成漏报问题.
3.3.3 蜕变测试准则构建
蜕变测试 (metamorphic testing) 通常应用在难以找到用来对比的差分对象的测试场景上. 蜕变测试基于软件
应该遵循的某些性质或规律 (称为蜕变关系), 通过对原始输入和经过某种方式变换后的输入进行处理, 然后比较
输出结果是否符合这些蜕变关系, 从而判断程序是否存在缺陷. 蜕变测试的核心难点在于需要根据分布式系统的
功能和需求, 确定一组蜕变关系. 这些关系是基于系统应遵循的行为特性定义的, 例如, 系统的输出应该对某些输
入变化保持不变, 或者某些操作的序列不应影响最终结果. 以数学公式上的蜕变关系 sin(x) = −sin(−x) 为例. 我们
的测试输入 x 和 −x 需满足结果 A = −B. 然而, 这样的关系的寻找和确定往往需要领域专家深入的知识. 如图 10 所
示, 为分布式系统建立蜕变关系的一种常见方式是通过创建具有等效语义的不同分布式系统输入, 并比较它们的
响应行为、输出结果.
测试输入 结果 A
蜕变转化 分布式系统 对比
测试输入′ 结果 B
图 10 分布式系统蜕变测试示意图
动态测试工具 TEA-Cloud [87] 使用蜕变测试准则来自动判断分布式系统的配置处理逻辑行为是否合法. TEA-
Cloud 针对分布式系统的性能与资源配置、资源使用之间的关系, 设计了 3 个通用蜕变转化关系. 蜕变关系 1: 给
定两个分布式系统 DFS 和 DFS' 以及两个工作负载 ω 和 ω', 如果 ω 和 ω' 相等, 并且 DFS 使用的 CPU 性能大于
DFS' 使用的 CPU 性能 (其他方面相同), 则执行系统 DFS 执行 ω 所需的时间必须小于或等于执行 DFS' 执行 ω'
所需的时间, 或者在相同时间内 DFS 上成功处理的 ω 的用户请求数量必须大于在 DFS' 上成功处理的 ω' 的用户
请求数量. 蜕变关系 2: 给定两个分布式系统 DFS 和 DFS' 以及两个工作负载 ω 和 ω', 如果 ω' 是对 ω 使用标准排
序后构建的 ω 的序列, 表示为 sort(ω), 则产生按时间顺序排序的序列 ω' = {((t 1 , ts 1 ), (t 2 , ts 2 ), …, (t n , ts n ))}, 则对于所
有 1 ⩽ i < n, 我们有 ts i ⩽ ts i +1, 且 DFS 和 DFS' 相等, 则在系统 DFS 上成功处理 ω' 的用户请求数量必须等于 ω
中的用户请求数量. 蜕变关系 3: 给定两个分布式系统 DFS 和 DFS' 以及两个工作负载 ω 和 ω', 如果 DFS 和 DFS'
相等并且负载 ω 包含 ω', 则系统 DFS 处理负载 ω 所需的总成本必须小于或等于系统 DFS' 处理 ω' 所需的总成本.
基于这 3 个蜕变关系, TEA-Cloud 构造了大量的测试输入, 进行蜕变结果对比, 成功挖掘了许多潜藏在分布式系统
中的逻辑缺陷.
然而, 在 TEA-Cloud 测试过程中, 蜕变结果不符合预期不一定是系统缺陷所导致的, 可能是测试环境中的不
可控因素带来的扰动, 从而导致误报. 为了解决这一问题, 另一典型动态测试工具 ChaT [66] 也基于系统配置和系统
性能之间的关系, 构造了 4 种通用的蜕变关系. ChaT 使用几种机器学习技术 (隔离森林、一类支持向量机、局部
离群因子和鲁棒协方差算法) 对这些蜕变关系进行验证. 通过对大量测试过程中产生的运行时数据进行分析,
ChaT 能够辅助判断蜕变结果的差异是由不可控实验环境干扰带来的还是由系统自身缺陷导致的, 从而有效减少
测试工具的误报.
3.3.4 用户自定义检测模型
考虑到蜕变测试通常难以精准构建蜕变关系, 目前一些分布式系统的动态测试工具往往采取更灵活的策略来
应对缺陷判断准则的建立问题. 这些工具提供了一个通用的测试框架, 并通过设计用户友好的接口, 使得用户可以
利用特定领域语言 (DSL) 定制化测试准则. 这种方法允许用户根据对待测系统的深入理解, 自定义针对系统特定
关注点的缺陷检测规则, 从而在动态测试过程中有效识别潜在缺陷.
作为使用最为广泛的分布式系统测试工具之一, Jepsen [58] 凭借其灵活的框架设计和全面的 API 接口, 支持测
试人员自定义系统的缺陷判断模型. 通过编写 Clojure 语言的代码脚本及相应配置文件, 测试工程师可以详细定义

