推荐一款Diffy:Twitter的开源自动化测试工具

简介: Diffy是一个开源的自动化测试工具,**是一种Diff测试技术**。它能够自动检测基于Apache Thrift或者基于HTTP的服务。通过同时运行新/老代码,对比运行结果,发现潜在bug。使用Diffy,只需要进行简单的配置,之后不需要再编写测试代码。

阅读全文需8分钟,公众号【测试开发技术】后台回复me可免费扫描领取测试进阶学习资料。

1. Diffy是什么

Diffy是一个开源的自动化测试工具,是一种Diff测试技术。它能够自动检测基于Apache Thrift或者基于HTTP的服务。通过同时运行新/老代码,对比运行结果,发现潜在bug。使用Diffy,只需要进行简单的配置,之后不需要再编写测试代码。

2. Diffy主要为了解决什么问题

一个项目,从第一个版本发布到形成一个相对完善的版本,再到后面的重大更新甚至重构,需要经过许多版本的迭代。

而随着项目的迭代,产品功能不断增加,项目会变得越来越复杂。在后期,每修改增加的功能相对上一版本已存在功能的比例却是越来越小。但每一次或大或小的版本升级,我们都需要保证新增或修改的功能不影响上一版本已存在的功能。但要达到这一点却是困难异常,哪怕只改了一行代码、哪怕这项更改由非常优秀的开发者完成,我们都很难保证这项功能对上一版本的功能无任何影响。

要保证每次上线的安全,我们需要开发和测试完成两项工作。一是,开发者在增加或变动某项新功能后,补充相应的测试用例,但写过单元测试的同学都知道,完成一个单元测试用例所花费的时间可能比完成相应功能花费的时间更多得多。

大多情况只能写几个核心的测试用例,而在人员不足,时间紧张的情况下,则更是难上加难了。在后期,因为功能在不断增加,回归测试的工作量越来越大,同时因为是回归,可能几百甚至上千用例中才会发现一个问题,甚至一个问题也没有,测试投入工作的时间与最终的收益不成比例。

另外测试人员对相同内容的重复测试,会有一种疲惫感,这样一来会给测试人员带来消极情绪,当真的有问题(尤其是较复杂的数据问题)发生时,也可能会因为这种疲惫而将问题忽略(如果一个用例测了10遍都没问题,第11遍测的时候心里可能会默认这个地方是没问题的了)。这时候有些测试人员可能会考虑做自动化测试,但是自动化测试前期投入的成本较高,另外对测试人员的要求较高。如果项目变动比较频繁,部分自动化测试可能需要重新设计,会带来较高的成本。

而Diffy为上述问题提供了较好的解决方案,不同于我们常用的其他测试工具或框架从代码或接口的返回结果的正确性去验证,而是如其名:通过代码的差异去验证测试

需要注意的是:既然是差异,那至少是两者之间比较才有差异,对于第一行代码或新增的功能无法比较,自然也就无法验证,这时diffy无法发挥作用。但在后续增加修改,项目不停迭代的周期中,diffy就可以发挥它的舞台了,有了上一版本以及测试人员在上一版本测试工作的基础,我们就通过上一版本和当前版本比较差异了。

3. Diffy适用场景

①、场景验证:

比如某个接口返回的数据中的”name”字段获取由user数据库表改为mobile_user数据库表,那么从接口角度来讲,通过对比这个接口在新老版本代码的返回结果,就可以知道其字段的基本正确性与差异性。

②、提升回归效率:

就一般的接口测试来说,每次代码迭代,除了对新接口的测试,还包括对老接口的回归。如果通过手工回归,那么随着接口数量的增加,测试人员的工作量将同样地线性增长,且效率将大幅降低。通过diff测试,可以发现相同接口下内部代码逻辑变更对其输出的影响,测试人员只需要对比diff接口的差异之处(或自动对比),从而大幅减少人工作业的工作量。

4. Diffy一般操作流程

①、分别部署新、老代码:其中老代码为线上稳定版本,新代码为新迭代的测试版本。

②、构造测试数据:我们可以手工构造测试数据,也可以对线上的数据进行抽样,用于diff测试。

③、运行测试:使用测试数据分别在新、老代码中运行,并捕获测试结果。

④、结果对比:对比新、老代码,相同接口下的输出,如果出现差异,则可以通过接口反向定位问题。

5. Diffy工作原理

在测试过程中,Diffy充当一个代理,它能够将来源请求分发到不同版本的系统中去,通过对各个版本系统的输出进行对比,做出最终的结论。

Diffy需要三个版本的系统,以实现它的噪声过滤和对比功能,它们分别是:

候选版本:该版本是待测版本,相对于生产环境版本有着跟新的代码。

稳定版本:该版本通常是已经上线版本,或者是已知功能正常的版本。

稳定版本副本:该版本是稳定版本的副本,和稳定版本运行相同的代码,主要用于排除噪声。

