微服务间的测试策略

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

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

敏捷测试系列文章合集

相关文章
|
14天前
|
敏捷开发 监控 测试技术
软件测试中的敏捷实践:提升效率与质量的双重策略
在快速迭代的软件研发环境下,敏捷测试以其灵活性和高效性成为提升产品质量的关键因素。本文深入探讨了敏捷测试的核心理念,并结合具体案例分析,揭示如何在软件开发周期内实现持续的质量监控,以及如何通过自动化测试工具和团队协作提高测试效率。文章旨在为读者提供一套实用的策略和方法,以适应不断变化的市场需求,确保软件项目的成功交付。
36 3
|
4天前
|
运维 监控 测试技术
漫谈测试策略
本文以团队内约定俗成的测试策略概念为主题,总结了一些个人经验和思考结论,可能对其他业务/团队而言,存在术语定义不一致,希望对大家有参考意义,欢迎探讨,感谢理解。
|
1天前
|
网络协议 网络安全 Python
电脑中 TCP/UDP 端口是否开放的测试:令人意想不到的神奇策略等你发现!
【8月更文挑战第19天】在网络管理和维护中,常需确认TCP/UDP端口是否开放以确保服务运行顺畅。端口如同计算机对外通信的“门”,TCP提供可靠连接,UDP则快速但无连接。测试端口是否开放的方法多样:可用`telnet`测试TCP端口,如`telnet localhost 80`;UDP测试较复杂,可用`nc`工具,如`nc -u -z localhost 53`。此外,也有在线工具可供选择,但需确保其安全性。
|
7天前
|
测试技术
探索软件测试的奥秘:如何构建有效的测试策略
在软件开发的海洋中,测试是确保航船不沉没的灯塔。本文将带你领略测试的魅力,从基础概念到高级策略,我们将一起航行在软件测试的广阔海域,探寻那些隐藏在代码深处的秘密。准备好了吗?让我们启航吧!
21 1
|
11天前
|
安全 测试技术 UED
探索软件测试的艺术:从基础到高级策略
在数字化时代的浪潮中,软件测试不仅是保障产品质量的守门人,也是推动技术创新的催化剂。本文将带领读者穿越软件测试的丛林,从基础的概念理解到高级的测试策略,揭示如何通过精准的测试实践来优化产品性能和用户体验。我们将一起探索自动化测试的魅力,性能测试的挑战,以及安全测试的重要性,最终实现从测试新手到专家的华丽转变。
18 2
|
13天前
|
Prometheus 监控 Java
微服务架构下的服务治理策略:打破服务混乱的惊天秘籍,开启系统稳定的神奇之门!
【8月更文挑战第7天】微服务架构将应用细分为可独立部署的小服务,提升灵活性与可扩展性。但服务增多带来治理挑战。通过服务注册与发现(如Eureka)、容错机制(如Hystrix)、监控工具(如Prometheus+Grafana)、集中配置管理(如Spring Cloud Config)和服务网关(如Zuul),可有效解决这些挑战,确保系统的高可用性和性能。合理运用这些技术和策略,能充分发挥微服务优势,构建高效应用系统。
27 1
|
14天前
|
测试技术 持续交付
探索式测试:一种高效且灵活的软件质量保证策略
在快速迭代和持续交付的软件开发环境中,传统的测试方法往往难以应对日益增长的测试需求。探索式测试作为一种灵活而高效的测试实践,强调测试人员的个人技能和经验,鼓励在测试过程中不断探索和学习。本文将介绍探索式测试的核心概念、实施步骤以及如何将其与传统测试方法相结合,以提升软件质量和测试效率。
|
15天前
|
敏捷开发 设计模式 JSON
自动化测试中的代码复用策略
【8月更文挑战第5天】在软件测试的世界中,自动化测试的高效性与代码的复用性息息相关。本文将深入探讨如何在自动化测试中实施代码复用的策略,包括模块化、封装以及数据驱动测试等方法。通过具体的代码示例,我们将展示如何将这些策略应用到实际的测试框架中,以提升测试代码的可维护性和扩展性。
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
探索软件自动化测试的未来:AI驱动的测试策略
【7月更文挑战第47天】 随着人工智能(AI)技术不断进步,其在软件测试领域的应用也日益广泛。本文将探讨如何整合AI技术与现有的自动化测试流程,提出一个面向未来的测试策略。文章重点分析了AI在测试用例生成、执行、结果分析和持续集成中的作用,同时预测了这种技术融合对测试工程师角色的影响,以及它如何提高软件测试的效率和准确性。
|
5天前
|
Kubernetes 监控 Java
发布策略:蓝绿部署、金丝雀发布(灰度发布)、AB测试、滚动发布、红黑部署的概念与区别
发布策略:蓝绿部署、金丝雀发布(灰度发布)、AB测试、滚动发布、红黑部署的概念与区别
18 0