MySQL 测试数据快速生成

一、前言

在我们进行大数据量的报表测试以及性能测试时,需要数据库中存在大量的基础测试数据,但是依赖于系统本身大多数情况下都无法快速产生大量适合的测试数据,这就需要我们手动生成一些测试数据。

目前生成数据的方式有:

1、使用存储过程实现(需要开发了解PL/SQL语法)

2、多线程 + jdbc批量提交

3、使用性能测试工具(loadrunner或jemter产生,需要了解这两个工具的脚本预言)

4、使用QUEST  Datafactory、TestDataBuilder等,只需简单的配置

二、利用存储过程实现测试数据快速生成

2.1  创建存储过程

-- 清空数据表
truncate table user1;
-- 如果存在存储过程 `add_user1`,先删除再创建
DELIMITER $$
DROP PROCEDURE IF EXISTS `add_user1`;
CREATE PROCEDURE `add_user1` ( IN n INT )
BEGINDECLARE i INT DEFAULT 1;DECLARE password VARCHAR(100) DEFAULT '';DECLARE create_date VARCHAR(255) DEFAULT '';start transaction; -- 整个存储过程指定为一个事务WHILE ( i <= n ) DOset password =  substring_index( substring_index('123;456;789;321', ';', -FLOOR( rand( ) * 4+1 ) ), ';', 1 );set create_date = CONCAT(date(from_unixtime(unix_timestamp('2019-01-01')+ floor(rand() * ( unix_timestamp(now()) - unix_timestamp('2019-01-01') + 1 )))) ,' ',LPAD( FLOOR( 9 + ( RAND( ) * 10 ) ), 2, 0 ),-- 时 0-23  LPAD( FLOOR( 0 + ( RAND( ) * 24 ) ), 2, 0 ),; 9-18 LPAD( FLOOR( 9 + ( RAND( ) * 1 ) ), 2, 0 ),':',LPAD( FLOOR( 0 + ( RAND( ) * 60 ) ), 2, 0 ),-- 分 0-59':',LPAD( FLOOR( 0 + ( RAND( ) * 60 ) ), 2, 0 ) -- 秒 0-59);INSERT INTO `user1` VALUES(i,'oyc','oyc',password,-- create_date,CONCAT(--  FLOOR( 1990 + ( RAND( ) * 25 ) ),'2019-',-- 年LPAD( FLOOR( 1 + ( RAND( ) * 12 ) ), 2, 0 ),-- 月'-',LPAD( FLOOR( 3 + ( RAND( ) * 8 ) ), 2, 0 ),-- 日' ',LPAD( FLOOR( 0 + ( RAND( ) * 23 ) ), 2, 0 ),-- 时':',LPAD( FLOOR( 0 + ( RAND( ) * 59 ) ), 2, 0 ),-- 分':',LPAD( FLOOR( 0 + ( RAND( ) * 59 ) ), 2, 0 ) -- 秒) );SET i = i + 1;END WHILE;commit; -- 必须主动提交
END $$CALL add_user1 (10 );

大量插入数据时,必须加上事务处理,可以提高插入速度。

2.2  执行存储过程

执行可以通过navicat的函数执行,也可以直接执行CALL add_user1 (10 ) 命令。

2.2.1 函数可视化执行:

填入执行函数值,这里我设置为10,点击确定即可完成。

执行完成,耗时0.188s

2.2.2 CALL add_user1 (10 ) 命令

2.3 利用mysql 函数生成一下随机内容

1. 修改引擎
ALTER TABLE user1 ENGINE = INNODB/ MyISAM;

1. 清空数据表
truncate table user1;

3.从数组中随机获取一个内容
SELECT 
    substring_index(substring_index('学富五车;足智多谋;仗义执言;火眼金睛;见多识广;责任担当;乐观积极', ';',- FLOOR( rand( ) * 7+1 ) ), ';', 1 )
 AS report_content;

