什么是Diffy?Diffy是一个开源的自动化测试工具,也是一种Diff测试技术。它可以自动检测基于ApacheThrift或基于HTTP的服务。通过同时运行新/旧代码,比较运行结果并发现潜在的错误。使用Diffy,只需要简单的配置,之后就不需要再写测试代码了。1、Diffy主要解决什么问题?一个项目从第一个版本的发布,到一个比较完整的版本,再到后期的大更新甚至重构,都需要经过多次迭代。随着项目的迭代和产品功能的不断增加,项目会越来越复杂。后期每次修改增加的功能比上一版本已有功能的比例越来越小。但是对于每一次大版本或者小版本的升级,我们都需要保证新的或者修改的功能不会影响到之前版本已有的功能。但要做到这一点是非常困难的。哪怕只改动一行代码,即使这个改动是非常优秀的开发者做的,我们也很难保证这个功能不会对之前版本的功能造成任何影响。为了保证每次上线的安全性,我们需要开发和测试来完成两项任务。一种是开发者在增加或改变一个新的功能后,补充相应的测试用例,但是写过单元测试的同学都知道,完成一个单元测试用例的时间可能比完成相应的功能要多很多。大多数情况下只能写出几个核心测试用例,在人员和时间紧迫的情况下更是难上加难。后期因为功能不断增加,回归测试的工作量越来越大。同时,因为是回归,一个问题可能在几百个甚至几千个用例中都找不到,甚至一个也找不到。最后的回报是不成比例的。另外,测试人员在重复测试相同的内容时会感到疲倦,这会给测试人员带来负面情绪。当真的有问题的时候(尤其是复杂的数据问题),也可能是由于这个原因而忽略了问题而疲惫不堪(如果一个用例测试了10次都没有问题,当进行第11次测试时,心脏可能默认这个地方没问题)。这时候一些测试人员可能会考虑做自动化测试,但是自动化测试的初期成本比较高,对测试人员的要求也比较高。如果项目变化频繁,一些自动化测试可能需要重新设计,这会带来更高的成本。Diffy为上述问题提供了更好的解决方案。它不同于其他常用的测试工具或框架来验证代码或接口返回结果的正确性,而是顾名思义:通过代码的差异来验证测试。需要说明的是,既然是区别,至少两者是有区别的。第一行代码或者新函数无法对比,自然无法验证。这时候diffy就不能发挥作用了。但是在后续的增改的循环中,以及项目的不断迭代中,diffy可以发挥它的作用。有了上一个版本以及测试人员在上一个版本中的测试工作的基础,我们将上一个版本和当前版本进行比较。不同之处。2、diffy适用场景①、场景验证:比如某接口返回的数据中的“name”字段从user数据库表更改为mobile_user数据库表,那么从接口来看,通过比较该接口的新旧版本代码可以了解其字段的基本正确性和区别。②.提高回归效率:就一般的接口测试而言,每次代码迭代除了测试新接口外,还包括对旧接口的回归。如果采用人工回归,随着接口数量的增加,测试人员的工作量也会线性增加,效率会大大降低。通过diff测试,可以发现同一接口下内部代码逻辑变化对其输出的影响。测试人员只需要比较diff接口之间的差异(或自动比较),从而大大减少了手工工作的工作量。3.比较一般的操作流程①。新旧代码分开部署:旧代码为线上稳定版,新代码为新迭代测试版。②构建测试数据:我们可以手动构建测试数据,也可以对在线数据进行采样进行diff测试。③.运行测试:使用测试数据分别在新旧代码中运行,抓取测试结果。④.结果对比:对比新旧代码,相同界面下的输出,如果有差异,可以通过界面反向定位问题。4.Diffy的工作原理在测试过程中,Diffy作为一个代理,可以将源码请求分发到不同版本的系统,通过比较各个版本系统的输出结果得出最终结论。Diffy需要三个版本的系统来实现它的噪声过滤和比较功能,分别是:候选版本:这个版本是要测试的版本,比生产环境版本的代码更新。稳定版:这个版本一般是已经上线的版本,或者已知可以正常运行的版本。稳定版副本:该版本是稳定版的副本,运行与稳定版相同的代码,主要是为了消噪。整个运行过程如下:如图所示,diffy可以比较primary(在线稳定版)和secondary(在线稳定版备份)的差值,通过减去这些差值来消除噪声;通过比较候选(测试版)和主要(在线稳定版)得到基本的差异结果;最后,将基本的diff结果与去噪后的结果进行比较,得到最终的diff结果。其中:原始差异是候选版本和稳定版本输出的差异,可能包含上述噪声。噪音是从稳定版和它的副本中获取的,如果运行相同代码的两个系统有相同的输入但不同的输出,Diffy会认为这是开发者不需要关心的噪音。基于以上两组差异,Diffy可以识别候选版本和稳定版本之间的真正差异,这很可能是缺陷。当然,对于一个概率出现的随机值,仅仅一个请求的结论可能是不准确的。例如,对于一个有50%概率为true或false的布尔值,候选版本有50%的概率与稳定版本不同,同时有50%的概率是稳定版本版本将不同于它的副本(即,这个值被识别为噪声),最终有25%的概率这是一个缺陷。因为此时stableversion和它的replica有相同的值,candidateversion和stableversion有不同的值。因此,Diffy也会聚合原始的差异和噪声,当发现两者出现的概率相似时,就会判定之前识别出的缺陷是误报。五、Diffy的安装与使用1.克隆代码,构建并下载diffy-server。也可以在github上下载源码编译twitter/diffy。diffy是twitter使用scala语言开发的一个项目。安装完jdk之后,还需要安装scala和sbt(类似maven), 另外,需要从twitter下载一些jar包,可能需要vpn。2.例如在localhost:9990部署primary(在线稳定版)代码。3、比如在localhost:9991部署二级(在线稳定版备份)代码。4.例如将候选(测试版)代码部署到localhost:9992。5、下载jar包后,可以直接通过java命令启动diff服务:各参数详细说明:需要注意的是,为了防止测试对数据造成不必要的影响,diffy只支持读取默认情况下,即不会转发Post和DeleteData等待请求的影响。如果需要支持此类请求,则需要添加参数。命令模板(根据实际情况修改参数值即可)6.向diffy发送一些请求,在http://localhost:8888查看结果。结果显示如下图所示。我们可以看到每个请求都在不同的节点上,如果点击“ExcludeNoise”,就可以消除噪音,看到最终的diff结果。7.总结以上对diffy做了一些基本的介绍和使用指南。将diffy与gor、nginx或filter结合使用还可以扩展许多其他测试实践。gor的介绍和使用可以参考:推荐一款简单易用的在线引流测试工具:GoReplay,diffy的更多高级用法,欢迎自行探索。
