面向微服务的自动化测试框架

    

     如果你是一名测试工程师,你可能在过去一年左右听到了更多关于微服务的信息。这并不奇怪,因为许多软件公司也正在转向更“微服务”的创建软件的方式。这不可避免地带来了很多挑战,特别是如何在微服务世界中实现自动化测试。

     “微服务”是软件架构中增加的另一个术语。微服务架构风格涉及开发单个应用程序,这些应用程序可以作为一套小型服务一起工作,每个应用程序都运行在其单个进程中,并与轻量级机制(如HTTP资源API)进行通信。这些服务需要最低限度的集中管理,使用不同的数据存储技术,并且可以用不同的编程语言编写。这些围绕业务功能构建的服务也可以由支持全自动部署的机器独立部署。

SOA与微服务

    典型的面向服务的架构(SOA)模型通常具有依赖的企业服务总线(ESB),微服务使用更快的消息传递机制。虽然SOA专注于命令式编程,但微服务架构使用的编程风格主要以响应式角色为基础。虽然SOA模型通常具有过大的RDBMS,但微服务经常使用可连接到传统数据库的NoSQL或micro-SQL等数据库。也就是说,真正的区别在于用于创建一整套服务的体系结构方法。

    用于微服务体系结构的实践是基于开发人员为大型企业组织创建软件应用程序所遵循的实践而创建的。开发人员的经验非常便于了解当前最终用户的期望,并有助于在各种设备上创建一致而动态的体验。对可访问性,适应性强,模块化和可扩展性的基于云的应用程序需求量很大。这导致许多开发人员改变他们的方法。

    微服务微服务体系结构包含专注于创建完整应用程序或任务的小型服务。微服务的每个实例都代表您的应用程序中的单一责任。真正的好处是,这些服务是相互独立的,这使得它们可以独立部署和测试。

了解微服务
    在我们处理如何开始测试微服务之前,让我们定义微服务。最常见的开发风格称为单片设计。
    单片应用程序“紧密结合”,或者用一组相互高度依赖的类编写。例如,如果您有两个类(X和Y)并且对X进行了更改,那么这种更改很可能会对Y类产生影响。这是一个简单的示例,大多数单一应用程序由一组类组成相互依赖。如果对这种类型的应用程序进行更改,通常会需要构建和部署整个应用程序的新版本。
    相比之下,微服务体系结构由非常小的,非常专注的服务组成,它们在一起时构成最终完整的应用程序或任务。微服务的每个实例代表您的应用程序中的单一责任。
    这些服务彼此独立,这使得它们可以独立部署和测试。以下介绍一下如何进行自动化测试的一些方法。

 

 

 

  • 单元测试
        微服务结构复杂,因为你有许多独立的服务以很多方式与其他独立服务进行通信。开始测试自动化工作的好地方是直接单独测试特定微服务的功能。通常这很容易通过使用REST API与您的服务进行交谈以及某种模拟来让您单独测试服务,而无需与其他服务进行任何类型的集成。
        单元测试的范围是服务的内部。就测试量而言,它们是最多的。理想情况下,单元测试应该是自动的,取决于开发语言和服务框架。但是当您更改和部署服务X时会发生什么?它将如何影响Y或A的服务?你怎么知道你没有破坏什么?您不仅应该确保您的服务本身在运行,还需要确保其他正在使用您的服务的人员不会受到您的更改的影响。
  • 合同测试
        合同测试应将每项服务视为一个黑匣子,所有服务必须独立调用,并且必须验证其响应。该服务的任何依赖关系必须是允许该服务运行但不与任何其他服务交互的存根。这有助于避免可能由外部调用导致的任何复杂行为,并将重点放在对单个服务执行测试上。即使服务发生变化,每个消费者也必须从服务中获得相同的结果。应该可以灵活地在后面添加更多的功能。但是,这些添加不能破坏服务功能。如果服务是以这种方式设计的,它将在更长的时间内保持健壮,并且消费者不需要修改他们的代码以考虑稍后做出的改变。
  • 端到端测试
        由于我们知道每个微服务都是独立的,并且可以通过多种方式独立使用,所以“应用程序”的概念几乎成为这种环境中的幻想。因此,采用典型的端到端测试自动化策略并不像其他软件架构那样有效。
        因此,提出一种涵盖真实用户可能执行的所有可能工作流程的传统端到端测试方法并不真正奏效。您可以使用80/20规则来确定您认为常见的核心旅程,但您可能不希望花费精力试图在此级别考虑所有端到端可能性。
        端到端测试验证整个过程流程是否正常工作,包括所有服务和数据库集成。彻底测试影响多种服务的操作可确保系统作为一个整体协同工作并满足所有需求。多种行为驱动框架可以通过抽取用户故事并验证系统的行为如预期来帮助实现功能测试的自动化。
        实践中不可能知道用户使用你的服务的所有方式。使用用户驱动的合同模型,用户有责任提供一套测试,指定需要什么类型的交互以及以何种格式。然后,您的服务将同意这份合同并确保它没有损坏。这消除了对其他服务的依赖。这种方法还使您能够验证合同是否在交付时完成。
  • 用户界面UI/功能测试
        用户界面测试是用户使用角度最高级别的测试,这个级别的测试必须像用户试图与系统进行交互。所有数据库,接口,内部和第三方服务必须无缝协作才能产生预期结果。

    在微服务世界中,需要能够在运行时快速响应并且及时处理生产环境暴露的问题。因此,建立一个关键的监控和警报系统并对生产进行追踪至关重要。如果其中一项服务出现故障或无响应,您需要立即知道。通过在监控的帮助下发现生产期间的问题,您通常可以在用户甚至知道存在问题之前自动回滚到服务的最后一个已知的良好版本。

