模拟 e2e 测试时如何检测 API 修改?
How to detect API modifications when mocking e2e tests?
我想为我们团队的项目建立一个坚实的端到端测试基础,但我找不到解决该问题的简单方法:
当您模拟所有调用时,检测服务器返回的对象的实际模型是否已被修改的最佳方法是什么?
您的测试仍会通过,因为他们测试的是模型的过时版本,但应用程序可能已损坏。
例如,如果 mock 假定 /api/users/1
returns null
如果用户不存在,而实际上 returns 是一个空对象,那么尽管测试可能会通过,被测试的行为依赖于不正确的假设,因此可能会以意想不到的方式失败。
或者后端可能以某种方式提供具有最新模型的静态 json 文件,而前端依赖于此?
这当然假设从事后端工作的人员和从事前端工作的人员是不同的团队。
我在这里使用 Angular 1.x 和量角器,但这并不真正取决于技术。
您需要注册一个 http interceptor 来存储数据
请求:window.e2eHttp[request.url] = null;
,响应+响应错误:window.e2eHttp[request.url] = result;
您可以使用量角器的 angular 模块系统在您的解决方案中注入或使用标志,e2eService.isEnabled()
,以打开和关闭拦截器。
然后在您的 e2e 测试中,您需要实施 browser.wait + browser.executeScript
直到 window.e2eHttp[request.url]
有数据。它将始终具有 angular http 响应 object(http 状态 headers、数据等)
我认为你在做什么(测试期间的前端隔离)是正确的,保持这种方式。
您可以执行以下操作之一来验证您的模拟:
1) 如果前端和后端紧密耦合并一起开发 - 为后端添加一组单元测试以验证 API 响应。
这样,如果 API 中发生某些变化,后端测试将失败,您将知道前端模拟也应该更新。
在开发过程中,您可以运行定期甚至在每次代码更改时进行两组测试(e2e 和后端单元测试)。
2) 如果前端或多或少独立于后端,那么您需要进行一些集成测试,除了 e2e 测试之外,您还需要 运行。
这些应该向后端执行实际的 HTTP 请求,并将返回的数据结构与您的模拟进行比较。通过这种方式,您可以检测模拟过时的情况。
第二种方法更可靠,但集成测试可能比后端单元测试慢,因此您可以 运行 它们仅在 CI 服务器上自动进行,而不是在本地开发期间。
@Lablanc Meneses 的类似解决方案是将每个呼叫的响应保存在 JSON 文件中。将您的响应保存在拦截器中用于 e2e 测试,然后使用保存的 JSON 文件进行 e2e 测试。这些调用 JSON 将在 运行 启用您的 api 服务时自动更新。这将需要运行将您的所有服务一次性存储一次以首次存储模型,然后将其用于您的端到端测试。一旦您 运行 更新后 api,模型就会更新。您可以创建一个开关来停止为您的生产版本保存响应。
我想为我们团队的项目建立一个坚实的端到端测试基础,但我找不到解决该问题的简单方法:
当您模拟所有调用时,检测服务器返回的对象的实际模型是否已被修改的最佳方法是什么?
您的测试仍会通过,因为他们测试的是模型的过时版本,但应用程序可能已损坏。
例如,如果 mock 假定 /api/users/1
returns null
如果用户不存在,而实际上 returns 是一个空对象,那么尽管测试可能会通过,被测试的行为依赖于不正确的假设,因此可能会以意想不到的方式失败。
或者后端可能以某种方式提供具有最新模型的静态 json 文件,而前端依赖于此?
这当然假设从事后端工作的人员和从事前端工作的人员是不同的团队。
我在这里使用 Angular 1.x 和量角器,但这并不真正取决于技术。
您需要注册一个 http interceptor 来存储数据
请求:window.e2eHttp[request.url] = null;
,响应+响应错误:window.e2eHttp[request.url] = result;
您可以使用量角器的 angular 模块系统在您的解决方案中注入或使用标志,e2eService.isEnabled()
,以打开和关闭拦截器。
然后在您的 e2e 测试中,您需要实施 browser.wait + browser.executeScript
直到 window.e2eHttp[request.url]
有数据。它将始终具有 angular http 响应 object(http 状态 headers、数据等)
我认为你在做什么(测试期间的前端隔离)是正确的,保持这种方式。
您可以执行以下操作之一来验证您的模拟:
1) 如果前端和后端紧密耦合并一起开发 - 为后端添加一组单元测试以验证 API 响应。 这样,如果 API 中发生某些变化,后端测试将失败,您将知道前端模拟也应该更新。
在开发过程中,您可以运行定期甚至在每次代码更改时进行两组测试(e2e 和后端单元测试)。
2) 如果前端或多或少独立于后端,那么您需要进行一些集成测试,除了 e2e 测试之外,您还需要 运行。 这些应该向后端执行实际的 HTTP 请求,并将返回的数据结构与您的模拟进行比较。通过这种方式,您可以检测模拟过时的情况。
第二种方法更可靠,但集成测试可能比后端单元测试慢,因此您可以 运行 它们仅在 CI 服务器上自动进行,而不是在本地开发期间。
@Lablanc Meneses 的类似解决方案是将每个呼叫的响应保存在 JSON 文件中。将您的响应保存在拦截器中用于 e2e 测试,然后使用保存的 JSON 文件进行 e2e 测试。这些调用 JSON 将在 运行 启用您的 api 服务时自动更新。这将需要运行将您的所有服务一次性存储一次以首次存储模型,然后将其用于您的端到端测试。一旦您 运行 更新后 api,模型就会更新。您可以创建一个开关来停止为您的生产版本保存响应。