【测试沉思录】9. 数据工厂低代码平台探索与实践

news/2024/3/29 23:28:11/文章来源:https://blog.csdn.net/wirelessqa/article/details/127626951

欢迎订阅我的新专栏《现代命令行工具指南》,精讲目前最流行的开源命令行工具,大大提升你的工作效率。

作者:吴锺瑞、刘洪初 编辑:毕小烦

一. 需求背景

造数据可能是日常迭代中最频繁也是最耗时的工作。

我们在20年8月对部门内的测试同学做了一次统计调研,日常工作中各项事务的耗时占比。

如下所示:

img

可见造数据所花的时间占了相当大的比重。

其实,造数据的需求不仅是测试人员有,其他人员也有。

比如:

  • 产品需要测试数据梳理业务逻辑、验收新功能;
  • 开发需要测试数据进行调试、自测、复现问题;
  • 其他业务组的同学日常工作中需要上下游的测试数据支持;
  • 性能测试需要的大批量数据;

……

从团队整体效率而言,若测试数据需依赖他人支持,还会有额外的沟通成本、等待时间成本,所消耗的时间就更多了。

如何节省造数据的成本?

常见的解决方式:

  1. **造数脚本:**通过脚本语言快速编写造数据脚本,比较适用于需要大批量(或高频次)的复杂数据需求。优点是灵活性高,可实现绝大多数数据需求。缺点是技术成本偏高,无论实现还是使用,都需要一定技术门槛,难以大范围推广。多是个人编码,个人使用。可能会导致编写成本大于使用收益、重复造轮子等情况。
  2. **定制工具:**一般为桌面端程序,将常用的一些数据场景(如造账号)制作成客户端应用,小巧、易于使用、方便推广。但缺点在于灵活性差,若数据结构发生变更,难以全面更新,还可能导致数据库中脏数据泛滥。

上述 2 个方案都可在一定程度上减少造数据成本,但不够完美,我们需要的应该是一个更加健全的数据工厂。

对于,数据工厂,我们的需要是什么呢?

1. 易于使用

我们的核心目的是降本增效,因此需要保证一个造数据功能带来的效益一定远大于其实现成本。那么,最重要的一点,便是要让所有需要测试数据的人都能独立、便捷地造数据。即实现“一次实现,大量使用”、“一人实现,集体使用”。因此,数据工厂应有一个独立的面向使用者的友好界面,最大限度降低使用门槛和学习成本,在此基础上优化使用体验。

2. 易于开发

具体业务的测试数据,自然是对应业务组的人员最为熟悉。因此,由他们实现对应造数据功能是最为高效。但我们无法要求所有测试同学拥有较高的开发能力,所以平台应提供低代码实现功能的能力,才能让有数据需求的同学在最短时间完成造数据工具并投入使用。

3. 便于维护

应制定统一规范对各造数据功能进行管理,避免功能找不到、重复造轮子等问题。

因此我们对于数据工厂的设计,倾向于易于大多数测试人员快速开发的低代码平台。

二. 前端的设计方案

2.1 应用端的设计

数据工厂的前端功能界面,如下图所示:

img

需求的描述如下:

img

实际的效果如下:

img

2.2 低代码的实现

低代码设计方案:

img

三. 后端的设计方案

后端也是一套低代码开发平台,测试同学可通过平台将造数据所需的 SQL、Shell 命令、业务接口调用等封装成一个 HTTP 接口,提供给前端调用,根据传参动态生成不同的数据。

img

3.1 平台能力

低代码开发平台的能力:

1. 基础配置维护

  • 维护各数据库链接,支持5种数据库,可通过参数灵活切换;
  • 支持不同测试环境的配置,可通过关键参数调用;
  • 全局通用。

2. 造数据功能维护

  • 与使用端的目录结构保持一致,便于维护。

3. 编辑造数据功能

  • 低代码操作,仅需组装 SQL(或其他操作);
  • 提供 select 语句转 insert 语句的能力;
  • 支持 SQL 语句中参数高亮;
  • 支持从接口响应、查询结果、SQL 命令中提取参数;
  • 提供一些常用函数,如随机数、加密、获取年月日等;
  • 提供批量调用入口,方便为压测场景批量造数据。

3.2 开发流程

低代码开发接口的流程,一共 6 步。

STEP 1. 设计接口需求

假如我们需要一个“造账号”的功能,需要实现一个后端接口 /account/create

参数使用起来尽可能的简单,那就只有一个用户名(username)是必填的,其他的可选填参数包括性别(sex)、证件号(cid)、账号身份(role,用户登录目标系统后的权限管理)。当然,环境参数(env)也是必须的。

