Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >推荐一款Diffy:Twitter的开源自动化测试工具

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

原创
作者头像
测试开发技术
修改于 2019-11-11 09:56:30
修改于 2019-11-11 09:56:30
3.2K02
代码可运行
举报
文章被收录于专栏:测试开发技术测试开发技术
运行总次数:2
代码可运行

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需要三个版本的系统,以实现它的噪声过滤和对比功能,它们分别是:

  1. 候选版本:该版本是待测版本,相对于生产环境版本有着跟新的代码。
  2. 稳定版本:该版本通常是已经上线版本,或者是已知功能正常的版本。
  3. 稳定版本副本:该版本是稳定版本的副本,和稳定版本运行相同的代码,主要用于排除噪声。

整个运行流程为:

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

其中:

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

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

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

6. Diffy安装、使用

1、克隆代码并构建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/twitter/diffy.gitcd diffy./sbt assembly

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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'

各参数详细说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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影响数据的等请求不会转发,如果需要支持这样的请求,需要增加参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
allowHttpSideEffects=true

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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发一些请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl localhost:8880/your/application/route?with=queryparams

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

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

7. 小结

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
测试利器 | 一款开源的Diffy自动化测试框架:超详细实战教程讲解
软件测试是软件开发生命周期一个十分重要的环节,测试工作开展的好坏,很大程度上决定了产品质量的好坏,但软件产品随着版本的持续迭代,功能日益增多,系统愈加复杂,而从质量保障的角度,除了要保障好每次新增、优化的产品质量外,还需要确认新增或修改的功能不影响之前已存在的功能。若要进行产品功能全量回归,这个测试的工作量将会非常巨大。同时因为是回归,可能几百甚至上千用例中才会发现一个问题,甚至一个问题也没有,测试投入工作的时间与最终的收益不成比例。
测试开发技术
2020/06/19
2.4K0
一款开源的Diffy自动化对比测试框架:超详细实战讲解
软件测试是软件开发生命周期一个十分重要的环节,测试工作开展的好坏,很大程度上决定了产品质量的好坏,但软件产品随着版本的持续迭代,功能日益增多,系统愈加复杂,而从质量保障的角度,除了要保障好每次新增、优化的产品质量外,还需要确认新增或修改的功能不影响之前已存在的功能。若要进行产品功能全量回归,这个测试的工作量将会非常巨大。同时因为是回归,可能几百甚至上千用例中才会发现一个问题,甚至一个问题也没有,测试投入工作的时间与最终的收益不成比例。
测试开发技术
2020/06/17
4.5K3
方便的回归测试——diffy平台
前段时间,公司运维又双叒叕在迁移机房,带来的又是大量的回归测试,虽然负责的项目case还算健全,但是被迁移机房仍然存在大量的历史接口,有些甚至不知道是什么业务在用,但仍然在有少量请求,既然还在为少量用户提供服务,那就不能断然下线,但是这种服务该怎么回归呢?
用户5521279
2019/12/10
3.4K3
录制线上流量做回归测试的正确打开方式
  对比完了,对于一些类似时间戳的值,其实就是噪音,这些不一样很正常,我们需要剔除,不然差异没有价值。
