hoverfly
介绍
信不信由你,研究人员和学生面临的最大障碍之一就是,只能访问PDF:他们甚至在阅读他们感兴趣的内容之前,都可能浪费大量的时间和大量的精力消耗兔子的洞。Kopernio是一个网站浏览器扩展程序可以简化此繁琐的过程,使他们可以将时间花在更重要的事情上。 这样,它就可以与学术网站的很大一部分进行交互:发布者页面(其中有成千上万个页面),机构登录门户以及各种PDF的开放访问源。
这不仅是一个巨大的表面积,可以提供测试覆盖范围,而且不能保证其中任何一个看起来都一样,提供可靠的服务,或者我们甚至在出现停机时间时都会事先知道。 这带来了几个问题:
- 如果该服务已关闭,则很难测试Kopernio与第三方服务的集成。 在完成部署周期的测试部分之前,您要么被迫跳过测试(并放弃测试),要么等待服务恢复。
- 如果服务的行为发生意外更改,则Kopernio可能会崩溃。 与Kopernio本身相比,对于测试而言,这不是一个大问题。
- 服务可能会被速率限制或列入黑名单,因为我们对其进行了过多次测试。 对第三方服务施加不必要的负担也是一种不好的形式:QA Engineering中没有“ D”,“ o”或“ S”。
- 我们的测试包括自动打开文章页面等。 这可能看起来像是将网页抓取到托管它们的任何主机,因此我们无法采取措施阻止这种情况(例如CAPTCHA)。 我们还需要确保Kopernio在所有方面都符合COUNTER 。
1、3和4使我作为测试工程师的工作更加艰难。 如果只有一种方法可以通过记录我们从它们那里获得的响应来保持这些服务不变,那么就可以在我们需要的任何时候重播它们而无需接触互联网。 如果我们有一个预先记录的较旧版本的网站或API来运行测试,以与使用真实版本的结果进行比较,那么即使是第二个也更容易调试。
输入飞翔者
Hoverfly是用于模拟API的工具,它具有两种风格:基于云的解决方案和用Go编写的独立HTTP服务器。 后者是我用来测试Kopernio的工具,因此我将深入探讨。 广义上讲,它接受HTTP请求,并且可以使用对原始接收者(类似于代理服务器)的请求做出响应,也可以发送自己的可以配置的罐装响应。 它的功能由三种模式封装:
1.捕获-Hoverfly将充当代理服务器,并记录每个请求以及目标的响应。 这些请求-响应对可以随时以JSON格式导出为“模拟”。 这是一个简化的示例:
{"data" : {"pairs" : [{"request" : {"path" : [{"matcher" : "exact" ,"value" : "/r/bouldering"}],"method" : [{"matcher" : "exact" ,"value" : "GET"}],"destination" : [{"matcher" : "exact" ,"value" : "reddit.com"}]"scheme" : [{"matcher" : "exact" ,"value" : "http"}]},"response" : {"encodedBody" : true ,"status" : 502 ,"body" : "foo" ,"templated" : false ,"headers" : {"Access-Control-Allow-Origin" : ["*"]}}}]}
}
在这种模式下,您可以指定要记录的请求标头。 导出模拟后,您可以根据需要添加,删除或修改任何字段。
2.模拟-Hoverfly将基于在导入的模拟文件中找到的请求-响应对,尝试将任何入站请求与响应进行匹配。 规则是,要成功匹配,所有JSON字段都必须匹配。 这意味着您忽略的字段越多,匹配将越宽松(反之亦然)。
如果无法匹配请求,则Hoverfly将返回502错误,并显示一条消息,其中包含最接近的匹配对。 注意:没有什么可以阻止您在不导入模拟的情况下运行此模式,但这会导致每个请求都引发错误。
大致来说,还有一个“有状态”选项,它与请求的顺序以及内容相匹配。 这意味着,如果在模拟过程中未看到请求的唯一匹配项,则Hoverfly仍会发送错误。
3.间谍-类似于“模拟”,但任何无法匹配的请求都将中继到远程目标,而Hoverfly的行为将类似于代理服务器。 在我们的案例中,这确实很有用,因为该插件向后端发出请求,这是必不可少的集成测试,不应以任何方式进行模拟。
使用hoverctl
CLI工具,进行快速概念验证的设置非常简单:
hoverctl start
开始启动Hoverfly监听端口8500, hoverctl mode
设置模式, hoverctl
用于加载/创建模拟文件。 在后台,这会将HTTP请求发送到Hoverfly服务器的REST API,可以代替使用-如果要使用自定义配置(例如,使用非标准端口)运行Hoverfly,则这是必需的。
Hoverfly的API文档不完整,但您可以使用诸如Wireshark之类的网络流量监视工具来反向工程差距,以查看hoverctl
发送的请求。
在Kopernio使用
我们有一个测试,它会打开一个开放访问文章页面,以验证该插件可以检索PDF并将其显示给用户。 首次运行时,我们将Hoverfly设置为捕获模式,以记录来自网站的真实响应。 如果测试通过,我们将导出模拟。 如果没有,我们再试一次。
此后,只要测试再次运行,我们就会导入仿真,并且在打开文章页面时,它将获得原始记录的响应。 该网站可能会因为我们所关心的一切而倒闭,或者为该特定文章(该Kopernio可以提供帮助,但更改了测试的参数)抛出了付费壁垒,但Hoverfly每次仍会提供完全相同的网页。 确实,我们在测试期间使用的一项外部服务在一个星期五下午变得不可用,直到我尝试在测试之外访问它之前,我什至没有注意到,因为Hoverfly在测试运行期间完全是伪造的。
如果您已经准备好模拟,那么它甚至不需要互联网连接就具有额外的好处! 如果您在伦敦地铁上做一些工作,非常方便。
相反,我们也可以使用Hoverfly来按需模拟服务中断,以测试Kopernio如何处理这些中断。 这需要更多的思考,但可以归结为从头开始制作JSON或修改现有的模拟以将200个状态代码更改为50倍。
我们还进行了涉及插件向公共API发出请求的测试。 此测试有两种版本:一种接收真实的响应,另一种从Hoverfly接收模拟的响应。 如果后者成功但前者失败而没有任何明显的服务器错误,则表明该API已更改,我们需要相应地更新代码。
Hoverfly还可以兼作网络监视工具:它存储包含所有请求和响应的“新闻”。 即使测试不使用模拟,我们也将Hoverfly设置为间谍模式并建立网络日志。 为此,还有其他基于代理的解决方案可能会更适合,但是不必链接代理并使事情保持简单就很好。
更重要的是,这是一个与平台无关的解决方案:我们已经针对Firefox和Chrome进行了测试,但是截至撰写本文时,仅前者提供的网络日志涵盖了网页和浏览器扩展活动。
注意事项
如前所述,确保我们模拟对某些服务的请求很重要,但是如果匹配由于任何原因而失败并且我们处于间谍模式,Hoverfly将以静默方式代理请求,这有点问题。 我们想要的最后一件事是在假设请求永远不会到达真实网站的前提下,通过运行1000次测试来意外地向该网站发送垃圾邮件!
Hoverfly会在其服务的所有响应上设置一个“ Hoverfly”标头,无论其来源如何,但了解给定的响应是来自模拟还是真实的对第三方的请求通常很有用。 我们采用的解决方案是修改仿真,使其包含代理响应所没有的额外标题。 然后我们可以在日志中查找该标题。
如果您在模拟中记录COOKIE,则请求匹配逻辑可能会很脆弱:如果一个网站有一些Javascript,每次加载页面时,Javascript都会设置不同Javascript,则这意味着来自浏览器的任何请求都无法匹配,因为COOKIE是不同的到第一次创建模拟时使用的那个。 在我们的测试中,如果模拟仍然有用,则可以通过编辑模拟以忽略COOKIE来解决此问题。
结论
在为Kopernio编写测试以确保我们不引入针对外部服务的回归时,Hoverfly已成为我军械库中必不可少的工具。 随着我们与越来越多的用户接触,该表面积只会增加,因此,我很高兴能早日发现它。 这里没有涉及到一些很酷的功能,例如在响应之前引入延迟的功能。
如果您有兴趣了解如何将Hoverfly集成到测试中,请下载并安装我们在自己的框架中使用的pytest插件 :它提供了本文中提到的其他功能(例如添加用于确定响应来源的其他标头)。
对于其他用法,请转至Hoverfly 令人印象深刻的文档 ,然后亲自尝试-或联系 !
翻译自: https://hackernoon.com/using-hoverfly-to-mock-out-the-web-s3433ycw
hoverfly