热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hoverfly_使用Hoverfly模拟网络

hoverfly介绍信不信由你,研究人员和学生面临的最大障碍之一就是,只能访问PDF:他们甚至在阅读他们感兴趣的内容之前,都

hoverfly

介绍

信不信由你,研究人员和学生面临的最大障碍之一就是,只能访问PDF:他们甚至在阅读他们感兴趣的内容之前,都可能浪费大量的时间和大量的精力消耗兔子的洞。Kopernio是一个网站浏览器扩展程序可以简化此繁琐的过程,使他们可以将时间花在更重要的事情上。 这样,它就可以与学术网站的很大一部分进行交互:发布者页面(其中有成千上万个页面),机构登录门户以及各种PDF的开放访问源。

这不仅是一个巨大的表面积,可以提供测试覆盖范围,而且不能保证其中任何一个看起来都一样,提供可靠的服务,或者我们甚至在出现停机时间时都会事先知道。 这带来了几个问题:

  1. 如果该服务已关闭,则很难测试Kopernio与第三方服务的集成。 在完成部署周期的测试部分之前,您要么被迫跳过测试(并放弃测试),要么等待服务恢复。
  2. 如果服务的行为发生意外更改,则Kopernio可能会崩溃。 与Kopernio本身相比,对于测试而言,这不是一个大问题。
  3. 服务可能会被速率限制或列入黑名单,因为我们对其进行了过多次测试。 对第三方服务施加不必要的负担也是一种不好的形式:QA Engineering中没有“ D”,“ o”或“ S”。
  4. 我们的测试包括自动打开文章页面等。 这可能看起来像是将网页抓取到托管它们的任何主机,因此我们无法采取措施阻止这种情况(例如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



推荐阅读
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • HTML:  将文件拖拽到此区域 ... [详细]
  • 近期尝试从www.hub.sciverse.com网站通过编程手段获取数据时遇到问题,起初尝试使用WebBrowser控件进行数据抓取,但发现使用GET方法翻页时,返回的HTML代码始终相同。进一步探究后了解到,该网站的数据是通过Ajax异步加载的,可通过HTTP查看详细的JSON响应。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • Jenkins API当前未直接提供获取任务构建队列长度的功能,因此需要通过解析HTML页面来间接实现这一需求。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
author-avatar
i89379844
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有