微服务间的测试策略

简介: 微服务间的测试策略

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做接口测试?

敏捷测试系列文章合集

相关文章
|
4月前
|
敏捷开发 测试技术 API
测试金字塔:构建高效自动化测试策略的基石
测试金字塔:构建高效自动化测试策略的基石
368 116
|
4月前
|
设计模式 前端开发 测试技术
告别脆弱:构建稳定UI自动化测试的3个核心策略
告别脆弱:构建稳定UI自动化测试的3个核心策略
493 113
|
4月前
|
测试技术 持续交付 API
测试的艺术:掌握测试金字塔,构建高效测试策略
测试的艺术:掌握测试金字塔,构建高效测试策略
308 77
|
4月前
|
测试技术 API 数据库
测试金字塔:构建高效自动化测试策略的基石
测试金字塔:构建高效自动化测试策略的基石
397 114
|
4月前
|
敏捷开发 前端开发 测试技术
测试之道:重构你的测试策略 - 测试金字塔模型
测试之道:重构你的测试策略 - 测试金字塔模型
420 118
|
5月前
|
测试技术 微服务
使用Istio实现流量镜像:提升微服务测试的利器
使用Istio实现流量镜像:提升微服务测试的利器
255 99
|
8月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
496 102
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
如何让AI更“聪明”?VLM模型的优化策略与测试方法全解析​
本文系统解析视觉语言模型(VLM)的核心机制、推理优化、评测方法与挑战。涵盖多模态对齐、KV Cache优化、性能测试及主流基准,助你全面掌握VLM技术前沿。建议点赞收藏,深入学习。
1390 8
|
7月前
|
JavaScript 前端开发 测试技术
Playwright自动化测试系列课(4) | 异步加载克星:自动等待 vs 智能等待策略深度解析​
本文深度解析Playwright自动化测试中的等待策略,对比自动等待(零配置防御机制)与智能等待(精准控制异步场景)的核心差异。通过实战案例讲解等待机制的选择标准、常见失效原因及调试技巧,帮助开发者有效解决页面异步加载问题,提升测试脚本的稳定性和执行效率。
|
8月前
|
测试技术 Python
Python测试报告生成:整合错误截图,重复用例执行策略,调整测试顺序及多断言机制。
如何组织这一切呢?你可以写一本名为“Python测试之道”的动作指南手册,或者创建一个包含测试策略、测试顺序、多断言机制的脚本库。只要你的测试剧本编写得足够独到,你的框架就会像一位执行任务的超级英雄,将任何潜伏于代码深处的错误无情地揪出来展现在光天化日之下。这些整理好的测试结果,不仅有利于团队协作,更像冒险故事中的精彩篇章,带给读者无尽的探索乐趣和深刻的思考。
192 10