模拟连接错误

10

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

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

但是,如果我们想测试突然出现网络连接中断的情况怎么办?在这种情况下我们可以采用以下策略:

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


我愿意听取任何建议,我目前正在考虑以下策略:

  • 查看是否有类似于protractor-http-mock的第三方nodejs库
  • mock $http angularjs服务
  • 启动代理并在测试期间以某种方式控制它(grunt-connect-proxy看起来非常成熟,但我不确定是否可能从规范到规范动态更改代理的行为
  • 在浏览器级别上进行控制 - 例如使用Google Chrome的网络限制功能(尽管我非常确定这是selenium无法控制的,使用Chrome和Selenium进行网络调节)(浏览器插件/扩展程序?)

@DaveAlperovich 嗯,这实际上是一个端到端的集成测试(不是单元测试),我们正在讨论的是使用 protractor。尽管如此,我认同这可能不值得努力。谢谢! - alecxe
@DaveAlperovich 我理解你的观点,很有道理 - 实际上有人告诉过我有时候测试过度了。我知道我不可能覆盖每一个可能出现的环境+连接+性能等问题的组合,但至少我想知道是否有一种自动化的方式来检查它 - 至少我会覆盖应用程序的关键部分。虽然这次对话可能没有什么进展,但我喜欢讨论这些哲学性的话题,比如端到端测试的终点在哪里 :) - alecxe
1
看一下 sinon FakeXMLHttpRequest。你需要实现一个模拟服务器响应,这是一项投资,而且它是事务性的,所以从理想测试的角度来看,它不足之处在于你最好希望有随机数量的事务或随机时间范围。但是,这是我能想到的最好的模拟连接方法。 - Dave Alperovich
1
另一种想法是,你可以连接到被阻止的端口。我猜你更喜欢创建一个强大的服务器模拟模式。顺便说一句,虽然我批评了你的完美主义,但我也很钦佩它。一旦你开始理解这种开放式的问题,它就变得有趣了。 - Dave Alperovich
2
如果你要模拟一个不工作的http服务,那为什么还要模拟它呢?只需要让你的测试在无效的URI上运行即可。 - Pedro Silva
显示剩余7条评论
4个回答

4
似乎 Comcast 工具提供了您所需的大部分功能:
Comcast 是一款旨在模拟常见网络问题(如延迟、带宽限制和丢失/重排/损坏的数据包)的工具。它通过以便携式方式打包一些系统工具来实现。在像 OSX 这样的基于 BSD 的系统上,我们使用诸如 ipfw 和 pfctl 等工具来注入故障。在 Linux 上,我们使用 iptables 和 tc。Comcast 仅是这些控件的一个薄薄的包装器。
Linux 上的示例: https://github.com/tylertreat/Comcast
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%。


哈哈,好名字,模拟糟糕的网络连接,以便您构建更好的系统。 - lyjackal
这个库的名字很棒。 - looshi

2

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

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

我正在处理这个演示项目,展示如何实现Protractor+CucumberJS+sugar-step。目前它包含一个非常简单的Angular应用程序和3个E2E测试。

演示可以工作,但是还没有完成,仍然需要一些功能,我认为这对于E2E测试很有用。

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

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

  • 使用Cucumber的Around功能,它可以用于在任何功能或场景之前注入angular.module('mock-Service-response-x',fn...),并在特性或场景运行后将其删除。

这种方式可以测试什么?

  • 任何类型的场景,具有极端延迟的响应、响应任何状态码、为测试非常特殊的场景响应特殊数据,否则从正常的后端服务中获得这些数据将是不可能/困难的,如后端数据不一致性。

为什么要使用AngularJS实现UI模拟而不是使用代理?

  • UI控制(当然取决于您的特定需求)使用Angular,您可以做一些事情,例如:完全禁用ngAnimationsjQuery动画,模拟本地浏览器Date,以自动化依赖于日期的行为。

  • 成本(取决于您的项目)在每个开发环境上为所有Web服务实现本地代理的成本可能很高(在硬件或工作量或实施小时方面)。

  • 依赖,如果您的开发团队正在并行工作,则更有可能取决于彼此,如果UI团队正在处理依赖于X Web服务的功能,则知道实现规范的UI团队可以创建简单的模拟以继续其工作,使整个项目按时交付的可能性更大

所有这些论点都取决于你正在开展的项目,这并不意味着这是最佳解决方案,但我更倾向于保持项目层之间的独立性,并能够在一个层面上发布新功能,无论其他层面是否延迟了自己的新功能。

任何人阅读此文,都欢迎提出评论、纠正或建议。


感谢您的回答。我们目前使用protractor-http-mock模拟404500服务器错误,但需要模拟连接错误 - 在您提到的项目中没有找到示例。 - alecxe
我发布的项目还没有实现那种情况,请查看这个文件。(你能在Protractor上使用protractor-http-mock进行UI自动化测试吗?我认为它只对Karma测试有用。) - Matias Fernandez Martinez
“连接错误”是什么意思? 是指 444无响应 还是 499客户端关闭请求? 还是说你在谈论一个从未响应的服务? 如果是第一种情况,唯一要做的就是更改返回的状态代码。 如果是第二种情况,非常简单,只需要像这样做: $httpBackend.whenPOST('/services/login').respond(function() { // never return, so the client will wait until detects any timeout fallback }); - Matias Fernandez Martinez
这是第二种情况,我会尝试你建议的,并回来告诉你,谢谢。 - alecxe

1
这也取决于你打算如何做?是否需要编程?
如果是的话,最好的解决方案是代理依赖,所有selenium/webdriver工具中最好的工具是browserMobProxy。
如果你想从外部进行操作,我建议使用任何外部流量整形器/代理。例如:http://vaurien.readthedocs.org/en/1.8/
vaurien --protocol http --proxy nonexistingproxy.com:8000 --backend website.com:80

为什么不应该使用9n0浏览器功能?首先,您需要重新加载页面才能看到它们的作用,其次是您将无法在protractor中重新定义代理设置。至于插件,以编程方式与它们进行交互并不容易,并且我看不到任何好处,而您应该为不同的浏览器附加很多插件。

1

Facebook开发了一款名为ATC的工具,用于模拟网络条件。

它可以让你控制网络带宽、延迟、数据包丢失和数据包损坏率。

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

你可以在这里找到有关ATC的一般信息。ATC的github存储库在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接