使用data factory工具&LR脚本快速生成大批量数据&&存储过程造数据

上次在我的博客中讲述了quest公司的spotlight系列软件,这次来扯淡一下quest公司的另一测试辅助软件 datafactory(数据工厂),顾名思义,数据工厂是生产数据的,主要应用领域是性能测试中的大数据量测试, 也就是性能测试数据准备阶段。

原理说明:

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

环境说明:

Oracle10g,创建2个表,一个是testtable,一个testtable2。计划用datafactory往testtable中插入记录,其中需要读取testtable2中的部分字段信息。testtable表的字段类型如下(字段类型已经尽可能覆盖多种情况):

Testtable表:

 

testtable字段类型

 

Testable2字段类型和testtable类似,里面记录情况如下:

编号

姓名

性别

出生日期

毕业院校

分数

照片

考核情况

1

张三

1

2009-12-21

北京大学

85.5

<BLOB>

<NCLOB>

2

李四

0

2002-7-16

清华大学

78.2

<BLOB>

<NCLOB>

3

王五

1

1999-6-8

湖南大学

65.5

<BLOB>

<NCLOB>

 

详细操作描述:

安装完datafactory之后,进入file菜单下面点击new,然后选择oracle数据库类型。

oracle数据类型

 

然后会要求输入oracle的net服务,和连接的用户名和密码。

 

 

 

选择要插入记录的表。

 

 

进入设置插入表规则界面,对每个字段的插入规则在右边界面进行设置。

 

设定规则,testtable表中编号字段为long integer类型,这里设定为插入顺序值(insert sequential values)。

 

设定规则,testtable表中姓名字段为vachar2类型,这里设定从testtable2表中查询结果随机取值。

 

 

设定规则,testtable表中出生日期为date类型,这里设定设定一个随机的时间,时间跨度为1982年-1988年的任何一天。

 

 

设定规则,testtable表中分数为为number类型,这里设定设定一个随机数值,数字跨度为50-85.5。

 

设定规则,testtable表中考核情况为NCLOB类型,这里设定随机从文件夹中的text文件获得内容。

 

设定规则,testtable表中照片为BLOB类型,这里设定随机从文件夹中的获得图片。

 

设定完毕后,点击上面的run按钮,成功执行插入。插入后的效果如下所示:

 

引发的另外一个问题:

      因为datafactory试用版只能每次插入100条数据,购买正版又没有钱,而大数据量的测试动不动就要100万级的数据,那要准备100万条数据可是要点10000次鼠标啊,那样的话,性能测试还没有开始,人就已经崩溃了。其实,有很多办法能够解决这个问题。如写一个多线程的程序,反复触发插入事件。当然最简单的办法,还是用HP公司的Loadrunner录一段插入的脚本,然后设定几个虚拟用户(原理上也是多线程插入的方式)进行插入就可以轻松搞定了。


录制插入脚本,把整个插入操作当作一个事务。


设定场景,这里设定8个虚拟用户,并发插入,时限为5分钟。

 

场景运行情况,插入事务一共通过了2635个。

 

从上面的事务来看,一共有2635个事务通过,因为试用版每次插入100条数据,则应该插入的总记录数为:2635×100=263500条,进入数据库,执行查询,可以发现记录数正确。




系统开发完毕后,需要完备测试系统页面的逻辑功能,一条条考虑各种情况往数据库里插数据太麻烦了,为此我写了一个存储过程批量造数据,例子如下,共有三张表wideip,pool,status表
1.其中一个wideip包含多个pool(一对多)
2.status表是一个字典表有初始数据,wideip,pool里都有status_id外键,对应于status表里的id。
  初始值为
  
  1. INSERT INTO `status` VALUES ('0', 'available');
  2. INSERT INTO `status` VALUES ('1', 'offline');
  3. INSERT INTO `status` VALUES ('2', 'unknown');
  4. INSERT INTO `status` VALUES ('3', 'unavilable');
