如何将跨微服务的端到端测试包含到多个持续交付管道中?
Posted
技术标签:
【中文标题】如何将跨微服务的端到端测试包含到多个持续交付管道中?【英文标题】:How do I include end-to-end tests across microservices into multiple continuous delivery pipelines? 【发布时间】:2017-10-17 23:55:19 【问题描述】:我的团队开发了三个微服务。三者协同工作以提供业务场景。它们与 REST 和 RabbitMQ 进行通信。看起来像在Toby Clemson's presentation on Microservice Testing。
每个微服务都有自己的持续交付管道。它们是 delivery,而不是 deployment 管道,这意味着最后有一个手动发布决定。
如何将业务场景(即跨所有微服务)的端到端测试包含到交付管道中?
我的团队建议这样做:
我们添加了一个共享 端到端阶段,用于部署所有三个微服务并在它们上运行端到端测试。每次其中一个管道到达此阶段时,它都会进行部署和测试。信号量确保管道一个接一个地通过阶段。失败会停止所有三个管道。
对我来说,这似乎牺牲了微服务架构首先赢得的所有独立性:
端到端阶段是一个瓶颈。快速流水线可以阻止慢速流水线,因为它更频繁地保留端到端阶段,使其他流水线在运行测试之前等待。
一个管道中的故障将阻止其他管道交付,同时也使它们无法交付紧急错误修复。
该解决方案不适应需要不同微服务组合的新业务场景。我们要么最终得到一个连接所有微服务的超级阶段,要么每个业务场景都需要自己的新端到端阶段。
端到端阶段仅显示一个狭窄的结果,因为它仅确认一个精确的微服务版本组合可以协同工作。如果生产包含不同的版本,则不保证这也能正常工作。
该阶段也与最后的手动发布决策相冲突:如果构建通过端到端但我们决定不将其发布到生产环境怎么办?然后,生产环境将包含与端到端不同版本的微服务,从而导致结果扭曲。
那么有什么更好的方法来做到这一点?
【问题讨论】:
广泛同意。我对这个提议的问题是它创建了一个内置假设,即除非满足特定的业务案例,否则您永远不想发布软件。我很想将业务案例测试完全放在管道之外并定期运行。然后应将失败作为每个服务的积压问题提出。 @Florian 你想出了什么解决方案? 随着时间的推移,我们实施了两种不同的解决方案。上面勾勒的原始想法被丢弃了。相反,我们决定为每个管道提供一个单独的 e2e 测试空间。该管道将在那里部署自己的服务。另外两个管道将在最后部署他们的服务。因此,e2e 空间始终反映“我的最新服务增量是否适用于其他两个当前生产版本?”随着时间的推移,我们发现这仍然过于交叉依赖。在以后的设置中,我们将管道限制为合同测试。并添加一个在 prod 中定期运行 e2e 测试的管道。 【参考方案1】:简而言之 - 这样的集成测试不会成为微服务开发/部署团队和流程的一部分,而是一个拥有自己流程的独立团队。您可以在该团队中尽可能地自动化,但最终您需要决定是否发布。
更长的解释:
发明微服务架构风格是为了帮助大型组织管理大型应用程序并避免团队之间的通信开销和依赖关系。所以如果你想遵循这种风格,你真的应该有 3 个独立的团队——每个服务一个。这些团队中的每一个都将对各自服务的整个生命周期负有全部责任。现在,当您想要进行端到端测试(通常称为集成测试)时,您需要建立一个负责这些测试的第四团队。您将拥有一个负责发布经理的人,他拥有一个登台/测试集群,并决定何时测试证明足以将新版本的服务发布到野外。您的目标应该是尽可能地在服务的依赖关系和发布周期方面解耦团队。如果您希望服务团队完全独立,您还可以将集成测试作为每个团队的一部分。这意味着每个团队都有测试/登台集群,并且每个团队都有一个负责任的测试/发布经理角色。
【讨论】:
如果我们想把端到端测试拉到团队中,这意味着每个微服务都有自己的端到端测试阶段。这样的舞台能做什么?它会部署自己的微服务以及其他两个微服务的最新发布版本,然后运行存储在独立存储库某处的端到端测试套件吗? 在这样的测试阶段,我将部署所有服务的生产版本以及您要测试的一个新服务版本。顺便提一句。一般来说,微服务方法的依赖关系应该非常有限,因此“集成”失败的风险很低。这意味着您还必须考虑该投资是否合理。 @OswinNoetzelmann 这听起来很像我期待在具有独立团队/部署的微服务架构中进行 E2E 测试。你知道关于这个主题的任何好的文章、书籍、演讲或其他东西吗?还是这更普遍? “这些团队中的每一个都将对各自服务的整个生命周期负全部责任” ...“并且您将拥有一个负责的发布经理,他拥有一个登台/测试集群并决定何时测试证明足以将新版本的服务发布到野外”。这两种说法似乎很矛盾。如果您已将端到端测试委托给单独的团队,并且他们决定何时发布,则微服务团队不再承担全部责任。以上是关于如何将跨微服务的端到端测试包含到多个持续交付管道中?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Mocha 在 Detox 中重试失败的端到端测试?