<SOFA:Channel/>,有趣实用的分布式架构频道。
本文根据 SOFAChannel#5 直播分享整理,主题:给研发工程师的代码质量利器 —— 自动化测试框架 SOFAActs。回顾视频以及 PPT 查看地址见文末。
欢迎加入直播互动钉钉群:23195297,不错过每场直播。
你们晚上好,我是蚂蚁金服自动化测试框架 SOFAActs 开源核心成员青勤,目前从事测试技术相关的研发工做,今晚将由我来给你们分享交流自动化测试框架 SOFAActs 的基本原理和使用,今天的内容主要分为如下四个章节:git
欢迎你们 Star 我,SOFAActs:github.com/sofastack/s…github
在分享使用操做前,我将引导你们来熟悉下 SOFAActs 的项目背景、基本原理等。数据库
对于研发质量保障而言,金融系统和金融业务的多样性、复杂性一样也会在测试场景、测试验证和测试流程的复杂程度上获得充分体现。性能优化
譬如,对于包含出参、RPC 调用、DB 变动和异常等多个测试验证点的用例而言,在研发和测试人员维护和验证用例场景的过程当中,时常发生业务结果校验遗漏,对咱们及早发现和纠错问题形成干扰,进而没法严格保障产品质量。这些问题对研发质量保障提出了很高的挑战,相应的自动化、精细化的白盒测试工具需求日益增加,这其中就包括 SOFAActs。bash
为了解决上述痛点、知足精细化测试须要,在多年测试实践积累与沉淀下,咱们研发了基于模型驱动的 SOFAActs 测试框架,它能够灵活、可扩展的提供一站式用例管理,标准化测试执行和精细化校验。目前 SOFAActs 测试框架逐渐成熟并在蚂蚁金服内部获得普遍应用。架构
介绍完背景,咱们来看下 SOFAActs 的大致框架,SOFAActs 底层封装并集成适配 SOFABoot 等运行环境。框架
在重要的引擎层,SOFAActs 封装了工具类和数据模型,并将测试模式的过程进行了标准化,提供通用测试能力和扩展点。对于有自动化测试经验的同窗来说,测试模式其实并不复杂,这其中有不少工做是能够抽象和固定的,SOFAActs 将这部份内容内聚到引擎层,封装成标准测试流程等,尤为是模型驱动和精细化校验等,从而释放精力,将更多关注点聚焦在待测目标上。编辑器
引擎层之上,是 SOFAActs 提供的可视化用例管理功能,能够一站式的维护测试脚本、测试数据和数据模型,借助可视化编辑器可成倍提升用例管理等等操做效率,总体而言 SOFAActs 围绕模型驱动引擎和可视化编辑器,将测试代码的编写工做量极尽下降,目标聚焦在测试对象上。分布式
这里咱们示例看下,SOFAActs 对测试代码和效率的优化。这里以 Credit 接口为例,业务处理开始以前会检查传参,构造上下文、随后发起业务处理,涉及对三张表的读取或变动,并在数据库事物结束以后,返回业务处理结果。ide
针对这一业务逻辑,这里咱们构造一个 Credit 接口的完整测试用例,在代码驱动测试时,它须要一下 9 个步骤,手动准备依赖数据、构造请求参数、执行业务逻辑、校验业务结果以及数据清理等等,人工介入成本居高,尤为当存在多个用例时,测试代码可复用性低,测试效率是难以获得有效提高。而与之对比,在模型驱动测试下,Credit 接口的 SOFAActs 测试脚本会对固有的测试模式进行封装,用例复杂度获得极大精简,众多用例数据能够获得高效的可视化管理。
在开始使用 SOFAActs 以前,咱们来了解一下有关 SOFAActs 执行引擎的运做原理。SOFAActs 框架也提供了很是多的扩展点,若是须要个性化的定义,能够对每个环节进行扩展。
上文中已提到过 SOFAActs 执行引擎是对测试模式过程的封装,Setup 方法是引擎入口,用于加载初始化 SOFAActs 运行时的必需资源,如获取数据源。
如下是主体测试过程:clear、prepare、execute、check 这 4 个方法依次负责环境清理、依赖准备、执行、结果校验等。这些内容是代码驱动测试时须要手写的测试代码和内容,每一个测试脚本的完成意味着上面的过程会被咱们重复一遍,因而 SOFAActs 将这部份内容进行了封装,实现了最通用基础的功能。
右侧,咱们对高频数据如方法入参、出参、异常和依赖DB数据进行了抽象,给出 SOFAActs 的模型,这是代码驱动转向模型驱动、精细化校验的基础。左侧的数据总线会贯穿每一个用例的执行生命周期,即贯穿中间的主体测试过程,若是你们对框架封装的基础功能有自定义须要,能够经过数据总线对 SOFAActs 的对象、方法进行获取、重写,以便更灵活的控制框架行为。固然 SOFAActs 对这些内容做了较好的封装,覆盖了大部分的测试需求,无需你们过分关注。
以上就是 SOFAActs 的执行原理,接下来我会给你们详细介绍 SOFAActs 的接入和使用。
SOFAActs 分为两部分,其一是可视化编辑器,在 SOFAStack 官网上 [1] 咱们能够获取该编辑器的安装包,并经过 IDEA 的插件管理进行安装。其二是 SOFAActs 的基础 jar,它提供了 SOFAActs 用例运行的环境支持,在 test 模块 pom 中添加下列依赖便可,有关 test 模块或者多模块详细内容你们能够参考 SOFAActs 的快速开始文档 [1] 。
下面,咱们进入 SOFAActs 的功能介绍和使用章节,这部分我将分为三小节展开:一站式构建、SOFAActs 核心的模型驱动以及 SOFAActs 提供的精准校验。
一站式构建中,SOFAActs 经过可视化编辑器为咱们提供了便捷操做,以帮助一键配置初始化、构建测试脚本与模型,可视化管理用例数据等等。借助可视化编辑器,在整个过程当中咱们能够替换大部分手工编写代码的工做,进行一站式操做。
一键初始化
这里咱们示例看下,如何操做一键初始化以及一键初始化作哪些内容。首先一键初始化框架只须要 3 个鼠标点击步骤。在 Package 视图下选中测试模块并右键选择 SOFAActs 功能,一键初始化,输入该应用的应用名称和工程编码格式。在一键初始化完成后,SOFAActs 将会在 test 模块写入 SOFAActs 配置文件,DB 链接配置文件,测试套件配置文件以及建立模型存储目录等。
acts-config 配置文件是 SOFAActs 的核心配置,提供了测试环境切换、数据库链接切换、冒烟测试以及预跑反填等配置,来开关 SOFAActs 的相关功能;model 目录用于存放对象模型、数据模型,以便对模型进行统一管理;DB 配置文件指明了数据库链接信息,用于生成数据模型时自动填充表结构和模版数据。
一键生成测试脚本
在完成配置初始化操做后,咱们能够开始第一个用例的编写,SOFAActs 提供了一键测试脚本生成功能。以待测的 getMessage 接口为例,在其方法定义上右键选择 SOFAActs 功能,生成测试用例,在弹出框中检查用例信息,修正无误后点击肯定能够生成该接口的测试脚本。校订依赖的启动类并运行 SOFAActs 测试脚本,能够看到可以正常启动 SOFABoot,SOFAActs 会拉起 SOFABoot 以尽可能模拟业务代码运行时的容器环境,所以若是存在 SOFABoot 上下文加载失败,须要排查应用配置。
一键生成数据模型
一般在咱们建立 SOFAActs 测试脚本时方法入参和出参的对象模型会一并生成好,所以这里着重介绍下如何一键生成数据模型。事先,咱们在 acts-config 配置文件中,指明 DB 环境如 dev 并配置 dev 环境下 DB 链接信息。就绪后,咱们打开测试脚本,在被 @test 注解的方法上右键选择 SOFAActs 功能,生成 DB 表结构模型,在弹出视图中选择须要的 DB 表,当有多个表时,能够一并添加至右侧,点击 OK 以生成 DB 模型,以后可在 model/dbModel 目录查看生成的数据模型。
稍后模型驱动内容中,我将给你们详细介绍 SOFAActs 中模型的概念和使用。
可视化用例管理
在 SOFAActs 编辑器中,咱们可以可视化地修改入参、DB 和结果数据等。在用例级别,编辑器提供了用例复制功能,对于设计等价用例而言,一般正常测试用例之间,异常测试用例之间的差别可能只在于某一关键字段的取值,而大部分数据是相同的,这时用例数据复用十分必要。SOFAActs 提供了用例复制等管理功能,可用于快速发起用例构建。
下面咱们介绍模型驱动,在代码驱动测试时,方法入参、出参和 DB等测试数据是经过代码组织的,随着业务复杂度提高,尤为在金融级业务场景中,类和表动辄十几个属性或者字段,属性嵌套也时常可见,代码驱动测试难移应对:测试脚本可复用性低、测试数据管理困难等问题。因而,SOFAActs 将方法入参、出参、异常和 DB 等数据抽象为模型,用以结构化地记录数据类型、取值和校验规则,能够快速发起用例数据构建。
SOFAActs 中的模型主要分为:数据模型和对象模型。
对象模型:主要用于构造方法入参、指望结果和指望异常。指望结果和指望异常是指在符合测试预期下被测方法的返回结果或者异常抛出。
数据模型:对于一个有 DB 依赖的业务场景的测试验证,须要生成相关 DB 表的数据模型,用于快速构建 DB 准备数据和指望数据。DB 准备数据是业务执行期间依赖的前置 DB 数据,例如在验证转帐场景时参与双方的帐户余额等,DB 指望数据是指在符合测试预期下,被测方法对 DB 的变动。
通过模型化,一个复杂对象或数据能够被快速模版化地建立、拷贝和校验,达到测试数据与测试代码解耦合的效果,另外一方面,配套使用 SOFAActs 编辑器,实现测试数据一站式管理,来提升用例编写效率和下降维护成本。
下面我详细介绍下数据模型和对象模型的结构和使用。
一般 SOFAActs 只须要填充 DB 准备数据,而 DB 指望数据能够利用预跑反填功能进行自动采集。
为了更好地理解数据模型, 在model/dbModel 下的 csv 文件中,咱们能够看到某一张表的所有字段、取值以及校验规则。数据模型聚合了表的结构、数据和校验规则,结合可视化编辑器可快速建立、复制 DB 数据,一次编辑屡次使用。这里咱们来看下示例,在编辑器如何使用数据模型。
对象模型,它是方法入参、出参等对象在 SOFAActs 中的映射,能够在 model/objModel 目录下查看生成的对象模型。对象模型的结构和数据模型类似,是属性、取值、校验规则的聚合,与数据模型不一样的是,对象模型可能存在多层嵌套,由于类的某一属性能够是 map、集合、类等引用类型。
在 SOFAActs 编辑器中能够为一个新的用例添加入参数据,若是入参是简单类型,如 int、String 等能够选择简单类型填充,这里示例下复杂类型,即业务对象的模型使用,在左侧的列表中选择目标对象,添加至右侧,若是有多个入参能够一并添加到右侧后,再点击肯定,便可以在入参设置中看到入参数据并可进行编辑。对于有多个入参的方法,入参设置中从上之下的顺序和方法声明入参顺序是须要一致的。
下面咱们介绍精细化校验,在一开始时,咱们说起到复杂业务场景下极易出现校验遗漏,造成校验假绿。为此,SOFAActs 内置了精细化校验,从校验规则和行为还原两点,来保证复杂场景的校验覆盖。
如右图,SOFAActs 将重复性 assert 代码抽象概括为校验规则,与测试数据一同做为数据模型的一部分,能够细化校验每一个字段。目前acts支持的校验标签以下,其中经常使用有 Y、N、C 标签,Y 表示了校验时必须一致的对象或属性、N 表示校验时不关心的属性或记录值、C 标签标示 DB 数据校验时的 DB 查询条件,即 where 条件,参考右图咱们能够理解标签的使用。
为了真实还原业务行为以提升验证覆盖和用例数据的编写效率,SOFAActs 提供了行为还原,做为精细化校验的一部分,行为还原在 SOFAActs 中称为预跑反填功能,是指在方法入参、依赖的 DB 数据等用例正常执行的基本数据准备完成后,可先没必要填写指望数据而直接运行测试脚本,框架可自动捕获运行时方法返回结果、全部 DB 表变动等数据,经过 SOFAActs 编辑器可填充用例的指望数据,小幅度修正和标记校验规则后便可完成所有校验点的参考数据的编写。
这里我给你们演示如何使用 SOFAActs 的预跑反填功能:
启用 SOFAActs 的预跑反填功能须要在 acts-config 中打开结果收集开关,而后执行用例,运行完毕唤起 SOFAActs 编辑器,点击左上角的预跑反填,选中须要的用例数据,点击肯定就完成了相应用例的指望结果、指望 DB 数据的构造,但预跑反填功能自己并不保障校验数据的准确性,须要针对待测业务场景将数据修正。
下面,咱们进入本次分享的最后一部分,SOFAActs 进阶功能的使用。这里为你们介绍使用频度最高的两个功能:自定义引擎流程和参数化。
稍作回忆,在一开始咱们熟悉了 SOFAActs 的运行原理,说起到 SOFAActs 执行引擎是对测试模式过程的封装,同时为数据模型、数据总线提供了扩展点,这里咱们举例使用、重写这些 API 。另外一个高频功能是参数化,提供了运行动态替换 String 类型取值的功能,以知足部分随机动态的测试须要。
@Override
public void check(ActsRuntimeContext actsRuntimeContext) {
if (actsRuntimeContext.caseId.endsWith("001")) {
if (((AccountTransResult) actsRuntimeContext.getResultObj()).isSuccess()) {
actsRuntimeContext.paramMap.put("status", "0");
} else {
actsRuntimeContext.paramMap.put("status", "1");
}
actsRuntimeContext.refreshDataParam();
}
super.check(actsRuntimeContext);
}复制代码
咱们以 check 流程为例,重写了 check 方法来知足动态校验,这里依据返回结果设置了自定义参数,放置到数据总线 Actsruntimecontext 中,咱们将指望 DB 数据中的 mast 表的 status 字段设置为自定义参数,表示该字段的指望值应该和方法返回结果中的状态保持一致或者关联。而后运行用例来查看咱们重写的校验是否达到了预期。
SOFAActs 提供了不少扩展点可让你们适配应用的测试需求,若是你须要一个更强大的 SOFAActs,能够动手重写这些 API 将基础功能进行延伸,固然更欢迎你们在 Github 中提 Issue、Commit 来一同完善 SOFAActs。
以上内容由 SOFAChannel#5 直播分享整理,若是你们有疑问能够在钉钉群(搜索群号便可加入:23195297)或者 Github 上与咱们讨论交流,咱们将进行解答。
SOFAActs:github.com/sofastack/s…
[1] SOFAActs 下载地址以及快速开始文档:www.sofastack.tech/sofa-acts/d…
[2] 示例视频:www.yuque.com/huarou/gd4s…
SOFA Meetup #2 上海站《使用 SOFAStack 快速构建微服务》报名进行中❤~
5 月 26 日,SOFAStack 开源核心成员集体出动。本期咱们将侧重于各个落地的实际场景进行架构解析。
分布式事务 Seata 详解、与 Spring Cloud 生态的融合案例、使用 SOFAStack 快速构建微服务 Demo 实操、更有最新开源的《让 AI 像 SQL 同样简单 — SQLFlow Demo 》首秀,期待与你不见不散~
戳连接便可报名:tech.antfin.com/community/a…
公众号:金融级分布式架构(Antfin_SOFA)