Rest 在端到端测试中处理第三方API请求

Rest 在端到端测试中处理第三方API请求,rest,api,testing,e2e-testing,Rest,Api,Testing,E2e Testing,我想用端到端测试来测试我的RESTAPI。据我所知,集成测试之间的区别在于我们不进行内存系统配置,而是使用真实的测试数据库和网络请求 但我不明白如何处理第三方API请求(如GitHub或Bitbucket API) 使用我的测试获取的假数据创建假Github帐户是正常做法吗 至于如何使用访问令牌,并不是所有服务都是公共的,甚至公共服务也可能因速率限制而失败 使用我的测试获取的假数据创建假Github帐户是正常做法吗 对。E2E测试(相对于集成测试)的目的是验证整个系统与所有实际系统组件一起工作,

我想用端到端测试来测试我的RESTAPI。据我所知,集成测试之间的区别在于我们不进行内存系统配置,而是使用真实的测试数据库和网络请求

但我不明白如何处理第三方API请求(如GitHub或Bitbucket API)

使用我的测试获取的假数据创建假Github帐户是正常做法吗

至于如何使用访问令牌,并不是所有服务都是公共的,甚至公共服务也可能因速率限制而失败

使用我的测试获取的假数据创建假Github帐户是正常做法吗

对。E2E测试(相对于集成测试)的目的是验证整个系统与所有实际系统组件一起工作,包括您控制的组件和您不控制的组件。这可能很难设置,也很难维护;但这些痛点中的许多都将暴露生产服务中真正的潜在问题。您的服务如何响应这种不稳定性本身就是一个需要测试的特性:您的系统是崩溃和烧坏了,还是优雅地显示错误消息并支持良好的重试处理

这也为您提供了mocks无法提供的一种覆盖:如果您使用的第三方API是顽皮的,并且引入了某种破坏性的更改,那么您的E2E测试将捕获它。这是继续运行E2E套件的正当理由;不仅仅是在部署期间

这类测试的下一个级别是,您不仅要测试生产系统,还要有目的地引入故障(是的,在prod中),以确保您的服务能够真正处理压力

至于如何使用访问令牌,并不是所有服务都是公共的,甚至公共服务也可能因速率限制而失败

您的登台环境应该为外部服务配置单独的沙箱帐户。我不确定你所说的“并非所有服务都是公共的”是什么意思,但只要努力使你的登台环境(或prod上的测试用户)尽可能与真实的prod用户相同就行了。对于不支持多址令牌的服务,您可以发挥创造性,尝试在其系统中清晰地描述您的测试数据


费率限制可能很烦人,但如果您的测试已经接近极限,那么您应该采取策略解决这个问题(与服务协商,获得多个帐户,…).

当服务关闭或网络延迟触发某些测试超时时,针对第三方服务运行测试可能会导致测试速度缓慢且不稳定。更不用说,根据您使用的第三方服务,您有触发API速率限制的风险。理想情况下,您的测试应该是确定性的,不会随机失败,并且不需要条件逻辑来处理特定测试用例中的错误。如果您希望需要处理错误,那么应该有一个特定的测试用例来覆盖在每个构建中运行的错误,而不是等待来自第三方的非确定性故障

人们会提出的一个论点是,如果第三方API因某种原因中断,您的测试应该通知您。不过,一般来说,大多数主要的第三方API都非常稳定,不太可能做出突破性的更改。即使它真的发生了,这也是一种尴尬和令人困惑的方式来发现API被破坏了,而且很有可能,您的测试不会是您听到它的第一个地方。您的客户和生产错误跟踪器更有可能通知您。如果您想跟踪这些服务何时更改或停止,那么有必要进行某种形式的定期生产检查以进行验证

至于如何围绕这些情况编写测试,这有点棘手。有一些工具,比如Ruby,可以很好地清除您的语言的internet连接,并允许您清除、记录和自定义响应(在自述文件中有其他语言的类似实现列表)。但是,当您的浏览器在自动端到端测试中连接到这些资源时,这不起作用。有一些工具可以代理浏览器的web连接,比如Ruby,但这是一个非常复杂的设置过程,包括管理安全证书。当某些东西工作不正常时,这看起来很脆弱,很难调试

编写确定性和可维护的测试的最佳选择可能是在测试模式下伪造服务。在这个和。本质上,您可以在测试模式下交换适配器,该模式代表您的第三方服务集成。也许您可以在本地计算机上做的是通过环境变量选择性地使用真正的服务或适配器,以验证测试对这两种服务运行相同。您还可以设置一个每日构建来运行真实的构建,这样它就可以验证测试是否仍然正常工作,而不会在更频繁的构建中引入很多片状。但是,我遇到的一个问题是,即使我在该第三方服务上设置了一个测试帐户,当我为了测试新功能而添加或修改信息时,结果也会随着时间的推移而改变,例如添加新回购协议、修改问题、,等等。它需要额外考虑将您的测试帐户作为所有测试的一组固定装置进行维护


我遇到的另外一个可能有用的工具是(Ruby)。这仅适用于您需要第三方服务联系应用程序的情况,因为他们无法通过web向
localhost:3000
发送请求。如果您已经配置了某种Webhook,那么像这样的服务可以使测试更加简单。

如果设计是可靠的,那么第三方依赖关系将被抽象并解耦,因此