微服务自动化测试实践

 

    互联网金融企业业务场景复杂,功能点分布广度及深度数量级庞大,为了解决众多业务模块之间的相互调用,保证业务场景链路的完整性及健壮性,企业运用了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并上报测试数据中心。
其主要模块如下:

 

  • core : 核心基础框架,包含上下文Context, Exception等.
  • config :配置框架,制定classpath下的配置文件读取规范。
  • tools: 代码生成工具,一键生成基于gradle/maven的测试代码框架。
  • http: http服务接口测试框架。
  • rpc: dubbo服务接口测试框架。
  • db: 数据库(MySQL)客户端框架。
  • cache: 缓存(redis/memcached)客户端框架。
  • test: 基于TestNG二次开发的测试框架,并与测试用例平台相结合。
  • zkclient: 基于开源Curator Framework的Zookeeper客户端框架。
  • logger: 统一日志框架,集成logback, log4j, slf4j等。
  • mq : 基于kafka/rabbitmq中间件的消息队列客户端
  • plugin : 基于Spring schema扩展特性的测试插件,提供环境/系统变量前置等功能。
  • mocker: mocker service平台的java sdk.
  • atpclient: 自动化测试平台java sdk。

项目实践

接下来使用该框架对其中一个微服务实施测试。

第一步,生成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<String, String> 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<DemoResponseDTO> 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上我们可以看到历史的执行结果。

 

 

 

 

作者简介:

就职于甜橙金融信息技术部,质量平台资深开发,致力于用最新的技术开发最好的工具。

  • 58
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
全套微服务架构,视频学习java微服务架构,包括如下 第1章 微服务简介 001构建单体应用 002微服务解决复杂问题 003微服务的优点 004微服务的缺点 第2章 Linux使用 005Linux 简介 006Linux 与 Windows 比较 007安装 Linux 008Linux 远程控制管理 009Linux 目录结构 010操作文件目录 011系统管理命令 012开关机命令 013压缩命令 014Linux 编辑器 015修改数据源 016常用 APT 命令 017Linux 用户和组管理 018查看目录和文件的权限 019更改操作权限 020安装 Java 021安装 Tomcat 022安装 MySQL 023部署项目 第3章 Docker实战开发 042设置镜像标签 024Docker 简介 025Docker 功能特点 026Docker 系统架构 027Docker 安装 028第一个 Docker 应用程序 029运行交互式的容器 030后台运行与停止容器 031Docker 客户端帮助命令 032运行 Web 容器 033指定 Web 容器映射端口 034查看容器进程 035查看容器状态 036批量移除容器 037Docker Hub 镜像仓库 038获取镜像 039查找镜像 040更新镜像 041创建和移除镜像 043安装 Tomcat 044安装 MySQL 045部署项目 046数据卷简介 047创建数据卷 048备份数据卷 049恢复数据卷 050Docker Compose-安装 051Docker Compose-使用 第4章 使用 GitLab 托管代码 055GitLab简介 056GitLab 安装 057GitLab 设置 058GitLab 账户管理 059GitLab 使用-HTTP 060GitLab 使用-SSH 第5章 Spring Boot 061Spring简史 062 Spring Boot 简介 063 第一个 Spring Boot 应用程序 064 Spring Boot 自定义 Banner 065 Spring Boot 配置 066 Spring Boot Starter POM 067 Spring Boot 日志配置 第6章 集成 MyBatis 068Thymeleaf简介 069 第一个 Thymeleaf 模板页 070 集成 Druid 数据源 071 集成 TkMyBatis 简化 MyBatis 操作 072 集成 PageHelper 分页插件 073 使用 MyBatis Maven Plugin 自动生成代码 074 集成 MyBatis-测试查询 第7章 项目实战 075项目简介 076 创建依赖管理项目 077 创建通用工具项目 078 创建数据库管理项目 079 创建领域模型项目 080 创建管理后台接口项目 081 创建管理后台实现项目 082 为什么要使用 Dubbo 083 再谈微服务-背景介绍 084 再谈微服务-面向服务架构与微服务架构 085 再谈微服务-服务框架对比 1 085 再谈微服务-服务框架对比 2 086 再谈微服务-RPC 对比 REST 087 Dubbo 简介 088 Dubbo 服务治理 089 Dubbo 组件角色 090 Zookeeper 简介 091 Zookeeper 应用举例 092 Zookeeper 集群模式 093 Dubbo Admin 管理控制台 094 系统后台管理-修改所需依赖 095 服务提供者 096 服务消费者 097 测试 JRebel 热部署 098 登录页 099 首页1 099 首页2 100 使用 thymeleaf 模板 101 使用 iframe 展示功能页 102 频道管理功能-列表页布局 103 新增频道 104 频道列表 105 选择父级频道1 105 选择父级频道2 106 表单页的树控件 107 列表页的树表格 108 FastDFS 分布式文件系统简介 109 FastDFS 分布式文件系统安装 110 文章管理功能-改造树控件1 110文章管理功能-改造树控件2 111 文章管理功能-新增文章 112 文章管理功能-使用 PageHelper 进行分页查询 113 文章管理功能-前端 Datatable 控件分页处理1
Hyperf 是基于 Swoole 4.5+ 实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是可替换 与可复用的。 框架组件库除了常见的协程版的 MySQL 客户端、Redis 客户端,还为您准备了协程版的 Eloquent ORM、WebSocket 服务端及客户端、JSON RPC 服务端及客户端、GRPC 服务端及客户端、Zipkin/Jaeger (OpenTracing) 客户端、Guzzle HTTP 客户端、Elasticsearch 客户端、Consul 客户端、ETCD 客户端、AMQP 组件、NSQ 组件、Nats 组件、Apollo 配置中心、阿里云 ACM 应用配置管理、ETCD 配置中心、基于令牌桶算法的限流器、通用连接池、熔断器、Swagger 文档生成、Swoole Tracker、视图引擎、Snowflake 全局 ID 生成器 等组件,省去了自己实现对应协程版本的麻烦。 Hyperf 还提供了基于 PSR-11 的依赖注入容器、注解、AOP 面向切面编程、基于 PSR-15 的中间件、自定义进程、基于 PSR-14 的事件管理器、Redis/RabbitMQ/NSQ/Nats 消息队列、自动模型缓存、基于 PSR-16 的缓存、Crontab 秒级定时任务、Translation 国际化、Validation 验证器等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。 框架初衷: 尽管现在基于 PHP 语言开发的框架处于一个百家争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为 PHP 微服务铺路的框架,此为 Hyperf 及其团队成员的初衷,我们将持续投入并为此付出努力,也欢迎你加入我们参与开源建设。 设计理念: Hyperspeed + Flexibility = Hyperf,从名字上我们就将超高速和灵活性作为 Hyperf 的基因。 对于超高速,我们基于 Swoole 协程并在框架设计上进行大量的优化以确保超高性能的输出。 对于灵活性,我们基于 Hyperf 强大的依赖注入组件,组件均基于 PSR 标准的契约和由 Hyperf 定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。 基于以上的特点,Hyperf 将存在丰富的可能性,如实现 Web 服务,网关服务,分布式中间件,微服务架构,游戏服务器,物联网(IOT)等。 运行环境: Linux, OS X or Cygwin, WSL PHP 7.2+ Swoole 4.4+
微服务是一种以小型服务为核心组件的架构模式。在微服务架构中,服务只完成一个单独功能。微服务是以代码库和运行时环境的形式提供,可以独立部署和升级。在微服务架构中,每个服务都独立运行,通过网络接口进行交互。这种模式的好处是每个服务都会有更小的代码库,更小的复杂度,更短的开发和部署时间。 由于微服务是分布式的,每个服务都是单独运行的,为了保证其能够正常运行并完成预期功能,需要进行集成测试。集成测试是一种测试形式,它以服务的集成为主题,以检查服务间通信、数据传输、接口和数据格式等为目的。这种测试的目的是验证整个系统的功能、性能和安全性。集成测试是系统测试的一个子集,通常在开发完成之后进行。 Python是一种灵活、易于学习和编写的脚本语言。Python拥有丰富的库和框架,可以用于构建和测试微服务。pytest是Python用于编写单元测试和集成测试的一个套件。pytest是一种轻量级、格式简洁的框架,易于学习且具有很好的可扩展性。它可以集成Python中的大多数流行库,并支持测试驱动开发。 在使用Python编写微服务集成测试时,首先需要定义测试数据和测试用例。测试数据应包括发送和接收到的数据,以及期望的响应。测试用例应包括服务调用、数据格式、接口测试、性能测试等。 在Python中,使用pytest框架执行集成测试非常简单。集成测试应该是自动化的,pytest提供了易于使用的装置,以确保执行测试、收集测试结果和生成测试报告的效率。 可以通过使用Python和pytest的组合,实现面向微服务的集成测试。通过这种方式,可以验证微服务集成的可靠性、性能和可伸缩性,以确保整个系统的正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值