顾翔
2021/07/22
1.1K0
拨开流量录制回放从基建到业务落地的迷雾
作者 | 汪成坤 策划 | 褚杏娟 在泛敏捷思潮变革、DevOps 大行其道的背景下,小步快跑的模式极大程度压缩了质量保障活动的时间,传统的自动化测试工具已无法满足持续交付的需求。流量录制回放的概念近年来愈发火热,从业界大会到社区论坛,众多工程师进行了大量的思辩悟,肯定了 API 录制回放能有效地解决测试、研发工程师在质量活动中的核心痛点从而带来可观测的研发效能提升。 流量录制回放的核心价值是通过直接录制生产的高保真数据,快速地在测试环境中进行回放比对接口返回值和中间链路的验证。录制回放很热,行业
深度学习与Python
2023/03/29
1.2K0
拨开流量录制回放从基建到业务落地的迷雾
Katalon Studio一款免费的自动化测试工具
自动化测试是软件测试领域一直比较火热的话题。这些年来,大家都在追求简洁、易用、稳定的方向。有一些工具能够有助于创建简单易行的脚本,但是使用起来却很麻烦。而其他相对简单一些的工具,在测试过程中又总会出现一些问题。所以在选择使用何种测试工具的时候,我们总是得此失彼。一款好的自动化测试工具可以解决以上基本问题,更何况这款工具功能强大开源免费。那么,你何乐而不为呢?
Altumn
2019/10/21
4.3K0
Katalon Studio一款免费的自动化测试工具
kylinTOP 测试与监控平台:一款基于 AI 的软件自动化测试工具的介绍
对于一般的传统的自动化测试工具,如:Selenium,robotFramework,QTP等。QTP可以通过操作录制生成自动化用例脚本。生成的脚本与Selenium、robotFramework类似,都是类方法的调用以及各种方法的参数的传递。对于一个学习者来说没有2-3年的工作经验,很验难熟练撑握。而且不同的人写的自动化用例风格不一样,维护起来非常困难,要求测试人员必须撑握一门计算机语言,如:VB、python等。如下所示,是使用robotFramework编辑器基SeleniumLibrary库写的一个自动化测试用例。
jackey422
2019/11/29
1.7K0
kylinTOP 测试与监控平台:一款基于 AI 的软件自动化测试工具的介绍
20+最好的开源自动化测试工具
这些开源工具在自动化测试和手动测试、功能、回归、负载、性能、压力和单元测试、web、移动和桌面测试等领域提供相关的能力支持。
苦叶子
2019/05/30
9.4K0
在接口自动化测试过程中,如何开展接口自动化测试?单个模块和多个模块关联又怎么去做测试?
目前互联网产品的后端服务,基本上都是分布式部署 的,一个接口可能会调用其他接口,也有可能被其他接口调用,接口与接口之间,具有千丝万缕的依赖关系。
霍格沃兹测试开发Muller老师
2023/06/02
1.1K0
测试进阶必备,这5款http接口自动化测试工具不要太香~
现在市场上能做接口自动化测试的工具有很多,一搜一大把,让人眼花缭乱。我们去选择对应实现方式时,不管是框架体系还是成熟稳定的工具,核心目的都是期望引入的技术能在最低投入的情况下达到最优效果。
伤心的辣条
2022/09/08
1.2K0
测试进阶必备,这5款http接口自动化测试工具不要太香~
开源 | AREX:携程新一代自动化回归测试工具的设计与实现
haibing,携程研发能效经理和SRE,关注自动化测试,能效提升方向的工具技术。
携程技术
2023/09/06
1.5K0
开源 | AREX:携程新一代自动化回归测试工具的设计与实现
初识Katalon Studio自动化测试工具
实施自动化测试之前,我们总会调研哪些工具易用,免费,容易和其他工具或者框架集成。做 Web 自动化测试我们经常选择Selenium,因为它开源免费,支持不同的开发语言,还有录制功能,从一定程度上减少了测试人员开发脚本的成本;做App自动化测试我们通常选择 Appium,它也是开源免费,同时支持 Android 和 IOS 两大操作系统,支持不同的语言开发脚本,同时能测试原生和混合应用。但这两种工具需要结合其他的测试框架来管理我们的测试案例,比如Jnuit、unittes、NUnit 等,这就要求测试人员有较高的编码技能。
软测小生
2019/07/05
4.8K0
初识Katalon Studio自动化测试工具
如何选择自动化测试工具
根据当前项目和QA团队的人员能力,选择的自动化测试工具除具有使用的广泛性外,还必须考虑许多不同方面兼容性,例如项目迭代范围和需求变更。最佳工具并不能保证最佳的测试使用结果。
FunTester
2020/10/19
6120
自动化测试的理想境界:AppCrawler自动遍历工具
内容来源:2017 年 6 月 24 日,TesterHome联合创始人黄延胜在“Testwo第一届测试分享沙龙”进行《App crawler自动遍历工具》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。
IT大咖说
2018/10/23
4.2K0
自动化测试的理想境界:AppCrawler自动遍历工具
9款开源自动化测试框架!
自动化测试框架由一组最佳实践,通用工具和库组成,可帮助测试人员评估多个Web和移动应用的功能,安全性,可用性和可访问性。而在,软件开发世界中有很多的自动化测试框架,该如何选择?
测试开发技术
2021/12/13
3.7K0
9款开源自动化测试框架!
被同事安利了!贼好用的自动化测试工具!
对于一个互联网公司来说,测试人员是公司里不可缺少的一个角色。但从事软件测试的人员不计其数,每年都有很多毕业生卷入互联网的大军。如果一个测试人员的能力还只停留在点点点上,自然是会被新一代的“卷王”们淘汰的。
小林coding
2022/10/27
6300
被同事安利了!贼好用的自动化测试工具!
推荐几款常用的Mock测试工具!
模拟测试(Mock Testing)是软件测试中的一种重要技术,它的主要用途是在软件开发过程中对代码进行测试,特别适合在进行开发自测、单元测试或接口测试阶段。
测试开发技术
2023/11/30
1.4K0
推荐几款常用的Mock测试工具!
自动化测试之视觉感知测试
本文首发表于 InfoQ:http://www.infoq.com/cn/articles/visual-perception-test
TestOps
2022/04/07
8090
自动化测试之视觉感知测试
应用实践|自动化测试工具应用实践
在当前社会项目市场需求的场景下,项目需求不明确、项目根据市场需求的日益变化而频繁变更、项目时间短且需要快速交付给甲方,敏捷开发俨然成为了很多项目团队的不二之选,而在敏捷开发中,测试工作也是很重要的一个环节,只有通过测试的软件,才能交付到客户的手中。测试工作能在敏捷开发中确保软件质量,提高用户体验,减少软件应用过程中的风险,确保软件的合规使用,保持良好的客户关系担任了一个重要的角色。
六月暴雪飞梨花
2024/10/28
3070
应用实践|自动化测试工具应用实践
Windows桌面自动化测试工具:WinAppDriver
大家好,今天给大家介绍一款Windows桌面自动化测试工具:WinAppDriver。
测试开发技术
2023/09/27
4.5K0
Windows桌面自动化测试工具:WinAppDriver
推荐阅读
相关推荐
测试利器 | 一款开源的Diffy自动化测试框架:超详细实战教程讲解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验