zoukankan      html  css  js  c++  java
  • BI测试工具之跨数据库数据对比,支持oracle,sqlserver

    应用场景:

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

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

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

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

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

    功能:

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

    2.oraclesqlserver,可采用传统的比对,各自获取一个readonly ,forward datareader,逐行比对。点击CompareData按钮。因为数据库不同找不到统一的方法计算值,oracle中的ora_hash和sqlserver中的hashbyte不一致。

    3.对于oracleoracle的或者是sqlserver对sqlserver的query比对,可以使用GetDiffRange按钮,即二分查找法进行比对。因为相同的数据库可以找到一个方法进行数据比对。

    测试数据如下:

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

    --create table mytest(id int, rid int,name varchar2(20));
    --create table mytest2(id int, rid int,name varchar2(20));

    declare i integer :=1; begin while i<110000 loop insert 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 and Xlsx.

    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

    主要源码:

     private void compareData2(int start, int end,int total)
            {
                rtb_log.AppendText(string.Format("comparedata2({0},{1},{2})", start, end, total) + Environment.NewLine);
                string tmpsql = " where rn between {0} and {1} ";
                if (total == 0)
                {
                    dr1 = getDataReader(conn, rtx_sql.Text);
                    dr2 = getDataReader(conn2, rtx_sql2.Text);
                }
                else
                {
                    dr1 = getDataReader(conn, rtx_sql.Text + string.Format(tmpsql, start, end));
                    dr2 = getDataReader(conn2, rtx_sql2.Text + string.Format(tmpsql, start, end));
                }
                //assume the dr schema totalcount,avghash
                bool isdiff = false;
                while (dr1.Read() && dr2.Read())
                {
                    if (total == 0) {end= total = dr1.GetInt32(0); }
                    for (int col = 1; col < dr1.FieldCount; col++)
                    {
                        if (!dr1.GetValue(col).ToString().Equals(dr2.GetValue(col).ToString())
                            ||
                            !(dr1.IsDBNull(col) == dr2.IsDBNull(col))
                            )
                        {
                            isdiff = true;
                        }
                    }
                }
                dr1.Close();
                dr2.Close();
                //if isdiff=true the split the totalcount two part
    
                if (isdiff)
                {
                    if ((end - start < range)) return;
                    compareData2(start, (start + end) / 2, end);
                }
                else //if same
                {
                    if (start == end) end = total;
                    compareData2(end, total, total);
                }
              
            }
    Looking for a job working at Home about MSBI
  • 相关阅读:
    SpringBoot 部署 docker 打包镜像
    Android上dip、dp、px、sp等单位说明(转)
    mac下svn问题——“.a”(静态库)文件无法上传解决
    Mac OS X 访问 Windows 共享文件夹
    svn不能添加.a文件的解决方法
    UIView的剖析(转)
    mac 下真机调试 android 手机
    IOS-synthesize和dynamic的异同(转)
    IOS学习笔记之关键词@dynamic
    【转】APNs消息推送完整讲解
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/4060723.html
Copyright © 2011-2022 走看看