单体微服务的测试策略

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

640.jpg

随着业务复杂度的提升,技术架构的微服务化已经非常普遍了,如何针对微服务化的产品进行测试,也有了很多的测试策略可以做选择,但是对于单体微服务的测试方案,却比较少有人提起。本文来聊聊这方面的测试策略。


01


640.png


如上图,从技术架构的角度上看,现在的多数产品是由前端组件+Nginx代理+各类微服务+数据层+系统层及一些外部依赖构成的。针对这个级别的测试策略,就非常的多了,本文暂不展开讲,后续再讨论。

 

如果把微服务拆开,只关注微服务之间的关联关系,这层是接口测试重点关注的对象。多个微服务通过REST/RPC协议进行调用,测试通过接口调用来模拟,完成对应功能的测试,也诞生了类似契约测试的方法论。

 

再往下拆分,针对单体的微服务,我们如何着手测试?大部分人可能就会归结为单元测试,因为到了这一层,很难有完整的业务需求被实现,测试难度也会大增(毕竟很多测试是不会看代码的)。从ROI上来说,效果可能会不理想。但如果做好了,对系统的可测试性和质量保障会有质的提升。


02

640.png


针对单体的微服务,可以从4个层次来做测试。


请求资源层:一般情况下在Controller层实现,这里关注的是服务如何对外提供服务,是Rest协议还是RPC协议?请求方法是否符合规范,还是只有一种POST请求?(关于Post请求和Restful API的争论,笔者更倾向于后者,但也不争论,看团队的情况)。同时,还要关注是否有鉴权行为。这里还需要关注一些非业务的请求处理,比如需要写到日志系统里的信息,其他非业务需要的接口(如健康检查、配置上报与获取之类的),这部分的测试往往很容易被忽略。如果出问题,在业务上也比较难被发现,甚至发现不了。

 

业务逻辑+数据处理:一般情况是在Service层和Entity层这里是业务逻辑处理的实体,大部分的业务逻辑都在这里被实现,这里也是我们常讲的单元测试的重点区域,目前支持单元测试的工具也非常的多,常见的有Junit5,TestNG以及一些框架自带的功能。单元测试除了是一种有用的测试策略外,还是一种强大的设计工具,尤其是与测试驱动开发相结合。

 

数据存储:指的是与数据库交付的场景,这里会见了的问题一般是数据连接不上,网络波动等。这种场景虽然很难出现和模拟,但我们需要对这些异常做充分的处理,以便当问题真的出现时,能够快速定位到。同时,为了程序的健壮性,也可以做出一些容错处理。

 

外部依赖:由于业务上的需要,每个微服务可能会去访问其他微服务,在这里,要注意避免网络隔离引起的错误(在容器化的部署环境下,网络问题更为复杂,需要特别关注),同时还要考虑网络延迟和中断引发的业务问题,需要被更优雅的处理,避免出现数据不一致的情况出现。特别是当依赖的内容不是本系统,而是其他系统时,更要注意数据一致性的问题。

 

03


有人可能会有疑问:有必要测试得这么细?业务测试都来不及,而且这些看起来和业务也没什么关系,不是一直强调交付价值嘛,这有什么价值?个人认为,细致的微服务测试对测试的价值有以下几点:


1. 更清晰地了解业务实现:现在的微服务架构非常复杂,许多测试场景并不能通过简单的前端场景就能覆盖到,典型的业务比如查询,在以前,查询数据就是从数据库里来,但是现在,可以存放数据的来源非常得多,除了数据库,还有可能是Redies,ES,文件等等,如果不了解这些实现,就很难去做针对性地覆盖;


2. 更好的定位问题:测试人员还是应该学会如何更好地去定位问题,既提高了自己的能力,也提升了对团队的影响力,不好么?


3. 避免遗漏场景:比如上文提到的请求资源和外部依赖,很难从更上层去验证,如果从单服务的角度来看,就很容易被验证。


4. 更好地交流:与开发共同频的交流,而不是别人说什么你都不知道,也容易被忽悠。


5. 提升自己的能力,拓宽自己的思路,这点就不细说了吧。

 

所以,在允许的情况下,多做一些这类的测试,也是个不错的选择。千里之堤,溃于蚁穴,质量的构建也是从这点点滴滴积累起来的。

 

但是这里也需要注意一点,并不是所有的单体微服务都需要这么认真的去测试,因为有些微服务的功能相对单一,或者是一些业务逻辑不是很复杂的服务,可以不需要过多的关注。在执行此类测试时,需要注意选择合适的微服务去验证。


04


关于单元测试,在整理资料的时候,遇到一个词:test doubles,说的是什么呢,指的是为了达到测试目的并且减少被测试对象的依赖,使用“替身”代替一个真实的依赖对象,从而保证了测试的速度和稳定性。这不就是我们常说的Mock吗?原来还是自己想简单了。


test doubles一般会包含4类:Dummy、Fake、Stub和最常见的Mock。举一个简单的例子来说明下。


当我们有个业务需要访问通过数据库查询信息或者插入数据时:

Fake:我们可以直接fake一个数据库(现在很多IDE都会带)

Stub:我们向这个fake的数据库中插入3个数据,就可以直接获取这三个数据的返回值(可以理解为硬编码只返回这三个值)

Mock:插入数据时,我们只关注是否调用了插入数据这个接口,至于调用之后的预期结果是否正确,那不是我们关心的事,那是提供这个接口的人应该关心的事儿,

Dummy?Dummy一般是直接定义一个对象就好了。

 

现在,你的思路是不是被打开了?测试是不是可以更好玩?其他两类测试,我们,下次再聊。


参考内容:https://martinfowler.com/articles/microservice-testing/


往期推荐:

为什么选JMeter做接口测试?

我理解的敏捷是什么

敏捷研发想表达什么

在职场上拥有选择的权力

敏捷测试系列文章合集

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