3.pool里的wideip_id是一个外键关联了wideip的id
4.enable标识wideip和pool的开关,只有0,1两个状态
对于wideip来说,enable(2种变化)和status_id(4种变化)属性是可变的,因此完备的情况有2x4种
对于某个wideip下面的pool来说,enable(2种变化)和status_id(4种变化)属性是可变的,因此完备的情况有2x4种xwideip的变化=2x4x2x4=64种
造数据的过程如下
1.先清空wideip和pool表,恢复自增为1
2.每插一个wideip,针对这个wideip造出8个完备的pool记录
表结构代码:
  1. SET FOREIGN_KEY_CHECKS=0;
  2. -- ----------------------------
  3. -- Table structure for pool
  4. -- ----------------------------
  5. CREATE TABLE `pool` (
  6.   `id` int(11) NOT NULL AUTO_INCREMENT,
  7.   `name` varchar(255) NOT NULL,
  8.   `wideip_id` int(11) NOT NULL,
  9.   `enable` tinyint(4) NOT NULL,
  10.   `status_id` tinyint(4) NOT NULL,
  11.   PRIMARY KEY (`id`),
  12.   KEY `wideip_pool_fk` (`wideip_id`),
  13.   KEY `status_pool_fk` (`status_id`),
  14.   CONSTRAINT `status_pool_fk` FOREIGN KEY (`status_id`) REFERENCES `status` (`id`),
  15.   CONSTRAINT `wideip_pool_fk` FOREIGN KEY (`wideip_id`) REFERENCES `wideip` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
  16. ) ENGINE=InnoDB AUTO_INCREMENT=DEFAULT CHARSET=latin1;

  17. -- ----------------------------
  18. -- Table structure for status
  19. -- ----------------------------
  20. CREATE TABLE `status` (
  21.   `id` tinyint(4) NOT NULL,
  22.   `name` varchar(255) NOT NULL,
  23.   PRIMARY KEY (`id`)
  24. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

  25. -- ----------------------------
  26. -- Table structure for wideip
  27. -- ----------------------------
  28. CREATE TABLE `wideip` (
  29.   `id` int(11) NOT NULL AUTO_INCREMENT,
  30.   `name` varchar(255) NOT NULL,
  31.   `enable` tinyint(4) NOT NULL,
  32.   `status_id` tinyint(4) NOT NULL,
  33.   PRIMARY KEY (`id`),
  34.   KEY `status_id` (`status_id`),
  35.   CONSTRAINT `wideip_ibfk_1` FOREIGN KEY (`status_id`) REFERENCES `status` (`id`)
  36. ) ENGINE=InnoDB AUTO_INCREMENT=DEFAULT CHARSET=latin1;
  37. INSERT INTO `status` VALUES ('0', 'available');
  38. INSERT INTO `status` VALUES ('1', 'offline');
  39. INSERT INTO `status` VALUES ('2', 'unknown');
  40. INSERT INTO `status` VALUES ('3', 'unavilable');
造数据的存储过程
  1. /*清空所有数据数据*/
  2. drop procedure if exists clear_all_data;
  3. delimiter ;;
  4. create procedure clear_all_data()
  5. BEGIN
  6.      /*清空数据*/
  7.   delete from wideip;
  8.   /*让自增从1*/
  9.   alter table wideip auto_increment 1;
  10.   /*清空pool数据*/
  11.     delete from pool;
  12.     /*让pool自增从1*/
  13.     alter table pool auto_increment 1;
  14. END;;
  15. delimiter ;


  16. drop procedure if exists make_pool_data;
  17. /*造每个wideip对于的pool数据*/
  18. delimiter ;;
  19. create procedure make_pool_data(wideipId int)
  20. BEGIN
  21.   declare d_enable int default 0;
  22.   declare d_status_id int default 0;
  23.   declare isError int default 0;
  24.      declare Done int default 0;
  25.      declare i int default 0;
  26.   
  27.         /* 声明游标 */
  28.   DECLARE rs CURSOR FOR select id from status order by id;
  29.   
  30.     /* 异常处理 */
  31.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
  32.   DECLARE CONTINUE HANDLER FOR 1146 SET isError=1;
  33.   
  34.     REPEAT
  35.             /* 打开游标 */
  36.         OPEN rs; 
  37.         REPEAT
  38.             /*取status_id*/
  39.             FETCH rs INTO d_status_id;
  40.             IF Done!=THEN
  41.                 select d_enable,d_status_id;
  42.                 set i=i+1;
  43.                 insert into pool(name,enable,status_id,wideip_id) values(concat("name",wideipId,"_",i),d_enable,d_status_id,wideipId);
  44.             END IF;
  45.         UNTIL d_status_id is NULL or Done=END REPEAT;
  46.         CLOSE rs;
  47.         set d_enable=d_enable+1;
  48.         set Done=0;
  49.     UNTIL d_enable >= 2 END REPEAT;
  50. END;;
  51. delimiter ;


  52. drop procedure if exists make_wideip_data;
  53. /*造wideip的数据并调用 make_pool_data */
  54. delimiter ;;
  55. create procedure make_wideip_data()
  56. BEGIN
  57.   declare d_enable int default 0;
  58.   declare d_status_id int default 0;
  59.   declare isError int default 0;
  60.      declare Done int default 0;
  61.      declare i int default 0;
  62.      declare newWideipId int default 0;
  63.   
  64.         /* 声明游标 */
  65.   DECLARE rs CURSOR FOR select id from status order by id;
  66.   
  67.     /* 异常处理 */
  68.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
  69.   DECLARE CONTINUE HANDLER FOR 1146 SET isError=1;
  70.   
  71.     REPEAT
  72.             /* 打开游标 */
  73.         OPEN rs; 
  74.         REPEAT
  75.             /*取status_id*/
  76.             FETCH rs INTO d_status_id;
  77.             IF Done!=THEN
  78.                 select d_enable,d_status_id;
  79.                 set i=i+1;
  80.                 insert into wideip(name,enable,status_id) values(concat("name",i),d_enable,d_status_id);
  81.                 set newWideipId=last_insert_id();
  82.              call make_pool_data(newWideipId);
  83.             END IF;
  84.         UNTIL d_status_id is NULL or Done=END REPEAT;
  85.         CLOSE rs;
  86.         set d_enable=d_enable+1;
  87.         set Done=0;
  88.     UNTIL d_enable >= 2 END REPEAT;
  89. END;;
  90. delimiter ;






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值