4. 从两个数组中随机获取相同索引下的内容
select desc_index, CONCAT(desc_index, 
    '\"desc\": {\"label\":\"', 
    substring_index(substring_index('学富五车;足智多谋;仗义执言;火眼金睛;见多识广;责任担当;乐观积极',';',temp.desc_index),';',1),'\"',
',\"description\": \"', 
substring_index(substring_index('再美的气质,也掩盖不了你才华本质;脑力使用积极分子,非你莫属;你的见解,面面俱到,深入人心;独特的洞察力,总能获悉一切;最美的阅历,就是沿路的风景;先天下之忧而忧,后天下之乐而乐;爱笑的你运气一定不会差',';',temp.desc_index),';',1),
'\"}'
) as report_content from (select -FLOOR(rand()*7+1) as desc_index limit 100000) temp

5.随机年月日 时分秒
SELECT
    CONCAT(
    FLOOR(2010 + (RAND()*10)),-- 年
    '-',
    LPAD(FLOOR( 1 + (RAND() * 12 )), 2, 0),-- 月
    '-',
    LPAD(FLOOR( 3 + (RAND() * 8)), 2, 0),-- 日
    ' ',
    LPAD(FLOOR( 0 + (RAND() * 23)), 2, 0),-- 时
    ':',
    LPAD(FLOOR( 0 + (RAND() * 59)), 2, 0),-- 分
    ':',
    LPAD(FLOOR( 0 + (RAND() * 59)), 2, 0) -- 秒
    )

SELECT FLOOR(7 + (RAND() * 6));     取7到12的随机整数,包括7到12

SELECT FLOOR(12+(rand()*13));   取12到24的随机整数,包括12到24

LPAD(FLOOR(0 + (RAND() * 23)),2,0)  取0-24之间的随机数,不够2位的前补0

格式 : 2008-12-11 17:43:11

举例:

给用户赋一个随机入职日期,年份为1990-2014

select CONCAT(FLOOR(1990 + (RAND() * 25)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0))

结果:1999-10-07

