微服务间的测试策略

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 微服务间的测试策略

640.jpg

在之前的两篇文章中,我们从宏观和微观的不同角度尝试去设计我们的测试策略,在很多团队中,如果着眼于从微观的单体微服务开展测试活动,技术和成本都存在问题。所以我们需要一些可以更快速落地的方法,来保障微服务之间的可用性和稳定性,今天,我们尝试来聊聊这个问题。


01

640.png



如上图的中间图例所示,微服务之间的通信,通常都是通过Rest或者RPC来调用的。不论是基于哪种协议,都需要事先定义好通信接口。对于微服务间的可用性和稳定性测试,往往都是基于接口(Api)来展开的。所以,首先我们要明确团队对于Api的管理机制是什么。目前主要存在以下几种管理方法:


无文档形态:没有事先定义接口,没有接口文档,测试熟悉接口需要自己抓包,研发之间的联调全靠吼。在这种情况下,就不要去纠结服务间的测试策略了,做好上一层的测试策略即可。


手动维护接口文档:简单的,就用Word写与,好一点的,引入Eolinker这类工具。这个阶段的Api管理最大的问题在于文档的有效性。文档描述和实际代码的差别可能会让你怀疑人生。


由插件自动生成:典型的就是引入Swagger框架,程序在定义接口的时候,自动生成Api文档,大家只需要关注Swagger页面即可。在这种情况下,可以适当开展接口自动化测试,并尝试引入其他的测试方法。


综上,如果你的团队还没做好接口管理的准备,那么不建议你花太多的时间在接口测试上,因为你会做得很痛苦。你可以在适当的时候提醒开发去更新接口文档,让文档看起来有用些,而不是形式化。在这两个层面上,建议你还是做好微服务的整体测试策略。如果你的团队处在第三种状态,才有可能去探讨更多的可能性。


02


当下流行的契约测试,可以从本质上解决接口有效性和稳定性的问题。但这个需要研发的配合,需要主管的推动,也需要团队的实践。契约精神并不那么好建立。在介绍契约测试之前,先介绍一种比较另类的玩法,难度不大,但非常有效,是笔者在自己的团队中实践出来的。


640.png


因为从本质上来说,我们是需要关注接口是否发生了变化。如果我们能及时感知接口的变化,那么就可以快速评估它的影响范围(主要是调用方)。基于这个原则,我们做了如上图所示的设计:

  1. 依赖接口测试平台,完成单接口的测试用例测试,当测试用例被成功执行3次后(这个次数是可配置的,主要用于判断接口是否稳定),会把这个接口的入参和返回结构存到一张表中,作为“契约”;
  2. 同时,会把稳定的接口测试用例,放到定时任务中,去被定时执行(我们配置的是每天两次),在定时任务中,测试用例除了常规的检查点外还需要额外匹配对应的“契约”;
  3. 如果结构(人参和出参)没有变化,则验证通过。如果发现结构发生了变化,则需要通知相关人员(可配置,主要是给测试,由测试确认并推动)
  4. 在经过确认后,如果确认是接口需要被变更,则更新契约信息,保证下次验证是最新的内容(页面点击,系统自动同步)

    640.png


是不是很好玩?技术上实现难度也不大。



03

好了,现在我们来聊聊契约测试,顾名思义是基于契约或者使用契约来测试被测系统,其核心是契约,包括如何制定契约,如果更改契约以及如何使用契约等。首先定义契约必须有 API 的消费者(Consumer)和 API 的提供者(Provider)两端,其次契约还要包含这个 API 的 Request 和 Response 的定义细节,见下图:640.png


业界最常用的三个契约测试框架是 Pact,Swagger 和 Spring Cloud Contract。其中 Pact 是一个支持多种语言的框架,包括 Java,JavaScript,Golang,#C 等多种语言开源免费框架,主要通过编写测试代码来动态生成契约,并主要用于消费者驱动契约类型的测试;而 Swagger 主要是通过手动编写契约来做提供者驱动契约类型的测试;最后 Spring Cloud Contract 主要用于基于 Spring 框架开发的 Web 系统,也是主要通过编写测试代码来动态生成契约来做消费者驱动契约类型的测试。并使用契约生成相应的测试用例和自动化测试。


