Diffy是什么
Diffy是一个开源的自动化测试工具,是一种Diff测试技术。它能够自动检测基于Apache Thrift或者基于HTTP的服务。通过同时运行新/老代码,对比运行结果,发现潜在bug。使用Diffy,只需要进行简单的配置,之后不需要再编写测试代码。
Diffy工作原理
在测试过程中,Diffy充当一个代理,它能够将来源请求分发到不同版本的系统中去,通过对各个版本系统的输出进行对比,做出最终的结论。
Diffy需要三个版本的系统,以实现它的噪声过滤和对比功能,它们分别是:
候选版本:该版本是待测版本,相对于生产环境版本有着更新的代码。
稳定版本:该版本通常是已经上线版本,或者是已知功能正常的版本。
稳定版本副本:该版本是稳定版本的副本,和稳定版本运行相同的代码,主要用于排除噪声。
整个运行流程为:
如图所示,diffy能够比较primary(线上稳定版本)和secondary(线上稳定版本备份)的差异值,通过对这些差异值做减法来消除噪声;通过比较candidate(测试版本)和primary(线上稳定版本)得到基本的diff结果;最后通过比对基本的diff结果与消除噪声后的结果,得到最终的diff结果。
其中:
- 原始区别为候选版本和稳定版本之间输出的区别,其中可能会包含上述的噪声。
- 噪声从稳定版本和其副本中获得,如果两个运行相同代码的系统输入相同输出却不同,则Diffy会认为这是开发人员不需要关心的噪声。
基于上述两个区别集合,Diffy可以识别出候选版本和稳定版本真实的区别,这些区别很有可能就是一个缺陷。
当然,对于一个概率性出现随机值,仅仅一次请求的结论可能是不准确的。例如对于一个50%概率出现true或者false的布尔值,则有50%的概率会出现候选版本和稳定版本的不同,同时又会有50%的概率出现稳定版本和其副本出现不同(即将这个值认定为噪声),最终会有25%的概率认为这是一个缺陷。因为此时稳定版本和其副本值相同,候选版本和稳定版本值不同。因此,Diffy还会聚合原始区别和噪声,当发现二者出现的概率类似的时候,会认定之前识别出来的缺陷属于误报。
Diffy安装、使用
1.拉取镜像
Diffy镜像
sudo docker pull diffy/diffy
example镜像
sudo docker pull diffy/example-service: production
sudo docker pull diffy/example-service: candidate
2.启动Diffy
sudo docker run -d --name diffy-01 \
-p 8880:8880 -p 8881:8881 -p 8888:8888 \
diffy/diffy \
-candidate=172.19.0.222:9992 \
-master.primary=172.19.0.222:9990 \
-master.secondary=172.19.0.222:9991 \
-responseMode=\'primary\' \
-service.protocol=http \
-serviceName="signature-Service" \
-proxy.port=:8880 \
-admin.port=:8881 \
-http.port=:8888 \
-rootUrl=172.19.0.222:8888 \
-summary.email=\'ll@xxx.com\' \
-summary.delay="5" \
-allowHttpSideEffects=true
各参数详细说明:
candidate=172.19.0.222:9200\' (待上线版本部署地址) 这个ip可以用localhost,只是部署机器不是本机,要从本机访问才写上了ip
master.primary=172.19.0.222:9000\' (已上线版本地址1)
master.secondary=172.19.0.222:9100\' (已上线版本地址2)
service.protocol=\'http\' (http协议或https)
serviceName=\' signature-Service \' (服务名称,无影响)
proxy.port=:8880 (diffy代理端口,所以请求都应从这个端口访问)
admin.port=:8881 ( 通过http:// 172.19.0.222:8881/admin可以查看请求状况)
http.port=:8888 (查看界面,在这里可以比较差异)
rootUrl=172.19.0.222:8888\' (同上)
responseMode=primary (代理服务器是否返回结果,默认(empty)无返回,可指定primary返回线上版本,secondary(同线上版本,用于噪音消除),candidate(待测试版本)
excludeHttpHeadersComparison=false (是否排除header的差异,不同服务器,cookie,nginx版本可能有所差异,设置为true可以忽略这些差异)
notifications.targetEmail=ll@xxx.com (对差异发送到指定邮箱)
需要注意的是,为了防止测试对数据造成不必要的影响,diffy默认只支持读,即Post及Delete影响数据的等请求不会转发,如果需要支持这样的请求,需要增加参数。
allowHttpSideEffects=true
3.启动Example
sudo docker run -d --name exd-primary -p 9990:5000 diffy/example-service:production
sudo docker run -d --name exd-secondary -p 9991:5000 diffy/example-service:production
sudo docker run -d --name exd-candidate -p 9992:5000 diffy/example-service:candidate
4.对diffy发一些请求
sudo curl -s -i -H Canonical-Resource : endpoint-test http://localhost:8880/success?value=happy-tester
sudo curl -s -i -H Canonical-Resource : endpoint-test http://localhost:8880/noise?value=happy-tester
sudo curl -s -i -H Canonical-Resource : endpoint-test http://localhost:8880/regression?value=happy-tester
sudo curl -s -i -H Canonical-Resource : endpoint-test http://localhost:8880/noisy_regression?value=happy-tester
5.在http://172.19.0.222:8888中检查结果,结果展示如下图
如图所示,我们可以看到每个请求在不同节点上的差异之处,如果点击“Exclude Noise”,则可以消除噪声,看到最终的diff结果。
小结
上述对diffy作了一些基本的介绍和使用引导,利用diffy结合gor及nginx或filter等手段还可以扩展很多其它的测试实践。关于gor的介绍和用法可查阅:推荐一款简单易用线上引流测试工具:GoReplay,diffy更多高级用法,欢迎大家自行探索。
内容出处:,
声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/soft/14215.html