select CONCAT(LPAD(FLOOR(0 + (RAND() * 23)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0))

结果:15:39:18

一段时间:

select DATE_ADD(DATE_FORMAT('2019-01-01 00:00:00','%Y-%m-%d %H:%i:%s'),INTERVAL FLOOR(1+RAND()*((ABS(UNIX_TIMESTAMP(DATE_FORMAT('2019-04-21 23:59:59','%Y-%m-%d %H:%i:%s'))-UNIX_TIMESTAMP(DATE_FORMAT('2019-01-01 00:00:00','%Y-%m-%d %H:%i:%s'))))-1)) SECOND);

结果:

2019-02-16 13:40:00

存储过程获取一段时间:

DELIMITER $$
CREATEFUNCTION `RandomDateTime`(sd DATETIME,ed DATETIME)RETURNS DATETIMEBEGINRETURN DATE_ADD(sd,INTERVAL FLOOR(1+RAND()*((ABS(UNIX_TIMESTAMP(ed)-UNIX_TIMESTAMP(sd)))-1)) SECOND);END$$
DELIMITER ;SELECT RandomDateTime(DATE_FORMAT('2019-01-01 00:00:00','%Y-%m-%d %H:%i:%s'),DATE_FORMAT('2019-04-21 23:59:59','%Y-%m-%d %H:%i:%s')) AS t;

获取一段时间:

select CONCAT(date(from_unixtime(unix_timestamp('2017-01-01') + floor(rand() * ( unix_timestamp('2018-08-08') - unix_timestamp('2017-01-01') + 1 ))
)) ,' ',
LPAD( FLOOR( 9 + ( RAND( ) * 8) ), 2, 0 ),-- 时 0-23  LPAD( FLOOR( 0 + ( RAND( ) * 23 ) ), 2, 0 ),; 9-17 LPAD( FLOOR( 9 + ( RAND( ) * 8 ) ), 2, 0 ),':',LPAD( FLOOR( 0 + ( RAND( ) * 59 ) ), 2, 0 ),-- 分 0-59':',LPAD( FLOOR( 0 + ( RAND( ) * 59 ) ), 2, 0 ) -- 秒 0-59
);

三、利用Datafactory实现测试数据快速生成

3.1 Datafactory简介

Datafactory(数据工厂)工具是Quest公司(http://www.quest.com)旗下的产品,顾名思义,数据工厂是生产数据的,主要应用领域是性能测试中的大数据量测试, 也就是性能测试数据准备阶段。

DataFactory 是一种快速的,易于产生测试数据的带有直觉用户介面的工具,它能建模复杂数据关系。DataFactory是一种强大的数据产生器,它允许开发人员和QA很容易产生百万行有意义的正确的测试数据库,该工具支持DB2、Oracle、Sybase、SQL Server数据库,支持ODBC连接方式,无法直接使用MySQL数据库。它能够根据用户定制,产生或导入需要的数据,插入相应的数据表或导出至外部文件。

3.2  Datafactory原理

通过和数据库进行连接后,对选定表的字段设定一定的插入规则,然后批量插入记录。Datafactory支持各种主流数据库(Oracle、DB2、MS SQL),甚至excel、access等。

3.3 软件安装

3.3.1 DataFactory安装

下载DataFactory并进行安装,下载地址:链接:https://pan.baidu.com/share/init?surl=0PiqHxa4CpCUKaqAb-n99w 提取码:wq47 。

3.3.2 ODBC驱动安装

下载MySQL-ODBC驱动并安装,下载安装myodbc32驱动 : https://dev.mysql.com/downloads/connector/odbc/。

3.3.3 基本配置

a. 启动DataFactory,通过ODBC连接MySQL数据库,如图所示:

b.选择DBC Administrator对ODBC用户DSN的配置,如下图所示:

c. 进入ODBC数据源管理器,通过点击“添加”来新增用户数据源,页面如下:

  • MySQL ODBC 5.3 ANSI Driver:只针对有限的字符集的范围
  • MySQL ODBC 5.3 Unicode Driver:提供了多语言的支持

d. 配置MySQL连接信息,页面如下:

e. 配置好数据源后返回到步骤2的页面,此时需要选择数据源,由于新建的数据源此时还无法进行选择,因此取消此安装流程,重新打开一个新的连接流程即可;

f. 选择相应数据表,页面如下:

g. 选择user1,并进入下一步,指定执行名称为:add_user1,页面如下:

h. 完成配置,页面如下:

3.3.4 简单使用

        以上 ,我们已经完成了配置,下面我们可以定义出入数据的规则,完成数据的生成了。选中表的字段,不同类型,提供不同数据产生的设置。

字段为Field.Text时:
        Insert value from a data table:从系统数据表中获取数据插入
        Insert value from an SQL database:编写SQL语句从数据库中获取数据插入
        Insert text from a file:外部文件数据插入
        Insert random characters:随机值插入
        Insert a string constant:常量值插入
        Build a composite field:组合值插入
字段为Field.Numeric时:
        Insert value from a data table:从系统数据表中获取数据插入
        Insert value from an SQL database:编写SQL语句从数据库中获取数据插入
        Insert value from an arithmetic expression:表达式产生数据插入
        Insert sequential values:自增长数据插入
        Insert random values:随机值插入
        Insert a constant value:常量值插入
字段为Field.Date时:
        Insert value from a data table:从系统数据表中获取数据插入
        Insert value from an SQL database:编写SQL语句从数据库中获取数据插入
        Insert sequential values:连续的时间插入
        Insert random values:随机的时间插入
        Insert the curent system data:当前系统时间插入

1)将id设置为自动生成

2)将name设置成长度为5的随机字符串

3)将username设置成长度为3-8的随机字符串

4)password设置为123456

5)createtime为datetime类型,这里设定设定一个随机的时间,时间跨度为2019-4-21 01:12:58到-2019-4-21 04:12:58。

6)点击Run,提示成功

7)查看数据,插入了100条数据。

注:要修改插入条数,可以修改下图中的ecords。

