如何在模拟e2e测试时检测API修改?

时间:2016-01-15 17:27:31

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

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

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

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

例如,如果模拟假定/api/users/1如果用户不存在则返回null,当它实际返回空对象时,那么虽然测试可能会通过,但是测试依赖于错误的假设,因此可能以意想不到的方式失败。

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

这当然假设在后端工作的人和在前端工作的人是独立的团队。

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

3 个答案:

答案 0 :(得分:6)

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

您可以采取哪些措施来验证您的模拟是其中之一:

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您需要注册存储数据的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状态标头,数据等)