6.2.2 数据生成
对于性能测试环境的搭建,还有一个麻烦的问题,就是性能测试数据如何生成?也就是大家经常遇到的容量问题。在性能测试方案中存在着容量为500万条论坛帖子,3万注册会员的数据要求,如何快速有效地生成这些容量呢?
某些公司会将历史业务数据通过导入的方式实现容量的模拟,但是这种做法存在着几个问题:
● 某些数据内容敏感,是否会涉及信息泄露。
● 历史业务数据和新系统的结构不同,导出困难。
这样做不行,难道自己再编写个LoadRunner脚本专门来发那么多帖子么?500万个帖子,如果用LoadRunner来进行数据生成效率太低,这里可以考虑使用编写SQL代码或者专门的数据生成工具来实现容量的生成。
通过编写一个存储过程来完成对数据的随机生成,只需要修改中间的Insert命令即可完成表格的适应,以及对生成记录条数的控制。这里以T-SQL为例,该存储过程可以实现随机生成10~20位大小写混合的字符串,最终通过insertrandstr存储过程,实现记录的添加。
--生成随机数据 if exists (select * from sysobjects where name = 'createsinglechar' and type = 'p') drop proc createsinglechar go if exists (select * from sysobjects where name = 'createsingleip' and type = 'p') drop proc createsingleip go if exists (select * from sysobjects where name = 'createwholestr' and type = 'p') drop proc createwholestr go if exists (select * from sysobjects where name = 'insertrandstr' and type = 'p') drop proc insertrandstr go use [projcet] go create procedure createsingleip @randip int output as declare @singleip int set @singleip = cast(rand()*256 as int) --print @singleip while (@singleip>255 or @singleip<0) begin set @singleip = cast(rand()*256 as int) --print @singleip end set @randip = @singleip --print @randip go create procedure createsinglechar @randchar varchar(3) output as declare @singlechar varchar(10) set @singlechar = cast(rand()*123 as int) while (@singlechar<65 or @singlechar>122 or (@singlechar>90 and @singlechar<97)) begin set @singlechar = cast(rand()*123 as int) end set @randchar = @singlechar go --97 122 --65 90 create procedure createwholestr @wholestr varchar(20) output as declare @len varchar(10) set @len = cast(rand()*20 as int) while (@len>20 or @len<10) begin set @len = cast(rand()*20 as int) end declare @singlechar varchar(10) declare @mystr varchar(20) declare @i int set @i=1 set @mystr = '' while(@i<=@len) begin exec createsinglechar @singlechar output --select @singlechar set @mystr = @mystr + char(@singlechar) set @i=@i+1 end set @wholestr = @mystr go --exec createwholestr abc create procedure insertrandstr as declare @data1 varchar(20) declare @data2 varchar(20) declare @ip1 int declare @ip2 int declare @ip3 int declare @ip4 int declare @ip varchar(15) create table testtable( id int not null, username varchar(20) not null, message varchar(20) not null, logindate varchar(20) not null, ip varchar(20) not null ) declare @j int set @j=1 while (@j<=10) begin exec createwholestr @data1 output exec createwholestr @data2 output exec createsingleip @ip1 output exec createsingleip @ip2 output exec createsingleip @ip3 output exec createsingleip @ip4 output set @ip=cast(@ip1 as varchar(3))+'.'+cast(@ip2 as varchar)+'.'+cast(@ip3 as varchar)+'.'+cast(@ip4 as varchar) insert into testtable([id],[username],message,logindate,ip) values (@j,@data1,@data2,getdate(),@ip) set @j = @j + 1 end select * from testtable --drop table testtable go exec insertrandstr |