暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

项目经验分享:Seata e2e 自动化测试框架

开源之夏 2021-09-13
1217

点击蓝字 关注我们

暑期 2021 项目研发正在火热进行中,开源之夏公众号面向广大社区及项目承担学生征稿,欢迎大家热情分享!

发送投稿文章至官方联络邮箱:

summer@iscas.ac.cn

添加公众号小编微信投稿:


本期分享来自 Seata 社区熊靖浏同学带来的项目(Seata e2e 自动化测试框架)经验。



Seata 简介

在分布式微服务架构中,应用部署在不同的服务器环境中,因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,如何解决分布式事务问题也是在分布式架构系统所必须考虑的。在这样的场景下,

Seata(https://seata.io/zh-cn/ ) 诞生了:


e2e 自动化测试框架简介

目前 Seata 缺少一个 e2e 的测试框架用于进行端到端的测试,什么是 e2e 的测试框架呢?e2e 是 EndToEnd 的缩写,即端到端的场景,每一个端上都有一个具体的业务程序在运行。进行端到端测试的目的是确定完整系统下各个子系统之间能够正确的调用,以模拟完整的生产场景。


现代软件系统是复杂的,与多个子系统相互连接,这些子系统可能与当前系统不同。任何一个子系统的故障都可能导致整个系统的崩溃,而端到端测试可以避免这种风险。

Seata e2e 自动化测试框架需求分析

本项目的目的是实现一个适合 seata-server 的 e2e 测试框架供开发者使用,并提供一个使用此框架的 e2e 场景测试示例供参考。以下是项目的实现目标:

1

在测试方法开始前能够将所有需要的服务端启动完毕,并确保其都在正常运行。

2

包括一个测试框架应该有的功能,如设置测试的重试次数,压力测试等。此外还要方便开发者对数据库进行查询,以此来知晓 seata 是否成功让数据进行回滚。

3

测试的日志输出,方便开发者查看测试环节中是哪出现问题.

4

提供一个包含 seata-server 的测试场景供开发者学习测试框架的使用,此测试场景要尽力做到开箱即用,减轻开发者的学习成本。


项目实际进度(截至投稿日)

项目结构

common:e2e 框架本身,以下是框架的组成简要说明。


config:用于配置 e2e 框架的日志输出地址等配置。

 docker:负责在测试前后进行docker-compose文件中容器初始化和销毁,根据 Apache SkyWalking

(https://skywalking.apache.org/

中的 java e2e 框架的此功能改编而成。在结合 Apache SkyWalking 的开发者们使用此功能的实践上进行修改,删除了一些开发者们不常用的冗余功能并将其精简。

 factory:封装了 helper 下的所有工具类。

 helper:一系列用于在测试中使用的有状态的工具类,包括简易的 orm 驱动的数据库查询工具类,map 中的值与 javaBean 的属性值验证工具类,压力测试工具类(同步执行),固定次数执行任务类(同步执行)。

 model:存放一些数据类。

 trigger:测试注解功能,根据 Apache SkyWalking 中的 e2e 框架的测试注解进行修改。支持多错误(原为单个错误)下重试,按照一定次数重试,间隔一定时间重试。

 util: 一系列用于在测试中使用的无状态的工具类,目前包括一个统计程序执行时间的工具类。


e2e-scene:  存放各e2e场景测试下所依赖的服务代码,数据。例如各个服务的 DockFile 文件,数据库初始化 sql 文件等。社区的开发者可以在这里上传自己的测试场景。

e2e-test:存放各 e2e 场景下测试的代码,测试依赖的 docker-compose 文件,配置文件,数据卷挂载等。社区的开发者可以在这里书写自己的测试代码。


注:框架的代码中,代码相似度在百分之 50 以上或者思想借鉴了 Apache SkyWalking 的代码的,均已在 seata 的 license 中注明了其位置并在对应代码上保留了原始 Apache 基金会 License。Apache SkyWalking 的最新的 e2e 框架提倡的是不用复制代码的通用性直接集成框架,seata 的 e2e 框架提倡的是方便 seata 测试的供 java 开发者使用的集成框架。Apache SkyWalking 的框架在参考文献中已经给出了网址,有兴趣的读者可以查看。在调研各种 e2e 框架的框架中本人发现,一般来说每个项目中的 e2e 框架大都是服务于自身项目,并不具备一定通用性。通用性强些的 e2e 框架又有支持 UI 测试和根据模板使用的 Sakuli 和MrChecker 等,其侧重点又主要在于测试场景。


e2e 框架功能

Seata e2e 框架是一个帮助开发者进行和 seata-server 有关的 e2e 测试框架,开发者只需要提供 docker-compose 文件即可通过 junit 进行容器启动并测试。并通过代码的方式中借助框架中的各种功能来对测试进行自定义的操作。下面是框架中的主要功能:

测试注解功能

开发者可使用注解 @TestTrigger 像 @Test  一样注解在待测试的方法上,并且可以指定此次测试方法重试次数,重试间隔时间,遇到哪些错误可以接着进行重试。具体的实现思路是通过 junit5 文档

(https://junit.org/junit5/docs/current/user-guide/#overview

的 Extension 与 @TestTemplate 实现。下图为测试注解的使用代码:

docker-compose 文件中容器初始化与销毁功能


开发者只需提供 docker-compose 文件,在测试方法开始之前,框架会自动生成 docker-compose 文件中的所有容器,在测试方法结束后,框架会自动删除 docker-compose 文件中的所有容器。具体依赖的第三方插件为 

Testcontainers(https://www.testcontainers.org/quickstart/junit_5_quickstart/)。

Testcontainers 将启动一个小的“ambassador”容器,它将在 Compose 托管容器和可供测试访问的端口之间进行代理。这是使用一个单独的最小容器来完成的,该容器将 socat(Netcat的加强版)作为 TCP 代理运行。


DruidJdbcHelper功能


DruidJdbcHelper 里面封装了 Druid 连接池和 JdbcTemplate 。允许开发者在测试时直接使用 orm 方式的进行数据的查询,直接传入sql 语句以及期望返回的数据类型即可。同时也允许进行简单的 update 语句执行和 sql 脚本执行。如果需要进行全面的数据库操作,推荐还是直接使用 mybaits-plus 等框架。下图为数据查询功能的代码:


PressureTask and TimesTask 功能


PressureTask 是一个压力测试工具类(同步执行),TimesTask 是一个固定次数执行任务类(同步执行)。PressureTask 根据开发者设置的线程数和总的执行次数进行任务的执行,TimesTask 根据开发者设置的执行次数和执行时间间隔执行。两者待执行完毕后,将统计的执行结果输出。下图为压力测试工具类的部分代码:


MapVerifyBeans 功能


在访问数据查询接口后,一般会得到一个对应一个数据库表中的 java Bean 对象。开发者将自己期望验证的数据(value)以及其在 java Bean 中对应的属性名(key)存在一个 map 中,即可选择性的将此 map 与访问接口后得到的 java Bean 中的数据进行对比验证。下图是验证 map 中的所有 entry 是否与 java Bean 对象对应的数据取值相等。

框架使用

目前提供一个使用 e2e 框架的场景实例,业务场景中主要包括一个消费者,一个生产者,nacos-server,seata-server,mysql。seata-server 以 file 作为配置中心,以 nacos 作为注册中心。此场景只需要将消费者和生产者所在的模块通过 maven packgae 打包后,即可在测试中进行使用,十分简便。业务逻辑为生产者调用消费者进行库存的消费,并查看消费是否成功。


此业务场景下的测试主要为测试加上 @GlobalTransactional 的存在错误的库存消费方法是否进行回滚,以下是部分测试代码。


感想

在这近两个月的学习中,遇到的问题大多数都能自行解决,不会的再会向导师提问。我的导师很好,每一次提问都会耐心的解决我的问题。seata 社区的大家都很优秀且友好,每天都在群里讨论技术讨论的热火朝天,一次在群里讨论 jvm 的问题,讨论了整个下午。欢迎大家加入 Seata 社区,共同学习成长。

这次的开源活动让我知道了许多开源的细节,我所接触的所有的开源社区的大家也都十分友好,大家一起共同努力进步。最后,感谢开源之夏,感谢社区,感谢给予我指导和意见的导师和其它贡献者,我相信这次开源工作将是一段十分轻松和愉快的时光。

参考文献

https://baijiahao.baidu.com/s?id=1683070375243480842&wfr=spider&for=pc


https://skywalking.apache.org/


https://skywalking.apache.org/blog/e2e-design/



文章转载自开源之夏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论