首页 > 代码库 > BI测试工具之跨数据库数据对比,支持oracle,sqlserver

BI测试工具之跨数据库数据对比,支持oracle,sqlserver

应用场景:

本周在进行SIT,我帮助仅有的一个测试妹妹对部分表进行数据质量验证,第一步需要做的就是比对sourcestage表的table definition 数据内容的一致性。

本项目使用的是oracle作为DWsource是oracle,sqlserver和xls.

没有权限建立database link, 测试们常用的方法是比对总行数,然后如果数据集太大的话,则抽样比对,导出数据到xls,然后使用beyondcompare进行比对。

如果值出现不同,则需要查找出哪些行的值不同,最少要找出一条具体的值。

我测试的时候发现,手动去做这一些事也是挺费力的。就写了以下的小工具进行辅助测试。

功能:

1.支持从oracle,sqlserverxls中取数据进行比对。

2.oraclesqlserver,可采用传统的比对,各自获取一个readonly ,forward datareader,逐行比对。点击CompareData按钮。

3.对于oracleoraclequery比对,可以使用GetDiffRange按钮,即二分查找法进行比对。

测试数据如下:

oracle的数据库中执行以下代码,生成测试数据。

declare i integer :=1;beginwhile i<110000 loopinsert into mytest(ID,RID,NAME) VALUES(mysequence.nextval,i,‘dataitem‘||i);i:=i+1;end loop;end ;   insert into mytest2 SELECT * FROM mytest order by id;   update mytest2 set rid=100 where id=100000; commit;select * from mytest minus select * from mytest2;   select count(*) as totalcount, to_char(avg(ora_hash(id||rid ||name))) as avghash from (select id as rn, t.* from mytest t)select count(*) as totalcount, to_char(avg(ora_hash(id||rid ||name))) as avghash from (select id as rn, t.* from mytest2 t)   update mytest2 set name=‘EvanTEst‘ where id=1000;commit;

 Range:可以自己设定,如果是1的话,则直接定位到第一条不同的记录,如果是大于1 则是一个区间值。

表示不同的数据行就是在他们之间。

为了同时支持oraclesqlserver,我使用库中自带的接口IDbConnectionIDataReader进行开发,可以同时支持oraclesqlserver.暂时没有实现读取xls.

sql要求:

二分查找需要样本有序,所以需要写成

select count(*) as totalcount, to_char(avg(ora_hash(id||rid ||name))) as avghash from (select id as rn, t.* from mytest t)

的样式,第一个是总行数,第二个要求是里面需要有一个固定列名叫rn

我使用ora_hash函数对每行的值进行hash,然后求平均值的方式来计算表区间内行的内容是否相同,这是oracle提供的函数。

类似的有函数checksum,但是计算速度要比这个慢许多,尤其是表数据量大的时候。

sqlserver中有hashbyte函数类似。 注意如果不使用to_char函数,则算出的值会溢出,如果放到.net中来承接,会报oci数据溢出的错误,所以to_char也是必须的。

欢迎大家分享BI测试的一些经验心得。

软件下载地址:   files.cnblogs.com/huaxiaoyao/datacompare.rar

BI测试工具之跨数据库数据对比,支持oracle,sqlserver