以上,来源于刘冉老师的文章,原文见文末,在这里不展开介绍,笔者也还在团队尝试试行中。后续有机会再总结。


04


在设计微服务间的测试策略时,还有一个需要关注的点,就是测试环境的使用。由于微服务间的依赖问题,可能会存在版本依赖关系,特别是一些外部的依赖,我们希望会有一个稳定的版本(类似用户系统、邮件系统等基础依赖)。那么一般的做法,是先部署一套稳定的全量版本,然后通过路由配置来处理(具体的路由方式需要参考具体的微服务架构)。如下图所示

640.png



如果上面的思路暂时没有技术能力去实现(路由页面配置),还有一个办法,就是建立多套环境,现在基于容器化的环境拉取和回收,也是非常容易实现的(管理好镜像就好),可以和运维多沟通下。


05


至此,关于微服务的测试策略都讲完了,这些策略都是基于笔者的实践总结出来,业内也可能会有更好的方法,欢迎大家一起讨论。针对不同的团队现状,测试Leader选择合适的方法去落地。没有最好,只有相对合适。

刘冉老师关于契约测试的两篇文章:

https://xie.infoq.cn/article/1c490dabcb429209b07e5b456

https://xie.infoq.cn/article/56006dcd3893324e02d2e5c88


往期推荐:

微服务的测试策略

单体微服务的测试策略

你还记得测试策略么

为什么不选JMeter做接口测试?

敏捷测试系列文章合集

相关文章
|
6月前
|
安全 测试技术 持续交付
微服务的测试策略
【8月更文第29天】随着微服务架构的普及,测试变得尤为重要,因为它有助于确保各个独立的服务都能正确运行并且能够协同工作。本文将介绍一种全面的测试策略,包括单元测试、集成测试和端到端测试,以及如何为微服务应用编写这些测试。
226 0
|
前端开发 IDE 测试技术
单体微服务的测试策略
单体微服务的测试策略
149 0
单体微服务的测试策略
|
测试技术 持续交付 微服务
微服务开发的软件过程
本文讲的是微服务开发的软件过程【编者的话】不少同学询问到如何实施微服务,特别是对项目数量增加的担忧。 在支付渠道设计一文中提到,可以按照渠道来划分项目,一个渠道一个项目,有同学认为这会导致项目太多无法管理。 本文要回答这个问题,在微服务中,我们是如何管理项目的,即微服务的软件过程。
1884 0
|
JSON Java 测试技术
挑战:微服务集成测试
原文链接 [https://codefresh.io/docker-tutorial/how-to-test-microservice-integration-with-pact/](https://codefresh.io/docker-tutorial/how-to-test-microservice-integration-with-pact/) # 挑战:微服务集成测试 迁移
1920 0
|
消息中间件 运维 Kubernetes
我在很多情况下不建议盲目使用微服务架构
依托于容器化的普及,Cloud微服务技术当前比较盛行,在以前应该是Dubbo服务,后来慢慢建立了微服务体系,注册中心,分布式配置等各类组件,后面Nefix组件有些开始不维护,再到AlibabaCloud组件,现在很多开源框架、培训机构等依然以这些做一些宣传点。然后从自己的在多个大中小项目和落地的情况,企业运营管理,跟进行业先进技术发展,后期运维效果等多个角度思考,这无形中也会引起另一方面的方向失误
我在很多情况下不建议盲目使用微服务架构
|
缓存 Kubernetes 监控
【微服务】复杂系统:微服务与人类
【微服务】复杂系统:微服务与人类
|
运维 测试技术 微服务
微服务架构—自动化测试全链路设计
微服务架构—自动化测试全链路设计 标签:microServices autoTest mock unitTest testTrace 背景 被忽视的软件工程环节 - DEVTESTOPS 微服务架构下测试复杂度和效率问题 开发阶段 unitTest mock 外部依赖 连调阶段 mock 外部依.
7684 0
|
存储 缓存 测试技术
|
9月前
|
算法 API 数据库
重构单体为微服务
重构单体为微服务
139 0
|
9月前
|
存储 监控 负载均衡
我们是如何让微服务在实践中“活色生香”的?
我们是如何让微服务在实践中“活色生香”的?