微服务架构和基于容器的基础设施的组合需要一个适合这个美丽新世界的测试策略。微服务架构对在线(远程)依赖项的依赖较多,而对进程内组件的依赖较少,您的测试策略和测试环境需要适应这种变化。
在线通信越多,测试微服务之间的连接和契约所需的精力就越多。此外,在迁移到基于容器的基础设施时,可以使用若干新的测试技术来处理采用微服务时经常出现的组件依赖。
从上市时间、成本和风险的角度选择测试技术。
当使用服务虚拟化等技术测试单体应用时,您不必同时测试所有内容。相反,您可以分而治之,测试单个模块或或一组关系密切的组件。您可以创建安全的隔离环境让开发人员测试他们的工作。在测试单体应用时,使用 服务虚拟化 让您可以将测试环境与相关组件解耦,并减少以下问题的影响:
当使用微服务时,您的选择更多,因为微服务通常部署在容器(如 Docker)环境中。在微服务架构中,您的团队可能会使用更广泛的测试技术。此外,由于微服务更多地通过网络进行通信,所以需要更彻底地测试网络连接的影响。使用更适合新架构的工具和技术可以缩短上市时间,降低成本和风险。
许多 IT 部门使用或维护着采用单体架构开发和部署的系统。典型的单体架构具有以下特点:
应用程序开发人员的组织结构经常会影响代码和测试环境的组织方式;这种效应被称为 康威定律 。通常,代码会被分成几个组件层,如 UI、服务和存储库。每个层都是一个单体,它们将被部署到共享环境中,通常包括开发、QA 和用户验收测试(UAT),参见图 1。
许多单体系统都是由职能竖井团队构建的,例如,运营团队是一个单独的实体,有单独的时间表。向这样的组织引入容器化方法需要做出变革,这可能会非常耗时,因为它涉及提供新的基础设施、培训员工以及为迁移到新方法创建迁移计划。
这意味着,从单体架构中解耦依赖项的技术常常局限于那些不需要容器的技术,它们运行在进程中,或者是在运营团队提供的已有的 VM 或硬件上。不需要容器化的技术包括:
根据康威定律,沟通模式复杂的职能竖井团队会创建出通信模式同样复杂的单体。这意味着用于服务虚拟化的工具必须非常强大,能够支持复杂的工作流和许多技术(例如,许多通信协议),这取决于被测系统(单体应用程序)的复杂性和测试用例的复杂性。
通常,会有一个单独的团队负责创建后端或第三方服务的 stub、mock 或虚拟服务。这经常会在负责服务虚拟化的团队中引起工作冲突,导致测试基础设施准备时间很长,维护成本很高。
在微服务架构中,你会发现:
这将影响到使用什么技术解耦微服务及其依赖项来达到测试目的。由于不需要满足所有团队需求的同构技术栈,所以每个团队通常都有更多满足其特定需求的选项可以选择。
对于微服务测试,解决方案主要是那些可以用于单体架构的解决方案(它们也适用于微服务)以及那些专门为微服务架构而设计的解决方案。
可用于单体架构的方法包括:使用 测试替身 ,如 stub 、 stub 或 虚拟服务 ;连接到后端或第三方系统的实际测试实例;契约测试。
可用于微服务架构的方法有 测试容器 (如 数据库测试容器 、 服务虚拟化测试容器 )、第三方服务测试容器(如 Redis 测试容器、ESB 测试容器或虚拟设备测试容器)和 把遗留单体应用装盒 。
关于如何编写微服务测试策略的文章和演讲已经有很多。下面是一些资源,供参考:
您将使用许多用于单体架构的测试技术,并涉及容器的新技术。然而,不同测试技术的适用性可能会发生变化,因为微服务架构中的反馈循环更紧密,因为团队通常在一起并且是跨职能的。
上面列出的参考资料有一个共同的主题,即您需要管理相关组件,以便在测试微服务时可以有效地利用时间及控制成本。根据需要,您可以选择本中列出的其中一个选项,或者多个选项的组合。
用于微服务测试的测试环境可能使用真正的依赖项,而不是测试替身。
在测试场景中,微服务可以与以下几种组件类型通信:
除了上面列出的组件外,接下来,我们将列出可以在微服务测试中使用的特定于测试的依赖组件。
当然,您可以在微服务测试中使用所谓的 测试替身 ,它们会冒充真正的依赖项。你有几种技术可以选择,这取决于依赖项的类型和手头的问题:
在使用类似微服务这样的松耦合组件时,契约测试是一个关键部分。
契约描述组件之间如何通信和交互,包括组件之间的消息格式(语法)和组件的行为预期(语义)。您可以使用契约测试来验证组件之间的契约是否得到执行,从而使您相信这些组件能够协同工作。当您使用特定于测试的依赖组件(例如测试替身)时,您还可以使用契约测试来确保它们符合最新的或任何特定版本的契约。以下是测试或管理组件之间的契约的几种方法:
在测试微服务时,有许多管理依赖组件的技术。本文给出的信息应该可以填补一些空白,并帮助您定义开发和测试策略(包括 测试金字塔 )。
在第二部分中,我们将基于团队的成熟度、变化速度、上市时间、成本和风险来比较这些技术。
如果您发现本文有任何不清楚的地方,或者您有任何特定于项目的担忧或问题,请通过邮箱联系作者 Wojciech Bulaty (wojtek@trafficparrot.com)和 Liam Williams(Liam Williams at liam@trafficparrot.com )。
Wojciech Bulaty 专注于敏捷软件开发和测试架构。他在敏捷、自动化、XP、TDD、BDD、结对编程和整洁编码方面有十多年的实际编程和领导经验。他最新提供的服务是 Traffic Parrot ,通过提供 API mocking 和服务虚拟化工具帮助使用微服务的团队加速交付、提高质量和缩短上市时间。
Liam Williams 是一位自动化专家,专注于使用高质量的软件解决方案改善容易出错的手工流程。他是一个开源贡献者和 一些小型库的作者 。最近,他加入了 Traffic Parrot 的团队,将注意力转向了迁移到现代微服务架构时测试体验的改善问题上。
Testing Microservices: Overview of 12 Useful Techniques - Part 1