【问题标题】:How to detect API modifications when mocking e2e tests?模拟 e2e 测试时如何检测 API 修改?
【发布时间】:2016-01-15 17:27:31
【问题描述】:

我想为我们团队的项目建立一个坚实的 e2e 测试基础,但我找不到该问题的简单解决方案:

当您模拟所有调用时,检测服务器返回的对象的实际模型是否已被修改的最佳方法是什么?

您的测试仍会通过,因为它们正在测试模型的过时版本,但应用程序可能已损坏。

例如,如果一个 mock 假设 /api/users/1 在用户不存在的情况下返回 null,当它实际返回一个空对象时,尽管测试可能通过,但被测试的行为依赖于不正确的假设和因此可能会以意想不到的方式失败。

或者也许后端以某种方式提供具有最新模型的静态 json 文件,而前端依赖于此?

这当然假设后端工作人员和前端工作人员是不同的团队。

我在这里使用 Angular 1.x 和 Protractor,但这并不取决于技术。

【问题讨论】:

    标签: angularjs unit-testing mocking protractor e2e-testing


    【解决方案1】:

    我认为你在做什么(测试期间的前端隔离)是对的,保持这种方式。

    您可以通过以下方式验证您的模拟:

    1) 如果前端和后端紧密耦合并一起开发 - 为后端添加一组单元测试以验证 API 响应。 这样,如果 API 发生变化,后端测试将失败,您将知道前端模拟也应该更新。

    在开发过程中,您可以定期运行两组测试(e2e 和后端单元测试),甚至可以在每次代码更改时运行。

    2) 如果前端或多或少独立于后端,那么您需要进行一些集成测试,这些测试将在 e2e 测试之外运行。 这些应该向后端执行实际的 HTTP 请求,并将返回的数据结构与您的模拟进行比较。通过这种方式,您可以在 mock 过时时检测到情况。

    第二种方法更可靠,但集成测试可能会比后端单元测试慢,因此您只能在 CI 服务器上自动运行它们,而不是在本地开发期间。

    【讨论】:

    • 解决方案 2 看起来很有趣。我肯定在寻找尽可能少涉及后端的解决方案。
    【解决方案2】:

    与@Lablanc Meneses 类似的解决方案是将每个调用的响应保存在 JSON 文件中。将您的响应保存在拦截器中以进行 e2e 测试,然后将保存的 JSON 文件用于 e2e 测试。每当运行您的 api 服务时,这些调用 JSON 都会自动更新。这将需要运行一次所有服务以首次存储模型,然后将其用于您的 e2e 测试。运行更新的 api 后,模型将立即更新。您可以创建一个切换来停止为您的生产构建保存响应。

    【讨论】:

      【解决方案3】:

      您需要注册一个http interceptor,将数据存储在 请求:window.e2eHttp[request.url] = null;,响应+响应错误:window.e2eHttp[request.url] = result;

      您可以使用量角器的角度模块系统在您的解决方案中注入或使用标志e2eService.isEnabled(),以打开和关闭拦截器。

      然后在您的 e2e 测试中,您需要实现 browser.wait + browser.executeScript 直到 window.e2eHttp[request.url] 有数据。它总是有角度的 http 响应对象(http 状态标头、数据等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        • 2021-04-26
        相关资源
        最近更新 更多