我想使用端到端测试来测试我的Rest API。据我了解,集成测试之间的区别在于我们不进行内存中的系统配置,而是使用实际的测试数据库和网络请求。
但是我不明白如何处理第三方API请求(例如GitHub或Bitbucket API)。
用我的测试会获取的虚假数据创建一个虚假的Github帐户是正常的做法吗?
如何处理访问令牌,并非所有服务都是公共的,甚至公共服务也会因速率限制而失败。
答案 0 :(得分:7)
用我的测试会获取的虚假数据创建一个虚假的Github帐户是正常的做法吗?
是的。端到端测试(相对于集成测试)的目的是验证整个系统是否可以使用所有实际系统组件,包括您控制的组件和不使用的组件。这可能很难设置并且很难维护。但其中许多痛点将暴露您的生产服务中的实际潜在问题。您的服务如何响应这种不稳定本身就是要测试的功能:系统是否崩溃并烧毁,或者它是否优雅地显示错误消息并支持良好的重试处理?
这也使您获得了模拟无法提供的覆盖范围:如果您使用的第三方API顽皮并且引入了一些重大更改,则E2E测试将抓住它。这是一个持续运行E2E套件的体面原因。不只是在部署期间。
这种测试的下一个层次是chaos engineering,在这里您不仅要测试生产系统,还要有目的地引入错误(是,在产品中),以确保您的服务能够真正应对压力
如何处理访问令牌,并非所有服务都是公共的,甚至公共服务也会因速率限制而失败。
您的登台环境应配置有用于外部服务的单独的沙箱帐户。我不确定“不是所有服务都是公共的”是什么意思,但是请努力使您的登台环境(或产品上的测试用户)尽可能与真实产品用户相同。对于不支持多个访问令牌的服务,您可以发挥创造力,并尝试在其系统中清楚地描述测试数据。
费率限制可能很烦人,但是如果您的距离太近了,以至于您的测试使您超出了限制,那么您应该追求一种无论如何都可以解决该问题的策略(与服务进行谈判,获得多个帐户,... )。
答案 1 :(得分:0)
针对第三方服务运行测试可能会导致服务关闭或网络延迟触发某些测试超时时导致缓慢而不稳定的测试。更不用说您冒着触发API速率限制的风险,具体取决于您要打的第三方服务。理想情况下,您的测试应该是确定性的,不会随机失败,并且不需要条件逻辑来处理特定测试用例中的错误。如果您希望处理错误,那么应该有一个特定的测试用例来涵盖每个版本中运行的那些错误,而不是等待第三方的不确定性失败。
人们会提出的一个论据是,如果第三方API因某种原因而中断,则您的测试应通知您。但是,一般而言,大多数主要的第三方API都非常稳定,不太可能进行重大更改。即使确实发生了,这也是发现API损坏的一种尴尬而令人困惑的方法,并且很可能您的测试绝不会是您第一个听到它的地方。您的客户和生产错误跟踪器更有可能通知您。如果您想跟踪这些服务何时更改或关闭,应该定期进行某种形式的生产检查以进行验证。
关于如何在这些情况下编写测试,这比较棘手。 Ruby中有VCR之类的工具,可以很好地用于解决您语言的Internet连接,并允许您支持,记录和自定义响应(自述文件中还有其他语言的类似实现列表) 。但是,当您的浏览器在自动化的端到端测试中连接到那些资源时,这种方法不起作用。有一些工具可以代理浏览器的网络连接,例如Ruby中的Puffing Billy,但这是一个非常复杂的设置过程,包括管理安全证书。当某些功能无法正常运行时,这似乎非常脆弱且难以调试。
编写确定性和可维护的测试的最佳选择是在测试模式下伪造服务。 thoughtbot has a pretty decent video和here's a high-level article from CircleCI。本质上,您可以在测试模式下交换适配器,该模式代表您的第三方服务集成。也许您可以在本地计算机上执行的操作是可以通过环境变量有选择地使用真实服务或适配器,以验证对两个测试是否都运行相同。您还可以设置一个日常版本来对抗真实对象,以便它可以验证测试仍然可以正常运行,而不会给您更频繁的版本带来很多麻烦。但是,我遇到的一个问题是,即使我在该第三方服务上设置了测试帐户,当我添加或修改信息以测试新功能(例如添加新功能)时,结果也会随着时间而改变。回购,修改问题等。这需要额外考虑,以将您的测试帐户作为所有测试的固定装置来维护。
我遇到的另一个可能有用的工具是ngrok-tunnel之类的(再次是Ruby)。这仅在需要第三方服务与您的应用程序联系的情况下才有意义,因为他们无法通过网络将请求发送到localhost:3000
。如果您已经配置了某种形式的Webhook,则这样的服务可以使测试更加直接。