Diffy:不编写测试的测试服务
发布日期:2021-06-22 02:07:30 浏览次数:8 分类:技术文章

本文共 1986 字,大约阅读时间需要 6 分钟。

Diffy,这是一个开源工具,可以自动捕捉Apache Thrift和基于http的服务中的bug。它需要最少的设置,并且能够捕获bug,而不需要开发人员编写许多测试。

像我们的平台这样的面向服务的体系结构可以看到大量的服务以非常快的速度发展。随着每次提交都添加新特性,现有的代码每天都不可避免地要进行修改——开发人员可能会怀疑它们是否破坏了某些东西。单元测试提供了一些信心,但是编写好的测试可能比编写代码本身花费更多的时间。更重要的是,单元测试可以覆盖范围很窄的一小段代码,但是不能处理由多个代码段组成的系统的聚合行为。

每个独立的代码路径都需要自己的测试。

随着系统的复杂性不断增加,使用手写测试来获得充分的覆盖很快就变得不可能,并且需要更高级的自动化技术,这需要开发人员付出最少的努力。困难是我们使用的一种方法。

Diffy 是什么?

Diffy通过并行运行新旧代码的实例来发现服务中的潜在bug。它的行为就像一个代理,并将它接收到的任何请求多播到每个运行的实例。然后,它比较这些响应,并报告从这些比较中出现的任何回归。

区别的前提是,如果服务的两个实现对于足够大且不同的请求集返回“相似”的响应,那么这两个实现可以被视为等效的,并且新的实现是无后退的。

我们使用“相似”而不是“相同”的语言,因为响应可能容易产生大量噪声,从而使响应数据结构的某些部分不确定。例如:

  • 服务器生成的时间戳嵌入到响应中
  • 在代码中使用随机生成器
  • 下游服务提供的实时数据中的竞态条件

所有这些都产生了自动消除噪音的强烈需求。对于开发人员来说,嘈杂的结果是无用的,因为试图手动地将真实的回归与嘈杂区分开就像大海捞针一样。Diffy新颖的噪声消除技术使其有别于其他基于比较的回归分析工具。

Diffy是如何工作的?

Diffy作为一个代理,接收来自您所提供的任何源的请求,并将这些请求中的每一个多播到三个不同的服务实例:

  1. 运行新代码的候选实例
  2. 一个运行您上次知道的好代码的主实例
  3. 运行与主实例相同的已知好代码的辅助实例

下图说明了Diffy是如何运作的:

diffy如何工作

当Diffy接受到一个请求,它向候选实例、主实例和辅助实例发送相同的请求。当这些服务发送回响应时,Diffy会比较这些响应,并寻找两种情况:

  1. 在候选实例和主要实例之间观察到的原始差异。
  2. 在主实例和次实例之间观察到的不确定性噪声。由于这两个实例都在运行已知的好代码,所以理想情况下,响应应该是相同的。然而,对于大多数实际服务,我们观察到响应的某些部分最终是不同的,并表现出不确定性行为。

这些差异可能不会在每个请求的基础上一致显示。假设在响应中嵌入一个随机布尔值。有50%的几率布尔值在主节点和次节点上是相同的,50%的几率候选节点的值与主节点不同。这意味着25%的请求将触发错误错误并导致噪音。基于这个原因,Diffy查看了迄今为止所有请求中每种类型错误的聚合频率。难易度衡量的是初级和中级学生之间意见不一致的频率与初级和候选d学生意见不一致的频率。

入门指南

下面是您如何开始使用Diffy来比较您的服务的三个实例:

  1. 将旧代码部署到localhost:9990。这是你的上一版本1。
  2. 将旧代码部署到localhost:9991。这是你的上一版本2。
  3. 将新代码部署到localhost:9992。这是你的当前版本。
  4.  使用命令 “./sbt assembly” 构建diffy jar
  5. 从Diffy目录运行Diffy jar命令:

java -jar./target/scala-2.11/diffy-server.jar \

-candidate="localhost:9992" \
-master.primary="localhost:9990" \
-master.secondary="localhost:9991" \
-service.protocol="http" \
-serviceName="My Service" \
-proxy.port=:31900 \
-admin.port=:31159 \
-http.port=:31149 \
-rootUrl=’localhost:31149’

6.     向您的Diffy实例发送几个测试请求:

curl localhost:31900/your_application_route

7.注意在localhost:31149浏览器中显示的差异。你应该看到这样的东西:

8.您还可以看到触发该行为的完整请求以及来自primary和candidate的完整响应:

访问Github repo获取更详细的说明和示例。

作为工程师,我们都希望专注于快速生产和运输产品。Diffy通过跟踪潜在的bug帮助我们做到这一点。我们希望您能像我们一样从这个项目中获益,并帮助我们不断改进。

转载地址:https://blog.csdn.net/qq_18659137/article/details/85280631 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:scala 安装
下一篇:【Katalon学习一】Katalon Studio入门指南

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月23日 00时35分30秒