![](/img/trans.png)
[英]What prevents third-party access and “mining” when serving data to a front-end via REST API?
[英]Handling third-party API requests in End-to-End testing
我想使用端到端测试来测试我的 Rest API。 据我了解,集成测试的区别在于我们不做内存系统配置,而是使用真实的测试数据库和网络请求。
但我无法理解如何处理第三方 API 请求(如 GitHub 或 Bitbucket API)。
用我的测试获取的虚假数据创建一个虚假的 Github 帐户是正常的做法吗?
以及如何处理访问令牌,并非所有服务都是公共的,甚至公共服务也可能因速率限制而失败。
创建假冒Github帐户是否正常,我的测试会提取假数据?
是。 E2E测试(与集成测试相比)的目的是验证整个系统是否适用于所有实际系统组件,包括您控制的组件和您未控制的组件。 这可能很难设置并且难以维护; 但许多痛点将暴露您生产服务中的真正潜在问题。 您的服务如何响应该不稳定性本身就是一个需要测试的功能:您的系统是否崩溃和刻录,或者它是否正常呈现错误消息并支持良好的重试处理?
这也为你提供了一种模拟无法提供的覆盖范围:如果你使用的第三方API是顽皮的并引入了某种突破性变化,那么你的E2E测试将会抓住它。 这是继续运行你的E2E套件的一个不错的理由; 不只是在部署期间。
这种测试的下一个层次是混沌工程 ,你不仅要测试你的生产系统,还要故意引入错误(是的,投入产品),以确保你的服务真正能够应对压力。
如何处理访问令牌,并非所有服务都是公开的,甚至公共服务都可能因速率限制而失败。
应为您的暂存环境配置外部服务的单独沙箱帐户。 我不确定你的意思是“并非所有的服务都是公开的”,而只是努力让你的登台环境(或测试用户在prod上)尽可能与真正的prod用户相同。 对于不支持多访问令牌的服务,您可以获得创意并尝试在其系统中清楚地描绘您的测试数据。
速率限制可能很烦人,但是如果你越来越接近你的测试会超过限制,那么你应该采取一种策略来解决这个问题(与服务协商,获得多个账户,......)。
当服务关闭或网络延迟触发某些测试超时时,针对 3rd 方服务运行测试可能会导致测试缓慢且不稳定。 更不用说您冒着触发 API 速率限制的风险,具体取决于您所使用的 3rd 方服务。 理想情况下,您的测试应该是确定性的,不会随机失败,并且不需要条件逻辑来处理特定测试用例中的错误。 如果您希望需要处理错误,那么应该有一个特定的测试用例来覆盖在每个构建中运行的那些错误,而不是等待来自第 3 方的非确定性故障。
人们会提出的一个论点是,如果第 3 方 API 因某种原因或其他原因中断,您的测试应该通知您。 不过,一般来说,大多数主要的 3rd 方 API 都非常稳定,不太可能进行重大更改。 即使它确实发生了,这是发现 API 损坏的一种尴尬和混乱的方式,而且很有可能,您的测试不会是您听到它的第一个地方。 您的客户和您的生产错误跟踪器更有可能通知您。 如果您想跟踪这些服务何时发生变化或停止,那么定期进行某种形式的生产检查以对其进行验证是有意义的。
至于如何围绕这些情况编写测试,那就有点棘手了。 Ruby 中的VCR等工具可以很好地消除您语言的 Internet 连接,并允许您消除、记录和自定义响应(在它们的自述文件中还有其他语言的类似实现列表)。 但是,当您的浏览器在自动化的端到端测试中连接到这些资源时,这不起作用。 有一些工具可以代理浏览器的 Web 连接,例如 Ruby 中的Puffing Billy ,但这是一个非常复杂的设置过程,包括管理安全证书。 当某些事情不能正常工作时,这似乎非常脆弱且难以调试。
编写确定性和可维护的测试的最佳选择可能是在测试模式下伪造服务。 Thoughtbot 有一个相当不错的视频, 这里是 CircleCI 的一篇高级文章。 本质上,您在测试模式下交换了一个适配器,它代表您的 3rd 方服务集成。 也许您可以在本地机器上做的是可以通过环境变量选择使用真实服务或适配器,以验证测试对两者运行的情况是否相同。 你也可以设置一个每日构建来运行真实的东西,这样它就可以验证测试仍然正常工作,而不会给你更频繁的构建带来很多不稳定。 但是,我遇到的一个问题是,即使我在该 3rd 方服务上设置了一个测试帐户,结果也会随着我添加或修改信息以测试新功能(例如添加新功能)而随时间变化回购,修改问题等。它需要额外考虑将您的测试帐户维护为所有测试的一组固定装置。
我遇到的另一个可能有用的工具是ngrok-tunnel (又是 Ruby)。 这仅在您需要 3rd 方服务来联系您的应用程序的情况下才相关,因为它们无法通过网络向localhost:3000
发送请求。 如果您已经配置了某种 webhook,这样的服务可以使测试变得更加简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.