欢迎所有爱好软件测试的任人志士加入本空间!
数据库数据产生工具 DBMonster 应用详解
数据库数据产生工具 DBMonster 应用详解
在进行某些侧重数据计算相关的应用(例如报表程序),或是在对一个应用进行负载和压力测试时,往往需要在数据库中产生大量的负载,对测试工程师来说,这个工作往往会不那么轻松。当然,从“现场数据库”中获得现有的数据作为测试基础数据是一个办法,但如果目前还得不到现场数据,或者,很难获得现场数据,那该怎么办呢?
g6p%M&g+|D!r v;`Td0
答案只有一个——使用工具:)。这方面的商业工具有 Quest 公司的 DataFactory 工具,几乎可以产生任何你所需要的数据。不过,作为开源工具的提倡者,我今天要介绍的,是一个可用于这个目的的开源测试工具 DBMonster。软件测试技术第一门户|f$W5BDzg6p%M&g+|D!r v;`Td0
DBMonster ( http://dbmonster.kernelpanic.pl )是一个Java的开源项目,通过JDBC方式连接数据库,因此可以在任何支持Java和JDBC的平台上运行。DBMonster开发的原意是为数据库开发者服务,可以协助产生大量的规则或不规则数据,便于数据库开发者基于这些数据进行数据库的调优。
1lF*`pyY0 DBMonster通过两个XML文件(配置文件 和 schema文件)控制数据产生的行为,配置文件指明需要连接的数据库、连接使用的用户名和口令、需要操作的sheme、重试次数等全局设置,而scheme文件则指明针对每张数据表的每个字段产生数据的规则。软件测试技术第一门户@;H.L(Z \)qN(X D4?
DBMonster的下载和安装
DBMonster的下载和安装非常简单,直接从sourceforge上下载dbmonster-core,解压到本地的任一目录即可。如果需要DBMonster和Ant的集成,则还需下载dbmonster-ant。软件测试技术第一门户'D.B8_1A hDBMonster的运行
DBMonser的运行也很简单,DBMonster解压后的bin目录中有dbmonster.bat和dbmonster文件,如果是在windows平台上,则可以直接运行dbmonster.bat文件;如果是在Unix平台上,则运行dbmonster文件。软件测试技术第一门户p5BZ9yf1Z1th3[%dDBMonster运行时的主要参数是-c和-s,分别指明配置文件和schema文件的位置。缺省的配置文件位于DBMonster的安装目录下,名称是dbmonster.properties。例如,如果我们使用缺省的配置文件,指明schema文件为test-schema.xml,则命令行为:
S x%eS6k^/y4N.~0
dbmonster -s test-schema.xml
软件测试技术第一门户kmox8C CC1e$[V另外,DBMonster可以直接抓取数据库schema中的表结构,使用--grab参数即可。但要注意的是,如果你没有在配置文件中指定schema名称,dbmonster会抓取全部的表。
kAp)X1G0
DBMonster的配置文件
缺省的配置文件位于DBMonster的安装目录下,名称是dbmonster.properties。其内容如下(以Oracle为例,其他的数据库类型请自行修改JDBC驱动名称、数据库连接字符串等内容):Ot.Z vVH0
jt!A J5f;Hr\B0
dbmonster.jdbc.driver=oracle.jdbc.driver.OracleDriver软件测试技术第一门户1hiQ1O;}N#]
dbmonster.jdbc.url=jdbc:oracle:thin:@testdb:1521:test软件测试技术第一门户dRK Z3Lwp
dbmonster.jdbc.username=student软件测试技术第一门户b+I#Q V%v
dbmonster.jdbc.password=123456
}3P3h!t7KfL){B0dbmonster.jdbc.transaction.size=50软件测试技术第一门户2l:_~ f!n1D}G
软件测试技术第一门户$]DA|:K2v:|5AM
# for Oracle and other schema enabled databases软件测试技术第一门户_;Lp)u:G9\~*q1I1A*_&}
dbmonster.jdbc.schema=student软件测试技术第一门户^t~A Z6Z+L8rz
:m,c"[D#J(X9wq5D0# maximal number of (re)tries软件测试技术第一门户{saL D'u \7a
dbmonster.max-tries=1000软件测试技术第一门户o*`k1N4|:G%Rr[
dCq2R7z|bJLd0# default rows number for SchemaGrabber软件测试技术第一门户-kg:Q%Y:E8EO
dbmonster.rows=1000软件测试技术第一门户7I I'H@!@
软件测试技术第一门户 v#sX2Ix4p v
# progres monitor class软件测试技术第一门户jzPa9j6Uj
dbmonster.progress.monitor=pl.kernelpanic.dbmonster.ProgressMonitorAdapter
dbmonster.jdbc.url=jdbc:oracle:thin:@testdb:1521:test软件测试技术第一门户dRK Z3Lwp
dbmonster.jdbc.username=student软件测试技术第一门户b+I#Q V%v
dbmonster.jdbc.password=123456
}3P3h!t7KfL){B0dbmonster.jdbc.transaction.size=50软件测试技术第一门户2l:_~ f!n1D}G
软件测试技术第一门户$]DA|:K2v:|5AM
# for Oracle and other schema enabled databases软件测试技术第一门户_;Lp)u:G9\~*q1I1A*_&}
dbmonster.jdbc.schema=student软件测试技术第一门户^t~A Z6Z+L8rz
:m,c"[D#J(X9wq5D0# maximal number of (re)tries软件测试技术第一门户{saL D'u \7a
dbmonster.max-tries=1000软件测试技术第一门户o*`k1N4|:G%Rr[
dCq2R7z|bJLd0# default rows number for SchemaGrabber软件测试技术第一门户-kg:Q%Y:E8EO
dbmonster.rows=1000软件测试技术第一门户7I I'H@!@
软件测试技术第一门户 v#sX2Ix4p v
# progres monitor class软件测试技术第一门户jzPa9j6Uj
dbmonster.progress.monitor=pl.kernelpanic.dbmonster.ProgressMonitorAdapter
$sqD6Sa,b0
DBMonster的schema文件
schema文件描述了产生数据的规则,在DBMonster中,数据的产生是通过Generator生成的,DBMonster中缺省的数据Generator包括两个Key Generator(用于产生不重复的数据,分别为MaxKeyGenerator和StringKeyGenerator)和 10 个Data Generator。以下简单说明一下Data Generator的使用。6UNDUq3AYNu8Z0 BinaryGenerator用于从外部文件中获取二进制数据并插入相应字段,该Generator有两个属性,分别为file和nulls,file属性描述数据来源,而nulls属性则给出该字段生成null的几率。
n#sK _$v cg:Gk| ]0 BooleanGenerator用于产生bool型数据,该Generator包括两个属性,分别为probability和nulls,probability属性描述产生true值数据的几率,nulls属性给出生成null的几率。
z,JL E)CG?!~#U4r0 ConstantGenerator用于产生固定值的数据,该Generator只有一个属性constant,给出要插入数据库的值;
#R k[v d+O0 DateTimeGenerator用于产生DateTime型数据,该Generator包括四个属性,分别是startDate,endDate,returnedType和nulls,startDate描述开始时间,endDate描述终止时间,格式为“yyyy-mm-dd hh24:MM:ss”;returnedType描述生成数据的类型,可以为date、time或是timestamp;
2cs7u.^vR+ar0 DirectoryGenerator用于根据本地文件(字典)的条目向数据库插入数据,该Generator包括两个属性,分别为dictFile和unique,dictFile指明字典文件所在的位置,unique指明产生的数据是unique的还是random的;
%~/y R{c`p0AnI0 ForeignKeyGenerator用于为设置了外键的字段生成数据,该Generator包含两个属性,分别是tableName和columnName,tableName指明外键引用的表名,columnName指明外键引用的字段名;
*n/pV#]F1v3A0 NullGenerator用于产生null类型的数据,该Generator不带任何参数(只产生null);
[^3v1t@g0 NumberGenerator用户产生数值类型的数据,该Generator包括5个属性,分别是minValue、maxValue、returnedType、scale和nulls。其中,minValue和maxValue分别给出产生值的下边界和上边界;returnedType给出生成数据的类型,可以是short、integer、long、float、double和numeric类型;scale指明小数位数;nulls表示产生null的几率;软件测试技术第一门户KHq La$f;]
StringGenerator用于产生字符串类型的数据,该Generator包括5个属性,分别是minLength、maxLength、allowSpaces、excludeChars和nulls。其中,minLength和maxLength限定了字符串长度;allowSpaces控制字符串中是否包含空格;excludeChars排除产生字符串时不使用的字符;nulls表示产生null的几率;软件测试技术第一门户{/xt6c&Q-v
StringChoiceGenerator用于从给定的字符串中随机挑选一个作为字段内容,该Generator包含两个属性,分别是choice和nulls。其中choice是以逗号分隔的字符串,逗号分隔开的每个内容是一个字段可用的内容。软件测试技术第一门户!X gT$zW
例如,如果我们有一张数据表的DDL如下:软件测试技术第一门户"X%_&D\A#l6ZO
0~5fU%{.r0
CREATE TABLE "TEST"."TEST_DATA" ("INT_ID" NUMBER NOT
4Y)vUZV'sG0 NULL, "IPADDR" VARCHAR2(15 byte) NOT NULL, "COMPRESS_DAY"
P,h7l1e MO/`%D0 DATE NOT NULL, "CPUIDLE" NUMBER, "CPUSYSUTIL" NUMBER,软件测试技术第一门户R8}:M8H/U'K,B!R
"CPUUSRUTIL" NUMBER, "SYSTEM_LOAD" NUMBER, "MEMRATIO" NUMBER,软件测试技术第一门户kG,Y J!q*w$o2q
"MEMFREE" NUMBER, "SWAPFREE" NUMBER, "SWAPRATIO" NUMBER,
;J']0Ce:LNZ9JF5k0 "BUSY_FLAG" NUMBER(5)) 软件测试技术第一门户F DN g{&y5E:U
TABLESPACE "TS_IPWEB" PCTFREE 10 PCTUSED 0 INITRANS 1软件测试技术第一门户:K%O.O,U[oe"a1A(a
MAXTRANS 255
6KjC0h_M1l%{0 STORAGE ( INITIAL 120K NEXT 512K MINEXTENTS 1 MAXEXTENTS软件测试技术第一门户o+L(gs&j2So,w
2147483645 PCTINCREASE 0)软件测试技术第一门户O0US]Hg(eq
LOGGING
4Y)vUZV'sG0 NULL, "IPADDR" VARCHAR2(15 byte) NOT NULL, "COMPRESS_DAY"
P,h7l1e MO/`%D0 DATE NOT NULL, "CPUIDLE" NUMBER, "CPUSYSUTIL" NUMBER,软件测试技术第一门户R8}:M8H/U'K,B!R
"CPUUSRUTIL" NUMBER, "SYSTEM_LOAD" NUMBER, "MEMRATIO" NUMBER,软件测试技术第一门户kG,Y J!q*w$o2q
"MEMFREE" NUMBER, "SWAPFREE" NUMBER, "SWAPRATIO" NUMBER,
;J']0Ce:LNZ9JF5k0 "BUSY_FLAG" NUMBER(5)) 软件测试技术第一门户F DN g{&y5E:U
TABLESPACE "TS_IPWEB" PCTFREE 10 PCTUSED 0 INITRANS 1软件测试技术第一门户:K%O.O,U[oe"a1A(a
MAXTRANS 255
6KjC0h_M1l%{0 STORAGE ( INITIAL 120K NEXT 512K MINEXTENTS 1 MAXEXTENTS软件测试技术第一门户o+L(gs&j2So,w
2147483645 PCTINCREASE 0)软件测试技术第一门户O0US]Hg(eq
LOGGING
Hj9ej |c0 则,对应的产生数据的schema文件如下(只包含部分字段):
G$Xme q^0
<?xml version="1.0" encoding="iso-8859-1"?>软件测试技术第一门户3G3XZ@BOR.Gn
<!DOCTYPE dbmonster-schema PUBLIC软件测试技术第一门户BD7M3iDS n)o(DW
"-//kernelpanic.pl//DBMonster Database Schema DTD 1.1//EN"
,?G?5s}!z X `?*d0 "http://dbmonster.kernelpanic.pl/dtd/dbmonster-schema-1.1.dtd">软件测试技术第一门户#iE ^;kHaK0O\"}
7{'r5KG%c0<dbmonster-schema>软件测试技术第一门户,]s3c9B9^xm?q
<name>ipnms</name>软件测试技术第一门户5e6EMx"u^m(R7D
<table name="test.test_data" rows="500">软件测试技术第一门户JEp5SD+O&]V
<column name="int_id">
%S{:[$IE;J.ex#v0 <generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
8dZ(y"?DG3?bBG M@s0 <property name="nulls" value="0"/>软件测试技术第一门户rH t7D yNV&t
<property name="minValue" value="20"/>软件测试技术第一门户 U6RYU+?u)WTG
<property name="maxValue" value="20"/>
?hy$A.M(L&X0 <property name="returnedType" value="numeric"/>软件测试技术第一门户/D.`#G*@1hp \a*e
<property name="scale" value="0"/>
z C^R$p0A]2M)?0 </generator>软件测试技术第一门户9Q"^"e\n&w.k!@
</column>
c ~:rL_Upjb0 <column name="ipaddr">软件测试技术第一门户1r9Da rrG8Rv
<generator type="pl.kernelpanic.dbmonster.generator.ConstantGenerator">软件测试技术第一门户 qXO+F*l+AV
<property name="constant" value="10.1.200.201"/>
4Z-]N'@"j~+r6Dg0 </generator>软件测试技术第一门户M7K|Llky/])G2q
</column>
+gi^] ?@:f8R!m$u0 <column name="compress_day">软件测试技术第一门户*B3OrwU$J
<generator type="pl.kernelpanic.dbmonster.generator.DateTimeGenerator">软件测试技术第一门户VXM8g-j-@
<property name="nulls" value="0"/>软件测试技术第一门户_i7WaM([ g;o
<property name="startDate" value="2006-03-01 00:00:00"/>
M {z:q,r,H0 <property name="endDate" value="2006-03-31 00:00:00"/>软件测试技术第一门户:CL7lTH6ynu8b
<property name="returnedType" value="date"/>软件测试技术第一门户(l!o t;j:P2[sa0u
</generator>
"I8xYkOX'W-wX o0 </column>软件测试技术第一门户0C8y0z FT!Nof
<column name="disk_dir">
|{"n `S0 <generator type="pl.kernelpanic.dbmonster.generator.ConstantGenerator">软件测试技术第一门户IvzWHo
<property name="constant" value="/var/mqm"/>软件测试技术第一门户lF:Ph/ztk
</generator>软件测试技术第一门户B6ih9vMQC!Y#Zy
</column>软件测试技术第一门户!J~h;H^'n
<column name="disk_device">软件测试技术第一门户@H5o-Z[S})W?
<generator type="pl.kernelpanic.dbmonster.generator.ConstantGenerator">
oB0N_.B(f0 <property name="constant" value="/dev/c0s0t1"/>软件测试技术第一门户 Au6~CL/E4\h"W#P
</generator>软件测试技术第一门户ww%e2q:j O.^,y
</column>软件测试技术第一门户@3g y/nsh8|'\8l
<column name="disk_used_rate">软件测试技术第一门户X|&\$G0S)YM#wH
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
a@8gH!W0@(wJ0 <property name="nulls" value="0"/>软件测试技术第一门户0oe Yrq
<property name="minValue" value="1"/>软件测试技术第一门户6h6liqD9U
<property name="maxValue" value="80"/>
&EQW&QH'o"P4[P5U0 <property name="returnedType" value="numeric"/>软件测试技术第一门户hD q8|-s ? i"JF
<property name="scale" value="0"/>
V,UF\~B\\ Z3w-e%B0 </generator>
F2`K/c c!SL0 </column>软件测试技术第一门户)|Dv9k`]'z@4He
</table>
W5k[&A%~ff0</dbmonster-schema>
<!DOCTYPE dbmonster-schema PUBLIC软件测试技术第一门户BD7M3iDS n)o(DW
"-//kernelpanic.pl//DBMonster Database Schema DTD 1.1//EN"
,?G?5s}!z X `?*d0 "http://dbmonster.kernelpanic.pl/dtd/dbmonster-schema-1.1.dtd">软件测试技术第一门户#iE ^;kHaK0O\"}
7{'r5KG%c0<dbmonster-schema>软件测试技术第一门户,]s3c9B9^xm?q
<name>ipnms</name>软件测试技术第一门户5e6EMx"u^m(R7D
<table name="test.test_data" rows="500">软件测试技术第一门户JEp5SD+O&]V
<column name="int_id">
%S{:[$IE;J.ex#v0 <generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
8dZ(y"?DG3?bBG M@s0 <property name="nulls" value="0"/>软件测试技术第一门户rH t7D yNV&t
<property name="minValue" value="20"/>软件测试技术第一门户 U6RYU+?u)WTG
<property name="maxValue" value="20"/>
?hy$A.M(L&X0 <property name="returnedType" value="numeric"/>软件测试技术第一门户/D.`#G*@1hp \a*e
<property name="scale" value="0"/>
z C^R$p0A]2M)?0 </generator>软件测试技术第一门户9Q"^"e\n&w.k!@
</column>
c ~:rL_Upjb0 <column name="ipaddr">软件测试技术第一门户1r9Da rrG8Rv
<generator type="pl.kernelpanic.dbmonster.generator.ConstantGenerator">软件测试技术第一门户 qXO+F*l+AV
<property name="constant" value="10.1.200.201"/>
4Z-]N'@"j~+r6Dg0 </generator>软件测试技术第一门户M7K|Llky/])G2q
</column>
+gi^] ?@:f8R!m$u0 <column name="compress_day">软件测试技术第一门户*B3OrwU$J
<generator type="pl.kernelpanic.dbmonster.generator.DateTimeGenerator">软件测试技术第一门户VXM8g-j-@
<property name="nulls" value="0"/>软件测试技术第一门户_i7WaM([ g;o
<property name="startDate" value="2006-03-01 00:00:00"/>
M {z:q,r,H0 <property name="endDate" value="2006-03-31 00:00:00"/>软件测试技术第一门户:CL7lTH6ynu8b
<property name="returnedType" value="date"/>软件测试技术第一门户(l!o t;j:P2[sa0u
</generator>
"I8xYkOX'W-wX o0 </column>软件测试技术第一门户0C8y0z FT!Nof
<column name="disk_dir">
|{"n `S0 <generator type="pl.kernelpanic.dbmonster.generator.ConstantGenerator">软件测试技术第一门户IvzWHo
<property name="constant" value="/var/mqm"/>软件测试技术第一门户lF:Ph/ztk
</generator>软件测试技术第一门户B6ih9vMQC!Y#Zy
</column>软件测试技术第一门户!J~h;H^'n
<column name="disk_device">软件测试技术第一门户@H5o-Z[S})W?
<generator type="pl.kernelpanic.dbmonster.generator.ConstantGenerator">
oB0N_.B(f0 <property name="constant" value="/dev/c0s0t1"/>软件测试技术第一门户 Au6~CL/E4\h"W#P
</generator>软件测试技术第一门户ww%e2q:j O.^,y
</column>软件测试技术第一门户@3g y/nsh8|'\8l
<column name="disk_used_rate">软件测试技术第一门户X|&\$G0S)YM#wH
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
a@8gH!W0@(wJ0 <property name="nulls" value="0"/>软件测试技术第一门户0oe Yrq
<property name="minValue" value="1"/>软件测试技术第一门户6h6liqD9U
<property name="maxValue" value="80"/>
&EQW&QH'o"P4[P5U0 <property name="returnedType" value="numeric"/>软件测试技术第一门户hD q8|-s ? i"JF
<property name="scale" value="0"/>
V,UF\~B\\ Z3w-e%B0 </generator>
F2`K/c c!SL0 </column>软件测试技术第一门户)|Dv9k`]'z@4He
</table>
W5k[&A%~ff0</dbmonster-schema>
p.fx&ZD{0
DBMonster 和 DataFactory 的对比
作为一款开源的数据产生工具,DBMonster与Data Factory想比较,在功能方面DBMonster显得弱一些,例如,在产生composite类型的字段、在自动查找关联表方面,DBMonster都只能让用户自己解决;另外,在使用的便利性方面DBMonster也没有提供漂亮的GUI界面,因此肯定会有些人觉得这个工具不好用(但对我来说,我似乎更加习惯于这种用xml描述数据产生的方式)。\CZrY)W7C0不过,DBMonster其实已经可以胜任大多数情况下的数据库数据产生了,我在使用中发现的它的最大的局限性是在针对具有多字段约束(例如,包含多个字段的unique index约束)时数据产生的不便,当然,在DBMonster的Manual中也提到了,可以通过自己写代码来扩展这些,而且也给出了相应的代码示例,但对普通用户来说,还是希望工具能够用起来更加方便吧。软件测试技术第一门户"kE*P"^%l
结语
如果你正在寻找一个能够为你产生大量数据库数据的免费的工具,毫无疑问,DBMonster可以帮助你;如果你希望找到一个可以和Ant工具协作的数据产生器,DBMonster是一个很好的选择;如果更进一步,你希望找到一个可以自行扩展的数据产生工具,那么相信我,DBMonster一定是你的最佳选择:)TC;\7w&w'Y3r;U O#i0
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG:
