集成测试:模拟外部 API 与使用外部 API 沙箱
Integration testing: Mock external API vs. use external API sandbox
我们需要使用外部合作伙伴的 API。 API 状态良好,我们可以访问可用于自动测试的沙箱环境。
我们已经使用单元测试测试了外部 API 的每个调用,但不确定在涉及外部合作伙伴方面的复杂操作时集成测试的最佳实践。
示例:我们服务的每个用户也在我们的外部合作伙伴处获得了一个用户对象。当对该用户对象执行外部 API 调用 X 时,我们希望对象 Y 出现在该用户的集合 Z 中(我们必须使用不同的调用来查询)。
像这样测试用例的最佳实践是什么?
尽可能模拟外部 API 并依靠单元测试来完成他们的工作?优点:测试 运行 快速且独立于互联网连接。缺点:我们模拟中的错误可能会导致误报。
集成外部 API 沙箱 和 运行 针对它的每个集成测试。优点:接近现实生活 API 互动。缺点:测试只能 运行 使用开放的互联网连接并且需要更多时间。
使用模拟和沙箱数据的混合,设置一个布尔值以在需要时在内部(=模拟)和外部(=沙箱)环境之间切换.优点:可靠的测试。缺点:设置起来可能很痛苦。
其他最佳实践?
谢谢!
相关:How are integration tests written for interacting with external API?然而,我们认为答案"You don't. You have to actually trust that the actual API actually works."是不够的。
[编辑] 我们担心集成测试仅针对我们假设的外部 API 应该如何工作(即使它们基于单元测试)——而不是针对实际的 API——将会给我们留下误报。我们需要的是一个测试来验证我们的假设(模拟)实际上是正确的——不仅在单元测试的上下文中,而且在具有多个步骤的复杂操作的上下文中。
验证可能是一个很好的例子:如果我们搞砸了集成代码并发送了格式错误的数据或由于我们错过了一个步骤而在我们发送的上下文中没有任何意义的数据怎么办?我们的模拟 API 不验证(或仅在非常有限的范围内)仍然 return 有效数据而不是传递我们从真实 API.[=13= 收到的错误]
我认为当我们与外部接口时,我们需要进行 2 级验证 API:
- API 验证:验证 API 是否按照其规范工作 and/or 我们的理解
- App 功能验证:验证我们的业务逻辑是否按照对通过 API 验证的 API 的预期工作
在我们的例子中,我们使用 mock API 以及 real 和 mock API 验证 。
- Mock API 允许我们将任何运行时 errors/exceptions 隔离到应用程序功能,因此我们不会将问题归咎于任何外部方
- 对真实和模拟 APIs 执行相同的 API 验证,以确保真实的按照我们期望的方式工作,以及模拟的应该模仿真实的一个正确
如果在此过程中,外部 API 发生变化,API 验证可能会变成红色,从而触发 mock API 中的变化。 mock API 的变化可能会使应用验证变红,从而触发应用实现的变化。这样你就不会错过外部 API 和应用程序实现(理想情况下)之间的任何差距。
模拟 API + API 验证的另一个额外好处是您的开发人员可以将其用作 documentation/specification API 应该如何工作的 documentation/specification .
我们需要使用外部合作伙伴的 API。 API 状态良好,我们可以访问可用于自动测试的沙箱环境。
我们已经使用单元测试测试了外部 API 的每个调用,但不确定在涉及外部合作伙伴方面的复杂操作时集成测试的最佳实践。
示例:我们服务的每个用户也在我们的外部合作伙伴处获得了一个用户对象。当对该用户对象执行外部 API 调用 X 时,我们希望对象 Y 出现在该用户的集合 Z 中(我们必须使用不同的调用来查询)。
像这样测试用例的最佳实践是什么?
尽可能模拟外部 API 并依靠单元测试来完成他们的工作?优点:测试 运行 快速且独立于互联网连接。缺点:我们模拟中的错误可能会导致误报。
集成外部 API 沙箱 和 运行 针对它的每个集成测试。优点:接近现实生活 API 互动。缺点:测试只能 运行 使用开放的互联网连接并且需要更多时间。
使用模拟和沙箱数据的混合,设置一个布尔值以在需要时在内部(=模拟)和外部(=沙箱)环境之间切换.优点:可靠的测试。缺点:设置起来可能很痛苦。
其他最佳实践?
谢谢!
相关:How are integration tests written for interacting with external API?然而,我们认为答案"You don't. You have to actually trust that the actual API actually works."是不够的。
[编辑] 我们担心集成测试仅针对我们假设的外部 API 应该如何工作(即使它们基于单元测试)——而不是针对实际的 API——将会给我们留下误报。我们需要的是一个测试来验证我们的假设(模拟)实际上是正确的——不仅在单元测试的上下文中,而且在具有多个步骤的复杂操作的上下文中。
验证可能是一个很好的例子:如果我们搞砸了集成代码并发送了格式错误的数据或由于我们错过了一个步骤而在我们发送的上下文中没有任何意义的数据怎么办?我们的模拟 API 不验证(或仅在非常有限的范围内)仍然 return 有效数据而不是传递我们从真实 API.[=13= 收到的错误]
我认为当我们与外部接口时,我们需要进行 2 级验证 API:
- API 验证:验证 API 是否按照其规范工作 and/or 我们的理解
- App 功能验证:验证我们的业务逻辑是否按照对通过 API 验证的 API 的预期工作
在我们的例子中,我们使用 mock API 以及 real 和 mock API 验证 。
- Mock API 允许我们将任何运行时 errors/exceptions 隔离到应用程序功能,因此我们不会将问题归咎于任何外部方
- 对真实和模拟 APIs 执行相同的 API 验证,以确保真实的按照我们期望的方式工作,以及模拟的应该模仿真实的一个正确
如果在此过程中,外部 API 发生变化,API 验证可能会变成红色,从而触发 mock API 中的变化。 mock API 的变化可能会使应用验证变红,从而触发应用实现的变化。这样你就不会错过外部 API 和应用程序实现(理想情况下)之间的任何差距。
模拟 API + API 验证的另一个额外好处是您的开发人员可以将其用作 documentation/specification API 应该如何工作的 documentation/specification .