开发团队越来越多地选择微服务架构而不是单体结构,以提高应用程序的敏捷性、可扩展性和可维护性。随着决定切换到模块化软件架构——其中每个服务都是一个独立的单元,具有自己的逻辑和数据库,通过 API 与其他单元通信——需要新的测试策略和新的测试工具。
测试微服务是微服务应用程序过程的关键部分:您需要确保您的代码不会在单元内中断,微服务中的依赖项继续工作(并快速工作),并且您的 API 符合定义的协议,然而,由于许多微服务采用持续交付模式构建以一致地构建和部署功能,因此开发人员和 DevOps 团队需要准确可靠的测试策略才能对这些功能充满信心。
那么微服务存在哪些不同类型的测试,它们如何适用于软件的其他领域,它们有什么好处?众所周知的“测试金字塔”可以为接下来这些测试提供一个测试框架。
根据软件工程原理的著名作者 Martin Fowler 的说法,“‘测试金字塔’是一个隐喻,将软件测试分组到不同粒度的桶中。”
金字塔的不同层次定义为:
-
单元测试:测试服务的一小部分,例如类。
-
组件测试:验证单个服务的行为。
-
集成测试:通过测试服务的适配器来验证服务是否可以与基础设施服务(例如数据库和其他应用程序服务)进行交互。
注意:
某些版本的测试金字塔会切换组件测试和集成测试的顺序。
-
端到端测试:验证整个应用程序的行为。
结合多种微服务测试策略可以提高测试覆盖率和对软件的信心,同时也使整体维护更易于管理。
单元测试
单元测试旨在确保服务的最小部分在微服务设计阶段确定的规范内按预期执行。由于微服务将应用程序功能分解为数百个可测试的小型功能组件,因此单元测试会单独且独立地处理每个组件。最好在一个类或一组相关类的级别上进行单元测试。
单元测试可以通过使用测试替身(例如 fakes、stubs、mocks、dummies 和 spies)来切断组件的依赖关系。例如,测试人员可以模拟您的依赖项的响应并“假设他们执行 [X]”,其中 [X] 是正确响应、失败响应等。
组件测试
组件测试验证给定服务是否正常运行。由于范围仅限于整个微服务架构的一部分,组件测试通过隔离系统内的服务来检查所选微服务(可以由几个类组成)的端到端功能,将其依赖项替换为测试双打和/或模拟服务。
您可以为将被划分为测试用例的每个组件创建测试环境。它可能涉及测试资源行为,例如性能测试、确定内存泄漏、结构测试等。
集成测试
集成测试验证独立开发的组件/微服务在连接时是否正常工作。它测试组件之间的通信路径和交互并发现错误。
集成测试的编写和运行变得更加困难和耗时。因此,拥有出色的生产 QA(质量保证)实践将有助于确保顺利进行。
合同测试
在测试金字塔中调用合约测试至关重要。接触测试通过确保它们可以相互通信来检查独立单元(如两个微服务)的兼容性。合同测试测试 API 的工作方式,这是微服务相互交互的方式。
合约测试检查这些微服务的边界和交互,并将它们存储在合约中,然后可以将其用作双方未来如何交互的标准。它要求双方就允许的交互集达成一致,并允许随着时间的推移而演变。
端到端测试
端到端测试(E2E 测试)是最终测试阶段,涉及从头到尾测试应用程序的工作流程以实现完整的用户旅程。
这些测试可以自动化,但 E2E 测试仅针对超关键流进行。它在微服务架构中不能很好地扩展,因为它需要启动许多微服务并将它们连接起来,这对于自动化和维护是具有挑战性的。因此,它仅用于测试特定微服务之间的关键交互。
要使用的微服务测试工具,包括按需登台环境
开发人员和 QA 团队对微服务测试工具有不同的偏好,尤其是对于这些不同类型的测试。以下是一些流行的概要。许多是按需登台环境,它们是动态创建的,由 CI/CD 管道触发。使用按需登台,一旦开发人员完成登台环境,登台环境以及任何配置、环境或安装不一致都会被破坏。
releasehub
该平台是一个按需登台环境,具有可访问的协作共享功能。您可以将应用程序的存储库连接到 Release,然后为每个拉取请求和每次代码推送的更新创建临时环境。此外,可以为集成、传统登台或 QA/UAT 用例创建环境。开发人员和 QA 可以完全访问环境以进行测试和调试,并且产品团队、设计团队和利益相关者可以看到功能的发展并尽早并经常提供反馈。
WebApp.io(以前的 LayerCI)**
WebApp.io 是一个代码审查自动化平台,允许为全栈 Web 应用程序提供按需审查环境。您可以创建自定义拉取请求。一旦您创建了堆栈的一个副本,您可以立即复制它以自动运行 e2e 测试并集成到 CI/CD 工作流中。WebApp 将自动在 GitHub、GitLab 或 BitBucket 中注释您的拉取请求。
Vercel
Vercel 是一个用于前端框架、无服务器功能和静态站点的云平台,旨在与预先存在的内容和数据库集成。它托管的网站和 Web 服务可即时部署、自动扩展且无需监督,所有这些都无需配置。它还提供边缘位置托管和缓存。它类似于 Amazon Web Services (AWS) Lambda 或 Netlify。
Pact
Pact 是一个代码优先的消费者驱动的合同测试工具,适用于编写代码的开发人员和测试人员。它使用合同测试来测试 HTTP 和消息集成——验证应用程序间消息是否符合共同理解的方法,并记录在合同中。这种合同测试方式减少了大型单元测试。
Apache JMeter
Apache JMeter 是测试人员常用的基于 Java 的性能测试工具。它是一个开源平台,可以用作负载测试工具,用于分析和测量 Web 应用程序的性能。
Hoverfly
Hoverfly 是一个自动化的、开源的 API 通信模拟工具,用于专门的集成测试。用户可以测试 API 在速率限制和/或网络延迟等场景中的反应。
Grafana
Grafana 提供免费的指标可视化和分析。仪表板让开发人员可以查看时间序列数据,以观察微服务在实时流量中的响应方式。
Gatling
Gatling 是一个用 Scala 编写的负载测试工具。它可以在多个平台上运行模拟,然后报告活跃用户数量和响应时间等指标。
结论
微服务的测试、调试和维护部分通常是使用微服务架构中最具挑战性但必不可少的部分。希望以上信息可以帮助您了解不同的测试类型和工作的最佳工具。