整个运行流程为:
image

如图所示,diffy能够比较primary(线上稳定版本)和secondary(线上稳定版本备份)的差异值,通过对这些差异值做减法来消除噪声;通过比较candidate(测试版本)和primary(线上稳定版本)得到基本的diff结果;最后通过比对基本的diff结果与消除噪声后的结果,得到最终的diff结果。

其中:

  • 原始区别为候选版本和稳定版本之间输出的区别,其中可能会包含上述的噪声。
  • 噪声从稳定版本和其副本中
    获得,如果两个运行相同代码的系统输入相同输出却不同,则Diffy会认为这是开发人员不需要关心的噪声。

基于上述两个区别集合,Diffy可以识别出候选版本和稳定版本真实的区别,这些区别很有可能就是一个缺陷。

当然,对于一个概率性出现随机值,仅仅一次请求的结论可能是不准确的。例如对于一个50%概率出现true或者false的布尔值,则有50%的概率会出现候选版本和稳定版本的不同,同时又会有50%的概率出现稳定版本和其副本出现不同(即将这个值认定为噪声),最终会有25%的概率认为这是一个缺陷。因为此时稳定版本和其副本值相同,候选版本和稳定版本值不同。因此,Diffy还会聚合原始区别和噪声,当发现二者出现的概率类似的时候,会认定之前识别出来的缺陷属于误报。

6. Diffy安装、使用

1、克隆代码并构建

git clone https://github.com/twitter/diffy.git
cd diffy
./sbt assembly

下载diffy-server,也可以在github上下载源码编译 twitter/diffy , diffy是twitter使用scala语言开发的项目,在安装了jdk的基础上,还需要安装scala和sbt(类似于maven), 另外有些jar包需要从twitter下载,可能需要vpn。

2、例如,在localhost:9990部署primary(线上稳定版本)的代码。

3、例如,在localhost:9991部署secondary(线上稳定版本备份)的代码。

4、例如,在localhost:9992部署candidate(测试版本)的代码。

5、在下载好jar包之后,可直接通过java命令启动diff服务:

java -jar diffy-server.jar
-candidate=localhost:9992
-master.primary=localhost:9990
-master.secondary=localhost:9991
-service.protocol=http
-serviceName=My-Service
-proxy.port=:8880
-admin.port=:8881
-http.port=:8888
-rootUrl='localhost:8888'

各参数详细说明:

