热门标签 | 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



推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
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社区 版权所有