所以我们需要的是一个 POST 请求,请求体内容为:

{"env":"test"," username ":"boss","sex":""," cid ":""," role ":""}

请求的响应中,应包含账号的基本信息以供记录并使用,如用户名、密码(初始密码统一)、随机生成的姓名、证件号(未填写则随机生成)等。

经过前端解析后,大概展示如下:

img

STEP 2. 梳理数据结构

目标明确后,就要梳理如何实现了。假设造账号涉及 3 张表,账号信息表、证件表、身份表,那么基础的是 3 条 SQL 语句。

INSERT INTO 账号信息表(`id`,`username`, `pwd`) VALUES (自增, 'boss', 'xxxxx');
INSERT INTO 证件表(`uid`,`cid`,`sex`) VALUES ('xxxxx', 'xxxxx', 'xxxxx');
INSERT INTO 身份表(`uid`,`role`) VALUES ('xxxxx', 'xxxxx');

STEP 3. 处理动态参数

然后开始实现功能,首先是变量定义。

img

将 SQL 需要的动态参数定义成变量 uidusernamecidsexrole

  • uid 为账号信息表的 id,由自增函数自动生成,那么需要在 insert 账号信息表后,用 select 语句查出来,将查询结果赋值。
  • username 从接口请求体中读取。
  • cidsexrole 三个参数,使用平台提供的条件判断功能,先判断接口请求体中对应参数值是否为空,若为空则调用平台提供的公共函数随机生成(包含范围随机数、随机证件号等函数)。在 SQL 中使用${变量名}的形式引用。

STEP 4. 组装 SQL 语句

将需要的 SQL 语句按数据处理的顺序组装(此处实际需要 4 条 SQL),用变量引用替换 SQL 中的动态参数。

注:还可添加 http 接口调用、redis 处理、shell 命令等操作,但本例不需要。

STEP 5. 提取关键数据

参考顶层设计,该功能需要将账号的基础信息返回,以供记录。

关键数据的提取有多种方式,包括 SQL 语句(语句中提取、执行结果提取)、HTTP 请求(参数提取、响应体提取)、局部/全局变量提取等。

img

STEP 6. 生成所需接口

功能实现后,会自动生成接口 /account/create,将提取的关键数据组装 JSON 作为响应进行返回。

到此,一个造数功能的接口服务就实现了,可以通过前端页面进行调用,还可通过特殊参数进行批量执行支持压测所需的大批量数据。

四. 效果收益

我们团队从 2021 年开始实践数据工厂,初步成型后推广至整个事业部。截至2022年6月,平台上已上线造数据功能 N 个,满足事业部 95% 以上的业务场景。产品、开发、其他团队人员均可在短时间内的完成造数,测试人员日常工作中造数据的用时占比已降至 6.8%。

(完)

如果文章对你有帮助,记得留言、点赞、加关注哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410269.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HashSet实现类的使用

