微服务下的单元测试和集成测试
Posted 同花顺软件测试圈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务下的单元测试和集成测试相关的知识,希望对你有一定的参考价值。
单元测试
单元测试的价值:
单元测试是一种白盒测试技术,通常由开发人员在编码阶段完成,目的是验证代码中的每个类或者方法是否符合预期,在最早保留问题,排查范围小。
其他更多的好处:
反馈速度快
重构的有力保障
使编码人员更加熟悉代码
单元测试对测试人员来说:
单元测试通常情况由开发人员完成,但是有一些公司和项目也有测试人员完成的例子
在你负责的模块或者服务里,你需要去了解它的设计思路和执行情况,这能帮助你发现单元测试可能存在的问题点,也有利于你设计和执行后续高级别的测试类型
开发不太擅长做测试类的工作,当你掌握单元测试的技能,你便更有机会去帮助和影响到开发人员,有利于你们更好的交流合作,
掌握单元测试技能在测试人员中也会是稀缺技能。所以,掌握单元测试将会获得额外的锻炼机会和个人影响力。
单元测试类型
微服务中最大的复杂性在于服务之间的交互方式,服务与服务之间常常互相调用以实现更复杂的功能。
01
社交型单元测试
测试被测单元时,被测单元会调用服务A和服务B。将被测单元视为黑盒子,直接对其进行测试,这种单元测试称为社交型单元测试。
02
孤立型单元测试
测试被测单元,可以使用测试替身技术来替代服务A和服务B。对象及其依赖项之间的交互和协作被测试替身代替,这种单元测试被称为孤立型单元测试。
测试替身的常用技术
01
桩代码
当在对象上调用特定方法时,会对其进行硬编码(临时代码)的方式来代替真实代码提供固定响应。
02
模拟代码
模拟代码与桩代码类似,它除了替代真实代码的能力之外,更强调是否使用了特定参数调用方法,因此,这种对象成为我们测试结果的基础。
如何开展单元测试
开展单元测试,可以从以下四个步骤来:
01
确定使用单元测试的代码范围
不是所有的代码都要进行单元测试,可以重点关心核心模块代码或底层代码,如重要的业务逻辑代码或通用组件等。
02
确定技术选型
单元测试中的技术框架通常包括单元测试框架、Mock代码框架、断言等。
单元测试框架:常用的是Junit和TestNG。
Mock代码框架:常见的是EasyMock、Mockito、Jmochit、Powermock等
断言:Junit和TestNG自身都支持断言,还有专门用于断言的Hamcrest和assertJ.
03
引入横量单测试覆盖情况的代码覆盖率工具
在Java语言中,常用的覆盖率工具有Jacoco、Emma和Cobertura.
04
接入持续集成工具
接入持续集成工具是为了形成一个工具链,将单元测试、代码覆盖率统计集成在一起。代码提交就可以生成一份单元测试报告,看到各种数据,由此判断代码是否需要修改。
集成测试
集成测试,是软件测试中的阶段,在该阶段中,将各个单独开发的软件模块组合在一起并进行整体测试,以便评估系统或者组件是否符合指定的功能要求。
微服务架构下需要针对不同服务的不同方法之间的通信情况进行相关测试。集成测试通常关注验证与外部组件通信的子系统或者模块。目的是验证子系统或模块是否可以与外部组件正常通信。
微服务架构下的集成测试
微服务架构下的及策划那个测试主要包括两部分:
网关组件层:微服务的组件与外部服务的通信路径;
数据持久层:数据库访问模块与外部数据库的交互;
网关组件层集成测试
举个例子,我们要测试登录服务,该服务需要知道当前时间,而时间是由一个外部的时间服务提供的。当我们向时间服务发出Get请求时,状态码为200,返回成功。
如果访问的URL错误,比如当我们向时间服务发出Get请求时,状态码为404,返回错误提示。
一般来说,集成测试负责检测与外部服务的连接以及交互协议的相关问题,如SSL处理的异常或者响应不匹配等。所有错误处理逻辑都需要在测试中被覆盖,以确保使用的服务和协议客户端在特殊情况下能够按预期响应。
数据持久层集成测试
数据持久层的结果会被保存在存储系统上并被持久化,每次测试的执行都可能因为更改了数据而对后续测试的执行产生影响。一般情况,我们应该保证两次测试之间的外部因素是相互独立的。
为了保障两次测试的独立性,常见的步骤是:
1、执行测试前,先回退到数据库到一个已知的状态。
2、通过插入对测试来说已知的数据来重建数据库。
3、进行相关的测试。
常见的问题及其解决策略
01
服务不可用
微服务虚拟化技术可以解决这个问题。它可以通过创建代理服务实现对依赖服务的模拟,特别适合测试服务之间的通信。常见的工具:Wiremock、Hoverfly、Mountbank等。
02
服务超市&响应慢难构造
借助各种工具比较方便,常见的工具:Fiddler、Document、Clumsy等。
Wiremock也支持延迟,withFixedDelay()可以实现固定延迟的效果。
使用withLogNormalRandomDelay()可以实现随机延迟的效果。
03
数据初始化和构造的成本高
使用现成的持久化测试框架,常见的框架有:NoSQLUnit、DBUnit等。
DBUnit的设计理念是;在测试之前备份数据库,在插入测试数据,测试完毕,再读入备份数据库,初始化到测试前的状态。
NoSQLUnit是用类似的方式来编写NoSQL数据库测试,支持多种NoSQL数据库。
以上是关于微服务下的单元测试和集成测试的主要内容,如果未能解决你的问题,请参考以下文章