如果你是一名测试工程师,你可能在过去一年左右听到了更多关于微服务的信息。这并不奇怪,因为许多软件公司也正在转向更“微服务”的创建软件的方式。这不可避免地带来了很多挑战,特别是如何在微服务世界中实现自动化测试。
“微服务”是软件架构中增加的另一个术语。微服务架构风格涉及开发单个应用程序,这些应用程序可以作为一套小型服务一起工作,每个应用程序都运行在其单个进程中,并与轻量级机制(如HTTP资源API)进行通信。这些服务需要最低限度的集中管理,使用不同的数据存储技术,并且可以用不同的编程语言编写。这些围绕业务功能构建的服务也可以由支持全自动部署的机器独立部署。
SOA与微服务
典型的面向服务的架构(SOA)模型通常具有依赖的企业服务总线(ESB),微服务使用更快的消息传递机制。虽然SOA专注于命令式编程,但微服务架构使用的编程风格主要以响应式角色为基础。虽然SOA模型通常具有过大的RDBMS,但微服务经常使用可连接到传统数据库的NoSQL或micro-SQL等数据库。也就是说,真正的区别在于用于创建一整套服务的体系结构方法。
用于微服务体系结构的实践是基于开发人员为大型企业组织创建软件应用程序所遵循的实践而创建的。开发人员的经验非常便于了解当前最终用户的期望,并有助于在各种设备上创建一致而动态的体验。对可访问性,适应性强,模块化和可扩展性的基于云的应用程序需求量很大。这导致许多开发人员改变他们的方法。
微服务微服务体系结构包含专注于创建完整应用程序或任务的小型服务。微服务的每个实例都代表您的应用程序中的单一责任。真正的好处是,这些服务是相互独立的,这使得它们可以独立部署和测试。
了解微服务
在我们处理如何开始测试微服务之前,让我们定义微服务。最常见的开发风格称为单片设计。
单片应用程序“紧密结合”,或者用一组相互高度依赖的类编写。例如,如果您有两个类(X和Y)并且对X进行了更改,那么这种更改很可能会对Y类产生影响。这是一个简单的示例,大多数单一应用程序由一组类组成相互依赖。如果对这种类型的应用程序进行更改,通常会需要构建和部署整个应用程序的新版本。
相比之下,微服务体系结构由非常小的,非常专注的服务组成,它们在一起时构成最终完整的应用程序或任务。微服务的每个实例代表您的应用程序中的单一责任。
这些服务彼此独立,这使得它们可以独立部署和测试。以下介绍一下如何进行自动化测试的一些方法。
在微服务世界中,需要能够在运行时快速响应并且及时处理生产环境暴露的问题。因此,建立一个关键的监控和警报系统并对生产进行追踪至关重要。如果其中一项服务出现故障或无响应,您需要立即知道。通过在监控的帮助下发现生产期间的问题,您通常可以在用户甚至知道存在问题之前自动回滚到服务的最后一个已知的良好版本。
微服务自动化测试实践
互联网金融企业业务场景复杂,功能点分布广度及深度数量级庞大,为了解决众多业务模块之间的相互调用,保证业务场景链路的完整性及健壮性,企业运用了dubbo技术对各个微服务的接口提供了完整解决方案。
企业的质量控制部门如何去管控每一个微服务的质量,从而形成每一条测试链路的闭环呢?从测试角度来看,企业需要一个针对微服务的测试框架,测试工程师们在框架内实施多种纬度及类型的测试方案,确保测试的可控性,标准化,可持续性。
下面一起探讨一下在工作中使用的一套标准化测试框架。
根据已有情况,我们测试技术支撑团队研发的一款基于Spring & TestNG的Java测试自动化代码开发框架,可测试范围覆盖dubbo service、restful api、数据库(MySQL)、缓存(Cache/Memcached)、消息框架(Kafka/Rabbitmq)、Zookeeper等方面的内容,其目标是构建互联网公司通用的高可用、高扩展测试基础组件。特点概述:
功能丰富 :以Spring开源框架为平台,构建互联网Java后端测试技术栈的通用测试组件框架。
其核心组件包括:测试基础框架、代码生成工具、服务化(SOA)测试框架、restful测试框架、
数据库框架、缓存(redis/memcached)框架、Zookeeoper客户端框架、配置管理框架、
开关框架、消息队列(kafka/rabbitmq)框架等方面的内容;
得心应手 :代码生成工具直接生成自成一套的代码风格,一套基于Java & Spring & TestNG + Maven技术栈的dubbo、restful api测试框架,测试人员只需要编写业务逻辑测试代码&测试数据即可,方便高效快捷;
深度整合 :封装多种数据驱动(TestNG DataProvider)模型,支持多种测试用例管理平台,支持测试结果持久化到db并上报测试数据中心。
其主要模块如下:
项目实践
接下来使用该框架对其中一个微服务实施测试。
第一步,生成maven测试项目模板
1.首先,从git仓库将代码clone到工作环境。
2.解压配置项目信息,打开并编辑项目目录下的 “/bin/config.property”文件
3.运行run.cmd文件,在project.exportPath目录下生成maven的测试项目
4. 将生成好的Maven项目导入你的IDEA中。第二步 编写测试脚本
在第一步生成好的maven测试项目模板中,可以根据生产的demo示例文件来定制你的测试。其中DemoTest.java文件如下:
public class DemoTest extends TestNGBaseTest {
// Get your dubbo service from Spring Ioc container.
// Note that your service should be avaliable in current environmnet, otherwise, it will get nothing.
private IDemoService iDemoService = BeanUtil.getBean("iDemoService");
@Test(dataProvider = "ExcelDataProvider"/* , testName="id" */)
public void doDemoServiceTest(Map testData) throws Exception {
// Get Java Bean Model from excel & json
DemoRequestDTO demoRequestDTO = buildJavaBeanModel(DemoRequestDTO.class, testData, this);
DemoResponseDTO expectedDemoResponseDTO = buildJavaBeanModel(DemoResponseDTO.class, testData, this);
// invode dubbo service
Result result = iDemoService.doD0emoService(demoRequestDTO);
// Assert
Assert.assertTrue(result.isSuccess());
Assert.assertEquals(result.getResult().getId(), expectedDemoResponseDTO.getId());
Assert.assertEquals(result.getResult().getName(), expectedDemoResponseDTO.getName());
}
}
1.测试类DemoTest一定要extends TestNGBaseTest。
2.并且@Test(dataProvider = “ExcelDataProvider”)是选择使用test的数据驱动ExcelDataProvider。
3.此外,如果需要关联testlink中的某一个测试用例,此处需要填写testcase的Id。
4.通过private IDemoService iDemoService = BeanUtil.getBean(“iDemoService”);可以获取到dubbo service的bean defination。
5.当需要Java的实体类DemoRequestDTO的实例时,可以通过调用DemoRequestDTO demoRequestDTO = buildJavaBeanModel(DemoRequestDTO.class, testData, this);来获取。测试数据来源是data-excel下面,与测试类同名的excel文件src/test/resources/data-excel/DemoTest.xlsx,测试方法名字匹配excel中的sheet name。
6.如果excel中出现了某一个变量类型,即${ }中定义的类型,它需要匹配data-json中对应目录下的json文件,该json文件即为该实体类实例的数据信息。
7.通过Result result = iDemoService.doDemoService(demoRequestDTO);调用dubbo service.
8.对实际返回的result, 同期望返回的数据做断言
第三步 执行测试用例及测试报告。
完成编写测试用例后,将用例放入集成环境调度执行。
使用Jenkins可以对测试用例执行进行更好的调度管理,并对运行状态和返回结果进行查看。
同时框架还公布了外部API,以供对接其他平台进行结果展示。使用者可以根据自己的需求自定义自己的报告展示模块。
以上,就是针对dubbo的微服务测试框架。
在Jenkins上我们可以看到历史的执行结果。
作者简介:
就职于甜橙金融信息技术部,质量平台资深开发,致力于用最新的技术开发最好的工具。