Tuesday, January 13, 2009

Why to generate test data and how. 为什么要生成测试数据?如何做?

在学会生成测试数据之前,我仅仅知道select * from scott.emp;
加上
create table t(a number);
insert t values(1);
这就是我知道的所谓测试,幼稚吧.

为啥需要测试数据呢?
情况太多了,我的经验是,等到你需要的时候,就是找不到,干着急.

测试数据可以用来把灵感转化为实践,验证原型是否工作(可用性,可靠性,可扩展性),性能测试,提问题和重现问题 等等. 随后有一篇介绍我是如何用完善的测试数据发现了使用MERGE SQL产生的臭虫.
还支持TDD, 测试驱动开发, 用过以后你就知道甜头了, 和异步处理一样美妙!

关于提问题, 引自Tom: You would better supply very very simple create tables and insert statements.
The SMALLEST create table possible (no tablespaces, no schema names, just like I do in my examples for you)

解决方案.
--------

*) 产生多个不同数值, 得到一定的数据分布

Mod(rownum,500)
dbms_random.value(1,500)
dbms_random.normal()

*) 产生字符串

rpad('x',500,'x')
lpad(RowNum,200,'*')
dbms_random.string('l',500)
# 'u', 'U' - returning string in uppercase alpha characters
# 'l', 'L' - returning string in lowercase alpha characters
# 'p': any printable char. this one is slow

*) 数据源

# dual connect by level <= 3000 # all_objects # WITH subquery factor *) 随机排序 ORDER BY dbms_random.random; *) 点击进入具体示例

*) 参考
1. Tom, from dba_object
2. Jonathan, + materialize subquery
3. Christian Antognini, dbms_random.string()
4. Tanel, dual join dual connect by level <= 3000
维多利亚市的天鹅湖, 湖对岸右边一点是Hatley Castle城堡, 电影X-Man(X战警)三部都是在这里拍摄的.

0 comments: