理解思考造数工厂是什么之前,我们先需要搞清楚业务功能(前端、服务,数据)之间的关系
在业务系统中,业务数据一般由用户发起业务流程产生,也就是由功能产生,这是所谓的正向数据流,例如 “新建” 相关的功能。而产生的数据为后续的业务功能提供基础支撑,例如 “查询”,“更新”,“内存运算” 等,这是所谓的逆向数据流。用户的操作产生数据,产生的数据根据业务要求进行一系列的操作和加工又反馈给用户。所以在业务系统中,我们可以把功能划分为三大类:
通过上图可以看到:
我们站在开发、测试两个角色去看待这个问题。
现在很多微服务基于 DDD,后端开发各自专注于自己的领域中,对依赖服务的内部逻辑和数据结果并不关注,只关注交互接口提供的数据结构和含义。这就导致了很明显的问题,开发环境进行联调时,花费大量时间在依赖数据的构造中,效率极低。
如果测试人员在迭代中为了生成目标功能依赖的业务数据,而去把代码未发生任何变动的功能都跑一遍,这种方式是低效率无意义的。在整个测试过程中,只有阶段 2 才是有效的测试。
如果有造数工厂,你的工作流程会变更为:
你可以在测试设计阶段中,在造数工厂中将你测试过程中需要的数据先准保好,在测试开始的时候直接在造数工厂中生成依赖的业务数据就好。
在自动化测试的实践过程中,以下问题会阻碍自动化测试落地:
* 用例和用例之间不独立,依赖严重
* 测试点小、用例大
* 维护脚本成本大
这三个问题背后的原因很大层度都是被 “测试场景构建” 的问题影响:
* 下一个测试用例的测试场景构建,依赖上一个测试用例的执行
* 为了构造测试场景,不得不做很多额外的操作,导致脚本步骤增多,从而导致整个自动化测试的稳定性下降
* 用例无效内容多,不同用例关联关系紧密,与测试点无关的功能变动有可能也会导致用例运行失败
通过造数工厂的能力,将自动化测试脚本强依赖的测试场景构建从自动化测试本身抽离出来,自动化测试的用例只需要调用造数工厂进行测试场景构建。从而解决以上三个问题。
在数据源管理页面中你可以创建、编辑、查询你造数流程中会使用到数据源。
我们使用 codemirror6 的组件编写 json 的编辑器,并且在编辑器中提供了一些使用函数
函数在编辑器中会自行提醒并补全
有时候,一个变量 json 内容会非常多,在当前看到编辑器中编写不是很方便,因此我们提供一个放大功能,就是标题旁边那个蓝色的小按钮
在当前这个纯净的编辑窗口中编写就会非常的舒服啦
消息模板采用 JSON 格式进行编写,主要针对业务系统通过消息通道(KAFKA,MQ)接收上游业务系统推数后产生业务数据的造数。这样在测试过程中,就不需要依赖上游业务系统的推送,我们自己按照约定编写业务消息,进行推数验证我们自己业务系统处理消息的业务逻辑就行。
通过消息模板的列表页面对存量的消息模板进行维护
处理针对消息队列的消息模板外,我们还提供了针对 Mysql、ClickHouse 的数据模板
在一个数据模板中,可以有多个步骤:
通过添加按钮添加步骤,删除按钮删除步骤;
每个步骤都对应一个数据源,因为一个功能依赖的数据可能来自不同的数据源;
每个步骤都可以拥有他自己的变量,可以是多个。
先为当前步骤选择变量,再编写 SQL 语句的时候可以直接引用
编写 SQL 的时候,变量的内容不需要手动编写,编辑器会为你做代码提示
同样 SQL 的编辑器也提供了纯净编写的功能,并且两个不同的编写器的内容相互同步
在一个工人中可以设置多个数据模板,他们的序号就是他们工作的顺序,模板中的上下文作用域只能在当前模板中,不能跨模板使用。
同理一个生产线中也可以有多个工人,他们的需要就是工人之间的工作顺序。
这样通过在工人中设置数据模板和消息模板,在生产线中设置工人并实现了造数过程中的拼搭能力。
综上所述,我们可以看到整个造数过程中数据结构的层级关系是:
所以按照上述内容,为了使你的造数可用性,复用性更高,应该尽量做到以下几点:
因为我们业务系统属于数据密集型系统,无论是后端和前端在开发环境中联调,还是测试执行过程中的提效,自动化测试中场景的构建,对造数工厂都有强烈的需求。目前在项目中已经使用起来,切实帮助测试解决了很大的问题,提升了测试效率,特别是数据模板和消息模板积累起来后,使用效率和带来的效果越来越大。