如何将跨微服务的端到端测试包含到多个持续交付管道中?
How do I include end-to-end tests across microservices into multiple continuous delivery pipelines?
我的团队开发了三个微服务。三者共同提供一个业务场景。他们与 REST 和 RabbitMQ 通信。看起来像 Toby Clemson's presentation on Microservice Testing.
每个微服务都有自己的持续交付管道。它们是交付,而不是部署管道,这意味着最后有一个手动发布决定。
如何将 业务场景 的端到端测试,即跨所有微服务,纳入交付管道?
我的团队建议这样做:
我们添加了一个 shared 端到端阶段,用于部署所有三个微服务和 运行s 对它们的端到端测试。每当其中一个管道到达此阶段时,它就会进行部署和测试。信号量确保管道一个接一个地通过阶段。失败会停止所有三个管道。
对我来说,这似乎牺牲了微服务架构最初赢得的所有独立性:
端到端阶段是一个瓶颈。快速管道可能会阻碍慢速管道,因为它更频繁地保留端到端阶段,使其他管道在 运行 测试之前等待。
一个管道中的故障会阻止其他管道的交付,同时也使它们无法交付紧急错误修复。
该解决方案不适应需要不同微服务组合的新业务场景。我们要么最终得到一个连接所有微服务的超级阶段,要么每个业务场景都需要自己的新端到端阶段。
端到端阶段只显示了一个狭窄的结果,因为它只确认了微服务版本的一种精确组合可以协同工作。如果产品包含不同的版本,则不保证它也能正常工作。
该阶段也与最后的手动发布决策冲突:如果一个构建端到端通过但我们决定不将其发布到生产环境怎么办?生产将包含与端到端不同的微服务版本,从而导致扭曲的结果。
那么更好的方法是什么?
简而言之 - 这样的集成测试将不是微服务 development/deployement 团队和流程的一部分,而是一个拥有自己流程的独立团队。你可以在那个团队中尽可能自动化,但最终你需要决定是否发布。
较长的解释:
微服务架构风格的发明是为了帮助大型组织管理大型应用程序并避免团队之间的通信开销和依赖性。所以如果你想遵循这种风格,你真的应该有 3 个独立的团队——每个服务一个。这些团队中的每一个都将对各自服务的整个生命周期负全部责任。现在,当您想要进行端到端测试(通常称为集成测试)时,您将建立一个负责这些测试的第四团队。并且您将有一个人担任负责的发布经理,他拥有一个 staging/testing 集群,并决定何时测试证明足以将新版本的服务发布到野外。您的目标应该是在服务的依赖性和发布周期方面尽可能地解耦团队。如果您希望服务团队完全独立,您还可以将集成测试作为每个团队的一部分。这意味着每个团队都有 testing/staging 个集群,每个团队都有一个负责任的 testing/release 经理角色。
我的团队开发了三个微服务。三者共同提供一个业务场景。他们与 REST 和 RabbitMQ 通信。看起来像 Toby Clemson's presentation on Microservice Testing.
每个微服务都有自己的持续交付管道。它们是交付,而不是部署管道,这意味着最后有一个手动发布决定。
如何将 业务场景 的端到端测试,即跨所有微服务,纳入交付管道?
我的团队建议这样做:
我们添加了一个 shared 端到端阶段,用于部署所有三个微服务和 运行s 对它们的端到端测试。每当其中一个管道到达此阶段时,它就会进行部署和测试。信号量确保管道一个接一个地通过阶段。失败会停止所有三个管道。
对我来说,这似乎牺牲了微服务架构最初赢得的所有独立性:
端到端阶段是一个瓶颈。快速管道可能会阻碍慢速管道,因为它更频繁地保留端到端阶段,使其他管道在 运行 测试之前等待。
一个管道中的故障会阻止其他管道的交付,同时也使它们无法交付紧急错误修复。
该解决方案不适应需要不同微服务组合的新业务场景。我们要么最终得到一个连接所有微服务的超级阶段,要么每个业务场景都需要自己的新端到端阶段。
端到端阶段只显示了一个狭窄的结果,因为它只确认了微服务版本的一种精确组合可以协同工作。如果产品包含不同的版本,则不保证它也能正常工作。
该阶段也与最后的手动发布决策冲突:如果一个构建端到端通过但我们决定不将其发布到生产环境怎么办?生产将包含与端到端不同的微服务版本,从而导致扭曲的结果。
那么更好的方法是什么?
简而言之 - 这样的集成测试将不是微服务 development/deployement 团队和流程的一部分,而是一个拥有自己流程的独立团队。你可以在那个团队中尽可能自动化,但最终你需要决定是否发布。
较长的解释:
微服务架构风格的发明是为了帮助大型组织管理大型应用程序并避免团队之间的通信开销和依赖性。所以如果你想遵循这种风格,你真的应该有 3 个独立的团队——每个服务一个。这些团队中的每一个都将对各自服务的整个生命周期负全部责任。现在,当您想要进行端到端测试(通常称为集成测试)时,您将建立一个负责这些测试的第四团队。并且您将有一个人担任负责的发布经理,他拥有一个 staging/testing 集群,并决定何时测试证明足以将新版本的服务发布到野外。您的目标应该是在服务的依赖性和发布周期方面尽可能地解耦团队。如果您希望服务团队完全独立,您还可以将集成测试作为每个团队的一部分。这意味着每个团队都有 testing/staging 个集群,每个团队都有一个负责任的 testing/release 经理角色。