模拟连接错误

时间:2015-04-01 04:05:13

标签: javascript angularjs testing selenium protractor

我们一直在使用protractor进行端到端测试。

现在我们正在尝试涵盖几个极端情况,其中涉及修改API端点请求的响应 - 为此我们使用protractor-http-mock提供了一种易于使用的方法来替换HTTP响应定义了模拟。

但是,如果我们想测试突然连接丢失发生时的情况,该怎么办?在这种情况下我们有什么选择?

换句话说,我们希望实现一种情况,即对特定端点的请求会产生网络连接错误并查看我们的应用程序将如何反应。


我对任何建议持开放态度,我目前正在考虑以下策略:

  • 查看是否存在类似于protractor-http-mock
  • 的第三方nodejs库
  • mock $http angularjs service
  • 启动代理并在测试期间以某种方式控制它(grunt-connect-proxy看起来相当成熟,但我不确定是否有可能动态地将代理的行为从规范更改为规范
  • 在浏览器级别控制它 - 例如使用网络限制谷歌浏览器功能(虽然我很确定它是selenium无法控制的,Network throttling with chrome and selenium)(浏览器插件/扩展名?)

4 个答案:

答案 0 :(得分:3)

似乎 Comcast 工具可以提供您需要的大部分功能:

  

Comcast是一种旨在模拟常见网络问题的工具   延迟,带宽限制以及丢弃/重新排序/损坏   分组。

     

它通过以便携式(ish)方式包装一些系统工具来工作。上   BSD派生的系统,如OSX,我们使用像ipfw和pfctl这样的工具   注入失败。在Linux上,我们使用iptables和tc。康卡斯特只是一个   围绕这些控件的薄包装。

https://github.com/tylertreat/Comcast

Linux上的示例:

comcast --device=eth0 --latency=250 --target-bw=1000 --default-bw=1000000 --packet-loss=10% --target-addr=8.8.8.8,10.0.0.0/24 --target-proto=tcp,udp,icmp --target-port=80,22,1000:2000

您可以随时更改设置,并根据需要将丢包率降至100%。

答案 1 :(得分:2)

我希望这可以帮助您定义实现模拟的最佳方法。

该项目解释了一般的想法,readme.md存在语义和翻译问题,我很快就会耐心等待。请忘记我的英语/拼写错误让我知道任何更正

我正在研究如何实施Demo project + Protractor + CucumberJSsugar-step。现在它包含一个非常简单的Angular APP和3个E2E测试。

该演示正在运行,但尚未完成,仍然需要一些我认为对E2E测试有用的功能。

  • 第一个测试针对默认服务检查服务(Dev 环境模拟)
  • 第二次测试检查服务请求是否返回错误 状态码为404
  • 第三次测试检查服务请求是否返回状态码为500的错误

如何为每个场景设置不同的模拟响应?

  • 使用Cucumber的周围功能,可用于在任何功能或方案之前注入angular.module('mock-Service-response-x',fn...),并在功能或方案运行后将其删除

可以通过这种方式测试什么?

  • 任何类型的场景,具有极端延迟的响应,响应任何状态码,响应特殊数据以用于测试非常特定的场景,否则将无法/难以从正常的后端服务获得,例如背面的数据不一致 - 端

为什么要在AngularJS中实现UI模拟,而不是在代理中实现?

  • UI控件(当然,根据您的特定需求)使用Angular,您可以执行以下操作:禁用ngAnimations或{{1完全动画,模拟您的本地浏览器jQuery,以模拟自动依赖日期的行为。

  • 费用(取决于您的项目)在每个开发环境中为所有Web服务实施本地代理的成本可能很高(在硬件中)或努力或数小时的实施)。

  • 依赖,如果您的开发团队并行工作,如果UI团队正在使用依赖的功能,那么它更可能依赖于彼此在X Web服务上,了解实施规范,UI团队可以创建简单的模拟以继续他的工作,使更多可能的井项目按时交付

所有这些论点都取决于你正在研究哪个项目,并不意味着这是最好的解决方案,但我更赞成保持项目层彼此独立,并且能够在一个图层中释放新功能,无论其他图层是否在他自己的新功能中被延迟。

对于任何阅读此内容的人,任何评论,更正或建议都将受到欢迎

答案 2 :(得分:1)

这还取决于如何做到这一点?应该以编程方式吗?

如果是这样,最好的解决方案是代理依赖,最好的工具可以用于所有selenium / webdriver工具是browserMobProxy,

如果你想从外面做,我建议也使用任何外部流量整形器/代理。例如:http://vaurien.readthedocs.org/en/1.8/

vaurien --protocol http --proxy nonexistingproxy.com:8000 --backend website.com:80

为什么不能使用9n0浏览器功能?首先,您需要重新加载页面才能看到它们的运行情况,其次,您不会重新定义量角器中的代理设置。 至于插件,以编程方式与它们进行交互并不那么容易,我认为没有任何好处,而你应该为不同的浏览器附加很多。

答案 3 :(得分:1)

Facebook有一个名为ATC的工具(一种模拟网络状况的工具)。

它允许您控制网络中的带宽,延迟,数据包丢失和数据包损坏率。

由于它是开源的,我认为你可以扩展功能,以便使用不同的"错误"配置文件,或设置与Webdriver的集成。

您可以找到有关ATC here的一般信息。 ATC github repo是here