2015-04-01 73 views
10

我们一直在使用protractor进行端到端测试。模拟连接错误

现在我们试图涵盖几个角落案例,涉及修改来自API端点请求的响应 - 对此,我们使用的是protractor-http-mock,它提供了一种易于使用的方法来用预定义的模拟替换HTTP响应。

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

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


我接受任何建议,我目前思考以下策略:

  • 看看是否有第三方的NodeJS类似protractor-http-mock
  • 模拟$http angularjs服务
  • 火了一个代理,并以某种方式控制它在测试(grunt-connect-proxy看起来相当成熟,虽然我不知道是否有可能动态改变行为代理从规范到规范
  • 在浏览器级别控制它 - 例如,与网络限制谷歌浏览器的功能(虽然我敢肯定它是一件selenium无法控制,Network throttling with chrome and selenium)(浏览器插件/扩展?)
+0

单元测试非常别致,开发人员经常过度测试。我认为你在测试中做得太过分了。我们绝对可以通过模拟丢失的连接的方式来工作,但丢失的连接应该是一个集成测试。测试丢失连接的最佳方法是手动剪切连接或停止服务器并观察结果。这不是您想要自动重复的测试,而是需要手动操作。当你的模拟/场景非常复杂,需要进行单元测试和调试时,你对单元测试过度发挥作用。 – 2015-04-04 03:32:35

+0

@DaveAlperovich好吧,这实际上是一个我们询问的(使用'量角器')的端到端集成测试(不是单元测试)。尽管如此,我接受这样的观点,即不值得付出努力。谢谢! – alecxe 2015-04-04 04:01:09

+0

良好的观察。我的语言暴露了我的偏见。我认为端到端测试是单元测试的延伸(多单元 - 乐高风格)。我假定链中的所有组件都使用可以整齐模拟的分类数据。当我们深入研究非确定性数据或环境问题时,我将其视为手动工作。 – 2015-04-04 04:08:56

回答

2

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

该项目解释了总体思路,存在与readme.md的语义和翻译问题,我很快就会着手处理,请耐心等待。请忘记我的英语/拼写错误,让我知道任何修正

我工作的这个Demo project如何实现Protractor + CucumberJS + sugar-step。现在它包含一个非常非常简单的Angular APP和3个E2E测试。

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

  • 第一测试检查针对默认服务的服务(开发 环境模拟)
  • 第二测试检查该服务请求返回与状态码404
  • 第三测试检查错误 服务请求返回错误状态代码500

如何为每个方案设置不同的模拟响应?

  • 使用黄瓜的周围功能,它可以被用来注入任何功能或方案之前,一个angular.module('mock-Service-response-x',fn...)和功能后,将其删除或场景运行时

可这有什么办法来测试?

  • 任何一种情况下,极端的延迟响应,响应任何状态代码,响应特殊的数据测试非常特殊的情况,否则将不可能/硬从一个正常的后端服务来获得,如数据不一致在后端

为什么在AngularJS中实现你的UI-Mocks,而不是使用代理?

  • UI控件采用了棱角分明,你可以做这样的事情(当然这取决于你的特殊需要):禁用ngAnimationsjQuery动画完全,模拟您的本地浏览器Date,仿效行为取决于在一个自动的日期。

  • 成本(取决于你的项目)实现本地代理的每个开发环境的所有Web服务的成本是昂贵的(在执行的硬件或努力或小时)。

  • 依赖,如果你的开发团队并行工作,它更可能从每个-其他根据,如果UI团队正在以依赖于一个X Web服务的功能,知道实现规范该项目是你的工作在UI团队可以创建简单的嘲笑,继续他的工作,使更多的可能在孔项目

所有这些参数依赖的时间交付,并在所有的,这并不意味着这是最好的解决方案,但我更赞成保持项目层互相独立,并且无论如何都可以在一层中发布新功能如果其他图层延迟了他自己的新功能。

为了任何人谁读这一点,任何评论,修正或建议将超过欢迎

+0

谢谢你的回答。我们目前使用'量角器-http-mock'来模拟'404'和'500'服务器错误,但需要模拟连接错误 - 没有在您提到的项目中找到一个示例.. – alecxe 2015-04-08 14:08:02

+0

我发布的项目没有' t实现该场景,但请检查[此文件](https://github.com/thematho/cucumberjs-and-mock-e2e-demo/blob/master/test/e2e/features/mocks/authentication-service-模拟e2e.js)。 (你可以使用'量角器-http-mock'作为量角器在UI上自动测试吗?我认为只对karma测试有用) – Matho 2015-04-08 14:25:41

+0

“连接错误”你是什么意思? ** 444无回应**或** 499客户关闭请求** 或者您正在讨论的服务从不回应? 如果是第一种情况,唯一要做的就是更改返回的状态码。 如果是第二种情况,是简单的只需要做的就是: '$ httpBackend.whenPOST('/ services/login')。respond(function(){ //永远不会返回,所以客户端会等待直到检测到任何超时后退 });' – Matho 2015-04-08 14:25:52

1

这也取决于如何去做到这一点?它应该以编程方式?

如果是最好的解决办法是代理依赖,最好的工具,可以与所有的硒/ webdriver的工具是browserMobProxy使用,

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

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

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

3

好像康卡斯特工具将提供你需要的大部分功能:

康卡斯特一种设计用于模拟常见网络问题的工具,如 延迟,带宽限制以及丢弃/重新排序/损坏的 数据包。

它通过以便携式(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%的需要。

+0

哈哈,好名字,_Simulating s **** y网络连接,使您可以建立更好的系统._ – lyjackal 2015-04-09 02:29:57

+0

这个库规则的名称。 – looshi 2015-10-24 16:06:18

1

Facebook上有一种工具称为ATC(一种模拟网络条件的工具)。

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

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

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