【问题标题】:Simulate connection errors模拟连接错误
【发布时间】:2015-06-05 14:52:33
【问题描述】:

一段时间以来,我们一直在使用protractor 进行端到端测试。

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

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

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


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

  • 看看有没有类似protractor-http-mock的第三方nodejs库
  • 模拟$httpangularjs 服务
  • 启动一个代理并在测试期间以某种方式控制它(grunt-connect-proxy 看起来相当成熟,尽管我不确定是否可以从规范动态更改代理的行为 )
  • 在浏览器级别控制它 - 例如具有网络限制谷歌浏览器功能(虽然我很确定这是selenium 无法控制的东西,Network throttling with chrome and selenium)(浏览器插件/扩展?)

【问题讨论】:

  • 单元测试是如此别致,以至于开发人员经常过度测试。我认为您的测试工作做得太过分了。我们当然可以通过一些方法来模拟丢失的连接,但是丢失的连接应该是一个集成测试。测试丢失连接的最佳方法是手动切断连接或停止服务器并观察结果。这不是您想要自动重复的测试,而是手动操作。当您的模拟/场景非常复杂以至于需要进行单元测试和调试时,您对单元测试的过度接触就会受到影响。
  • @DaveAlperovich 好吧,这确实是我们正在询问的端到端集成测试(不是单元测试)(使用protractor)。不过,我接受这样的观点,即不值得付出努力。谢谢!
  • 看看sinon FakeXMLHttpRequest。您必须实现一个模拟服务器响应,这是一项投资,而且它是事务性的,因此在理想情况下您需要随机数量的事务或随机时间范围来进行理想测试,这在某种意义上是不足的。但是,这是我能想象到的最好的模拟连接。
  • 另一个想法,你可以连接到阻塞的端口。我怀疑您更愿意创建一个健壮的服务器模拟模式。 PS,虽然我批评你的完美主义,但我也很佩服。一旦你开始思考这种开放式问题,它就会很有趣。
  • 如果你要模拟一个 http 服务不工作,那么为什么要模拟它呢?只需让您的测试在无效的 uri 上运行即可。

标签: javascript angularjs testing selenium protractor


【解决方案1】:

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

该项目解释了总体思路,readme.md 存在语义和翻译问题,我会尽快解决,请耐心等待。请忘记我的英文/拼写错误让我知道任何更正

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

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

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

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

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

这样可以测试什么?

  • 任何类型的场景,极端延迟的响应,响应任何状态代码,用于测试非常特殊场景的响应特殊数据,否则将不可能/难以从正常的后端服务获得,例如后端的数据不一致-结束

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

  • UI 控制(当然取决于您的特定需求) 使用 Angular,您可以执行以下操作:完全禁用 ngAnimationsjQuery 动画,模拟您的本地浏览器Date,自动模拟依赖于日期的行为。

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

  • 依赖性,如果您的开发团队并行工作,则更有可能相互依赖,如果 UI 团队正在开发依赖于 X Web 服务的功能,知道UI 团队可以创建简单的模拟来继续他的工作的实现规范,从而更有可能按时交付漏洞项目

所有这些论点都取决于您正在从事的项目,并不意味着这是最好的解决方案,但我更倾向于保持项目层相互独立,并且能够在一个层发布一个新特性,不管其他层是否延迟了他自己的新特性。

对于阅读本文的任何人,我们都非常欢迎任何评论、更正或建议

【讨论】:

  • 谢谢你的回答,。我们目前用protractor-http-mock模拟404500服务器错误,但需要模拟连接错误-在你提到的项目中没有找到示例..
  • 我发布的项目还没有实现那个场景,但是请检查this file。 (你可以使用protractor-http-mock 量角器在 UI 上进行自动化测试吗?我认为只对业力测试有用)
  • “连接错误”是什么意思? 444 No Response499 Client Closed Request 或者您说的是从不响应的服务?如果是第一种情况,唯一要做的就是更改返回的状态码。如果是第二种情况,很简单,只需要这样做:$httpBackend.whenPOST('/services/login').respond(function() { // never return, so the client will wait until detects any timeout fallback });
  • 这是第二种情况,我会尝试您的建议并回复您,谢谢。
【解决方案2】:

Facebook 有一个名为 ATC(模拟网络条件的工具)的工具。

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

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

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

【讨论】:

    【解决方案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%。

    【讨论】:

    • 哈哈,好名字,模拟糟糕的网络连接,以便您构建更好的系统。
    • 这个库规则的名称。
    【解决方案4】:

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

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

    如果您想从外部执行此操作,我建议您也使用任何外部流量整形器/代理。例如:http://vaurien.readthedocs.org/en/1.8/

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 2017-09-17
      相关资源
      最近更新 更多