其他测试框架 GTAC2015 之利用 Twitter Diffy 工具解决回归测试问题

思寒_seveniruby · 2015年12月20日 · 最后由 zheng 回复于 2018年12月22日 · 3392 次阅读

topic

https://docs.google.com/presentation/d/1KITWbK46rm-lDZce_SqxegHTPjc9Ez-broxDTpfBpK8/pub?slide=id.gd8cf2c7b7_0_0
topic 名字是在 twitter 服务之间测试集成, 实际内容讲的是 diffy 工具.
我已经看这个工具的源代码 2 个月了. 所以对这个 topic 很感兴趣.

内容解读

研发修改了一小块的代码, 如何保证整个产品的正确性?
如果软件从开头修改了一个简单的分支, 那么它在下游的调用函数那里可能会带来一场规模庞大的蝴蝶效应.
做好单测是很好的保证手段, 但是单测的断言并不能做到全部功能覆盖. 它只能保证软件在修改前后的"基本正确"

diffy 开启了一个新的时代, 直接通过真实的使用场景来驱动, 并严格对比每个场景.
做法如下

  • 抽样线上的流量并引流
  • 在新版本, 老版本和参考版本三者中同时发送请求并获得相应
  • 通过三者数据来进行对比.参考版本的数据用于降噪. 新老版本的对比是核心

个人经验

因为我最近在研究这个工具, 说下我对这个工具的看法吧.
优点

  • 使用了 twitter 的一个框架 finagle 可以对流量进行多播. 代码很简单. 这个做的很 cool, 这点类似 gor 和 tcpcopy, 但是更简单
  • 引入参考版本这个概念用于降噪有效解决了误报.
  • 数据对比方面. 他把 xml json html 和 protobuf 协议都进行了解析并生成一个树形结构. 然后对比每个子节点的值. 这样的 diff 很精准

缺点

  • 一般公司都搭建不起来三套环境. 做法就是把参考版本的地址可以用老版本代替. 可以节省下一套环境.
  • 适合纯读的请求, 如果是有读写. 需要确保这几套环境的数据也要是一致和独立的. 所以这点也不容易, 至少在我们公司是行不通的
  • Diffy 在发送请求后并不返回某个版本的响应. 所以你不能把接口测试用例直接用上, 还得再搭建一层 Gor 工具或者 TcpCopy,

我最后的解决方案是通过了跑接口测试, 保存下针对不同环境的请求数据, 然后对比. 这样不再是多播多个环境. 也可以保存历史数据作为对比基准.
我也一直在研究 diffy. 试图改进它.

topic 精华

软件的复杂度在一定条件是很难通过单测来真正的保证的. 或者付出的成本会越大.

Diff 的架构设计

测试结果

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 9 条回复 时间 点赞

看着很不错的样子,赞一下,去了解一下

看过源码的视野果然不同

确实很好的框架,这个去除噪音干扰的设计很赞。

4楼 已删除

我最近才在看这个,想在本地把它的 sample run 起来,但是遇到了点问题,能加个号讨论么?

您好,想问下

Diffy在发送请求后并不返回某个版本的响应. 所以你不能把接口测试用例直接用上, 还得再搭建一层Gor工具或者TcpCopy

这句话是啥意思?为什么得把接口数据复制下来呢? 直接去请求那三套(或者两套)环境的数据,然后再去 web 界面看有哪些接口的返回值不一样,就行了呀、这是我的理解。。请赐教。。

第二个点, 如果都是读的请求,把流量直接复制下来,然后再去请求,那我直接每次用相同的参数去请求,然后对比我存储的返回数据就可以了呀。那这个时候用 diffy 的意义在哪里呢?

Droid roll 回复

这是场景相关的 他们那样做是节省了数据构造 用真实的线上数据做测试 你提的办法是测试数据自己构造 很明显线上数据覆盖度更高 也没有数据构造的成本

哦哦 明白了。确实线上的数据覆盖度更高一些。 所以才要拉下来放到测试环境里面去。那对于需要登录态的请求,就需要自己在测试环境做一层处理了。

Post 方法有什么好的回归方法吗,保证不污染数据的

最近刚接触这个工具,有一点没搞明白:它是怎么部署服务的?我们通常测试是把测试服务部署在一台测试机上,比如 10.xxx.xxx.AAA 上,那 diffy 怎么把请求分到这个机器上呢?怎么把 diffy 关联到测试机上呢?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册