MySQL 测试数据快速生成相关推荐

  1. MySQL快速生成100W条测试数据

    自接看这一篇就完了(记得给我点个赞) MySQL如何快速生成千万数据量?mysql 如何快速生成百万测试数据实现思路1.创建内存表和普通表2.创建函数及存储过程创建生成n个随机数字https://mp ...

  2. mysql快速生成100W条测试数据(8)全球各城市人口及经济增长速度并存入mysql数据库

    这是之前的文章里面包含一些以前的一些操作流程可以进行参考学习 更加详细操作步骤在第一篇文章里面 mysql快速生成100W条测试数据(1):游戏人物数据 mysql快速生成100W条测试数据(2)公司 ...

  3. DataFactory快速生成测试数据

    1.DataFactory配置连接MySQL 1)下载安装myodbc32驱动 2)DataFactory-->New-->ODBC-->DBC Administrator--> ...

  4. linux dd 截文件,Linux使用dd命令快速生成大文件(转)

    dd命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero ...

  5. 用rapid-framework开源工具快速生成SSH的网站框架MVC模式

    使用开源工具rapid-framework快速搭建ssh项目框架 环境 IDE:myeclipse 8.5 详细搭建过程: 一:打开myeclipse 8.5新建一个web工程,取名web_frame ...

  6. 工具-eclipse-hibernate关于快速生成*.hbm.xml文件,与bean文件的操作,不使用hibernate tool解决办法之一,主要为了快速开发,写的小工具

    实现思想:就是java对目标表的字符串的处理,以及基础的sql语句 不能使用hibernate tool ,解决办法 为了记录,以后也许还会用的小工具 **工具优点:比手打生成快,能加快hiberna ...

  7. 代码生成工具之界面快速生成

    界面开发,无论对于Web开发,还是Winform开发,都需要耗费一定的时间,特别对于一个数据库字段比较多的界面,一般就需要在编辑界面上摆的更多的控件来做数据显示,每次碰到这个,都有点头痛,反复的机械操 ...

  8. idea快速生成crud_Java / Spring:如何快速生成完整的Swagger文档CRUD REST API

    idea快速生成crud 作为开发人员,我们在日常生活中经常面临的最繁琐的任务之一就是编写良好且易于理解的文档. 无论我们的文档只有几行来解释功能的核心功能,还是表明系统的来龙去脉的成熟文章都没关系. ...

  9. Java / Spring:如何快速生成整个Swagger记录的CRUD REST API

    作为开发人员,我们在日常生活中经常面临的最繁琐的任务之一就是编写良好且易于理解的文档. 无论我们的文档只有几行来解释功能的核心功能,还是表明系统的来龙去脉的成熟文章都没关系. 重要的是,我们试图通过文 ...

最新文章

  1. 29.9. Klish - Kommand Line Interface Shell (the fork of clish project)
  2. 利用keepalived和haproxy配置mysql的高可用负载均衡
  3. etc的常见算法_(转)8种常见机器学习算法比较
  4. 计算机网络-数据链路层
  5. nginx访问本地目录一直不好使_nginx 配置根目录不生效问题
  6. C++:值传递、指针传递、引用传递
  7. 数据科学 IPython 笔记本 7.8 分层索引
  8. mac remix导入本地项目
  9. Atitit.编程语言的基础句型and汉语英文比较
  10. TopJUI Combobox 联动
  11. word英文字体下载 如Caecilia LT Std
  12. react的setState——读《react小书》
  13. windows11安装MAVEN
  14. 服务器上的文件误删怎么恢复,云服务器误删文件恢复
  15. Butterworth滤波
  16. 生物基因数据文件——vcf格式详解
  17. photoshop cs6基础学习
  18. C++ 线性表的结构体定义(顺序表和链式表)
  19. MSP430的485通信
  20. 3级流水线11位-4位CRC循环冗余校验码生成器Verilog

热门文章

  1. L. Link with Level Editor I dp
  2. 木马核心技术剖析读书笔记之木马驱动加载与启动
  3. 校招软件测试面经篇一(互联网企业)
  4. ubuntu的视频录制功能
  5. android自动秒杀脚本,gg修改器执行脚本按键代码秒杀安卓
  6. 【Hive】Hive建表基本语法及解释
  7. Unmapped Spring configuration files found. Please configure Spring facet or use 'Create Default ...
  8. 富斯遥控器的遥控距离大概三四百米
  9. TCP协议详解之TCP Flag标志位来判断TCP会话的开始和结束
  10. WPS设置公式自动编号+公式居中,编号靠右。