【1】放入Integer类型数据package com.msb.test06;import java.util.HashSet;/*** @author : liu* 日期:10:36:57* 描述:IntelliJ IDEA* 版本:1.0*/ public class TestInteger {//这是一个main方法:是程序的入口public static void main(String[] args) {//创建一个HashSet集合…

Cannon.js -- 3d物理引擎

文章目录前言一、关于Cannon.js二、Cannon.js的使用最后注意点:优化事件其他本文完整代码下载:相关链接:前言 本篇将介绍Cannon.js -- 3d物理引擎的基础使用,并用Cannon.js与three.js写一个简单的demo 一、关于Cannon.js Q&…

什么是轮廓阴影和圆角

目录 outline box-shadow 将元素设置为一个圆形 outline outline 用来设置元素的轮廓线&#xff0c;用法和border一模一样 轮廓和边框不同的点&#xff0c;就是轮廓不会影响到可见框的大小 <!DOCTYPE html> <html lang"en"> <head><meta ch…

【CV】第 6 章:使用迁移学习的视觉搜索

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Protocol Buffers学习【Qt】

文章目录参考前言开发环境# 一、下载1. 打开网页2. 点击download3. 下载二、 编译1. 解压2. 用QC打开项目3. 编译并等待4. 打开 extract_includes.bat5. 新建lib文件夹三、使用1. 新建 lm.helloworld.proto2. Qt 新建 HelloProtobuf 子目录项目3. lib_protobuf 目录4. Writer 工…

腾讯云创建SVN支持多人协同办公

本文参考自&#xff1a; 如何在腾讯云轻量级服务器搭建svn_我的天才女友的博客-CSDN博客_腾讯云 svn 搭建SVN服务器-腾讯云 - 夜页子 - 博客园 一、配置要求 选择腾讯云CentOS的镜像进行安装 二、SVN服务端 1.SVN服务端的安装 yum install subversion 接下来输入y按回车继…

C语言练习---【求素数】(一篇带你掌握素数求解)

&#x1f996;作者&#xff1a;学写代码的恐龙 &#x1f996;博客主页&#xff1a;学写代码的恐龙博客主页 &#x1f996;专栏&#xff1a;【初级c语言】 &#x1f996;语录&#xff1a;❀未来的你&#xff0c;一定会感谢现在努力奋斗的自己❀ C语言练习---【求素数】&#x1…

数据分析 | Pandas 200道练习题,每日10道题,学完必成大神(7)

文章目录前期准备1. 以df的列名创建一个DataFrame2. 打印所有换手率为非数字的行3. 删除所有换手率为非数字的行4. 重置df的行号5. 绘制‘还手’密度曲线6. 计算后一天和前一天收盘价的差值7. 计算后一天与前一天收盘价的变化率8. 设置时间索引9. 使用时间索引&#xff0c;分别…

JavaScript 49 JavaScript 作用域

JavaScript 文章目录JavaScript49 JavaScript 作用域49.1 JavaScript 函数作用域49.2 局部 JavaScript 变量49.3 全局 JavaScript 变量49.4 JavaScript 变量49.5 自动全局49.6 严格模式49.7 HTML 中的全局变量49.8 警告49.9 JavaScript 变量的有效期49.10 函数参数49 JavaScrip…

Mysql深度解析(一)索引底层数据结构与算法

MySQL底层索引是用B树实现的 传送门&#xff1a;什么是B-树、B树、B*树 传送门&#xff1a;深入理解MySQL索引底层数据结构与算法 传送门&#xff1a;MySQL中Innodb的索引 1 索引是什么? 索引&#xff1a;帮助Mysql高效获取数据的排好序的数据结构。 2 Mysql索引为什么用…

Sping的IoC容器和依赖注入

IoC Inversion of Control 使用对象时&#xff0c;由主动new产生对象转换为由外部提供对象&#xff0c;此过程中对象创建控制权由程序转移到外部&#xff0c;此思想称为控制反转 Spring实现了IoC的思想&#xff0c;Spring提供了一个容器&#xff0c;称为IoC容器&#xff0c;用…

【CSS】CSS选择器全解指南【CSS基础知识详解】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【CSS】 【CSS专栏】已发布文章 &#x1f4c1;【CSS基础认知】 本文目录【CSS选择器全解指南】&#x1f319;CSS注…

SpringBoot 转发请求至指定页面

1、前言 原先的页面访问地址为&#xff1a;http://127.0.0.1:8888/office/schdule/index/&#xff0c; 重构项目&#xff0c;SpringBoot 项目&#xff0c;前后分离&#xff0c;前端文件放置静态目录&#xff08;static&#xff09;下&#xff0c;访问地址&#xff1a;http://12…

计算机毕业设计(附源码)python疫情管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

URP下的OffScreen Particle Render

【博物纳新】专栏是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。随着越来越多的项目使用…

jsp个人评价管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 个人评价管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使…

多模态自编码器从EEG信号预测fNIRS静息态

导读 本研究介绍了一种深度学习架构&#xff0c;用于评估40名癫痫患者的多模态脑电图(EEG)和功能性近红外光谱(fNIRS)记录。长短期记忆网络和卷积神经网络集成在一个多模态序列到序列的自编码器中。训练后的神经网络通过从EEG全谱和特定EEG频段中分层提取深度特征&#xff0c;…

fscan:一键自动化、全方位漏洞扫描的开源工具

https://blog.csdn.net/osfront/article/details/116049846 打开服务器看到了一个软件fscan64,并有运行页面。因为没见过,吓了我一跳,搜索了下是什么,记录下。 简介 fscan 是一个内网综合扫描工具,方便一键自动化、全方位漏洞扫描。 它支持主机存活探测、端口扫描、常见服务…

【Java数据结构】顺序表

我们不过是普通人&#xff0c;只不过在彼此眼中闪闪发光 目录 1.模拟实现顺序表 1.1 顺序的结构 1.2 顺序表的成员属性 1.3 顺序表的构造方法 1.4 顺序表的成员方法 1.4.1 扩容 1.4.2 打印顺序表 1.4.3 尾插 1.4.4 在指定位置插入 1.4.5 判断数组中是否有这个元素…