传统测试模型抽象
上图中的服务器端包括n个功能,传统服务是所有的功能都部署在一台机器上,通过增加服务器数量来扩容!参考下图(每一种颜色代表一个功能,部署了四套同样的服务)
微服务测试模型抽象
微服务不同于传统测试,它往往没有UI页面,我们需要通过构建请求(通过编码或者工具模拟)调用各个服务接口。微服务是以业务为单位进行部署的,上图中的每一个服务代表一个功能,不同的业务部署在不同的服务器上,业务使用频繁的还可以使用更多的资源进行部署(下图中橘黄色部署了5个单元,而玫红色只部署了1个单元),这样就可以更合理的利用资源了。
微服务的主要测试内容
- 单元测试:从服务中最小可测试单元视角验证代码行为符合预期,以便测试出方法、类级别的缺陷。
- 集成测试:验证当前服务与外部模块之间的通信方式或者交互符合预期,以便测试出接口缺陷。
- 组件测试:将测试范围限制在被测系统的一部分(一般是单个服务),使用测试替身(mock)将其与其他组件隔离,以便测试出被测代码的缺陷。
- 契约测试:验证当前服务与外部服务之间的交互,以表明它符合消费者服务所期望的契约,本质验证接口规范
- UI测试:传统的点点点页面测试。
其中,集成测试、组件测试和契约测试是我们的测试重点,而上述三种测试,我们可以理解为接口测试(关于什么是接口测试这里就不再详细介绍了)。即每个服务提供对外接口,然后我们通过这个接口对服务进行调用,最后验证其返回值是否达到预期!我们可以通过编码或者工具来构建接口并向接口发起请求,然后按照接口文档来校验响应是否符合预期。
微服务测试注意事项
微服务可以分为无依赖的服务和有依赖的服务。
- 无依赖的服务:自己就能够满足调用者的需求提供完整的服务功能,无需其他服务提供功能。我们直接对该服务提供的接口进行测试即可
- 有依赖的服务:自己不能够满足调用者的需求,需要其他服务提供某一种或多种功能,一起向调用者提供完整的服务功能。此时我们需要隔离掉单个微服务依赖的其他微服务,避免测试过程中受到依赖服务的影响(如服务不可用、服务缺陷等)而出现阻塞测试过程、测试无效等情况。通常使用mock技术将被测服务与依赖的服务进行隔离,使得服务链路稳定、环境可控,这有利于测试过程的开展。Mock概念起源于单元测试,单元测试中我们只关注被测的单元,而不关心其他依赖的内容。Mock让我们有了一套仿真的环境,不用担心在检查单元内的内部流转的过程时还会因为环境的关系导致验证过程失败。由于外部环境的多样性,单元测试应该设计一些异常场景使得代码能够捕获该异常。例如在下图a中,如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例,该方案的成本极高。一种替代方案就是使用mock,如图b所示,我们只需要规定 Mock B 和Mock C 在接收到A的请求后给出对应的响应即可(无需在Mock B 和Mock C中执行复杂的逻辑运算)。在代码实现层面,我们可以通过mockito(针对java)实现mock操作。
图a
图b
在微服务测试中mock的服务又是什么呢?举个例子,我们把支付功能做成微服务,该服务负责处理支付的逻辑,而在最后付款时,我们需要调用支付宝来完成付款。那么这个场景该如何处理呢?简单方式,我们花一分钱真实的购买服务。那么假设我们要验证10000元购买服务呢?或者当支付宝出错时,我们的程序又该如何处理呢?在这里我们就可以把支付宝作为一个mock服务,核心实现思路如下:
对应用的请求进行解析,并返回预先定义好的响应值,具体如下:
支付请求校验正确,返回支付成功;
支付请求校验失败,返回支付失败;
关掉支付宝mock服务,可以模拟支付宝异常
我们可以使用wiremock来搭建自己的mock服务器,简单原理如下图所示:
我们需要在配置文件中设置预定义的请求,如果应用的请求符合预定义请求则返回预定义的响应。然后启动wiremock来实现请求的处理,wiremock就是一个web服务器!具体详情请参考:https://github.com/tomakehurst/wiremock
微服务测试总结
如果你只做UI功能测试,那么微服务测试与传统测试没有区别,因为你只你感受不到架构的变化。
对各个微服务提供的接口测试本质上等价于接口测试。需要按照微服务的接口说明文档进行接口功能以及性能和安全的测试。
必要时需要通过mock方式来模拟微服务所依赖的服务来提升被测服务的可测性。
要关注负载均衡,测试请求是否分发到多点应用。参考文章:微服务性能测试的关键——IP欺骗技术
通过工具 SpringCloud Sleuth、 Turbine、Prometheus对各个服务消耗的资源(包括:cpu、内存、磁盘,网络)进行监控;
通过ELK( ElasticStack )来集中化管理日志。参考文章:微服务测试的关键——通过ELK查询日志
理解微服务的核心概念。参考文章:一文搞定微服务测试本质