candidate='localhost:9200'  (待上线版本部署地址)
master.primary='localhost:9000' (已上线版本地址1)
master.secondary='localhost:9100' (已上线版本地址2)
service.protocol='http'  (http协议或https)
serviceName='My Service'  (服务名称,无影响)
proxy.port=:8880  (diffy代理端口,所以请求都应从这个端口访问)
admin.port=:8881 ( 通过http://localhost:8881/admin可以查看请求状况)
http.port=:8888 (查看界面,在这里可以比较差异)
rootUrl='localhost:8888' (同上)
responseMode=primary (代理服务器是否返回结果,默认(empty)无返回,可指定primary返回线上版本,secondary(同线上版本,用于噪音消除),candidate(待测试版本)
excludeHttpHeadersComparison=false (是否排除header的差异,不同服务器,cookie,nginx版本可能有所差异,设置为true可以忽略这些差异)
notifications.targetEmail=123@emal.com (对差异发送到指定邮箱)

需要注意的是,为了防止测试对数据造成不必要的影响,diffy默认只支持读,即Post及Delete影响数据的等请求不会转发,如果需要支持这样的请求,需要增加参数。

allowHttpSideEffects=true

命令模板(根据实际情况修改参数值即可)

java -jar diffy-server.jar -candidate=localhost:8086 -master.primary=localhost:85 -master.secondary=localhost:85 -service.protocol=http erviceName=My-Service -proxy.port=:8880 -admin.port=:8881 -http.port=:8888 -rootUrl='localhost:8888' -allowHttpSideEffects=true

6、对diffy发一些请求

curl localhost:8880/your/application/route?with=queryparams

7、在http://localhost:8888中检查结果,结果展示如下图

image

如图所示,我们可以看到每个请求在不同节点上的差异之处,如果点击“Exclude Noise”,则可以消除噪声,看到最终的diff结果。
image

  1. 小结
    上述对diffy作了一些基本的介绍和使用引导,利用diffy结合gor及nginx或filter等手段还可以扩展很多其它的测试实践。关于gor的介绍和用法可查阅:推荐一款简单易用线上引流测试工具:GoReplay,diffy更多高级用法,欢迎大家自行探索。

点击可查看:原文阅读

最后,关注公众号「测试开发技术」后台回复me, 可扫码添加作者微信,免费领取测试技术学习资料。

目录
相关文章
|
14天前
|
人工智能 运维 Prometheus
AIOpsLab:云服务自动化运维 AI,微软开源云服务 AI 框架,覆盖整个生命周期
AIOpsLab 是微软等机构推出的开源框架,支持云服务自动化运维,涵盖故障检测、根本原因分析等完整生命周期。
91 13
AIOpsLab:云服务自动化运维 AI,微软开源云服务 AI 框架,覆盖整个生命周期
|
14天前
|
数据挖掘 测试技术 项目管理
2025年测试用例管理看这一篇就够了 ----Codes 开源免费、全面的测试管理解决方案
Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台,支持云端认证、本地部署、全部功能开放,并且对 30 人以下团队免费。它通过整合迭代、看板、度量和自动化等功能,简化测试协同工作,使敏捷测试更易于实施。并提供低成本的敏捷测试解决方案,如同步在线离线测试用例、流程化管理缺陷、低代码接口自动化测试和 CI/CD,以及基于迭代的测试管理和测试用时的成本计算等,践行敏捷测试。
2025年测试用例管理看这一篇就够了 ----Codes 开源免费、全面的测试管理解决方案
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
MarS:微软开源金融市场模拟预测引擎,支持策略测试、风险管理和市场分析
MarS 是微软亚洲研究院推出的金融市场模拟预测引擎,基于生成型基础模型 LMM,支持无风险环境下的交易策略测试、风险管理和市场分析。
48 8
MarS:微软开源金融市场模拟预测引擎,支持策略测试、风险管理和市场分析
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
CogAgent-9B:智谱 AI 开源 GLM-PC 的基座模型,专注于预测和执行 GUI 操作,可应用于自动化交互任务
CogAgent-9B 是智谱AI基于 GLM-4V-9B 训练的专用Agent任务模型,支持高分辨率图像处理和双语交互,能够预测并执行GUI操作,广泛应用于自动化任务。
86 12
CogAgent-9B:智谱 AI 开源 GLM-PC 的基座模型,专注于预测和执行 GUI 操作,可应用于自动化交互任务
|
6天前
|
弹性计算 运维 监控
自动化AutoTalk第十一期-应知必会的自动化工具之阿里云配额中心
本次分享主题为“应知必会的自动化工具之阿里云配额中心”,课程围绕三个方面展开:1) 认识配额及其作用;2) 配额管理的意义与方法;3) 阿里云配额中心的功能和使用场景。通过学习,了解如何有效管理和监控配额,避免资源限制影响业务,并实现自动化集成,提升运维效率。
31 10
|
6天前
|
JavaScript Java 开发工具
AutoTalk第十三期-应知必会的自动化工具-阿里云SDK支持策略(一)
AutoTalk第十三期探讨阿里云SDK支持策略,涵盖四大方面:发布策略、版本规范、更新策略及停止支持策略。重点介绍SDK的及时性、完整性、测试覆盖度和版本命名规范;并以Python部分语言版本停止支持为案例,帮助开发者了解维护策略,确保平稳过渡到新版本。
|
30天前
|
人工智能 Linux API
PromptWizard:微软开源 AI 提示词自动化优化框架,能够迭代优化提示指令和上下文示例,提升 LLMs 特定任务的表现
PromptWizard 是微软开源的 AI 提示词自动化优化框架,通过自我演变和自我适应机制,迭代优化提示指令和上下文示例,提升大型语言模型(LLMs)在特定任务中的表现。本文详细介绍了 PromptWizard 的主要功能、技术原理以及如何运行该框架。
161 8
PromptWizard:微软开源 AI 提示词自动化优化框架,能够迭代优化提示指令和上下文示例,提升 LLMs 特定任务的表现
|
26天前
|
存储 人工智能 人机交互
PC Agent:开源 AI 电脑智能体,自动收集人机交互数据,模拟认知过程实现办公自动化
PC Agent 是上海交通大学与 GAIR 实验室联合推出的智能 AI 系统,能够模拟人类认知过程,自动化执行复杂的数字任务,如组织研究材料、起草报告等,展现了卓越的数据效率和实际应用潜力。
144 1
PC Agent:开源 AI 电脑智能体,自动收集人机交互数据,模拟认知过程实现办公自动化
|
7天前
|
算法 安全 Java
自动化AutoTalk第十期:应知必会的自动化工具-阿里云SDK
本期《自动化AutoTalk》第十期聚焦应知必会的自动化工具——阿里云SDK。主要内容分为三部分:1. 阿里云SDK概述,介绍其支持的300多款云产品和8种主流编程语言;2. 快速生成SDK示例,以Java语言为例展示如何通过OpenAPI门户快速生成并下载SDK工程;3. 进阶特性介绍,涵盖签名算法、Endpoint配置、代理设置、HTTPS请求配置、超时机制及异常处理等重要功能。通过这些内容,帮助开发者更高效、安全地使用阿里云SDK。
|
1月前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
212 17
Selenium:强大的 Web 自动化测试工具

热门文章

最新文章