利用kettle的JS进行ETL数据校验(升级版)

       无意中在网上看到一篇文章《利用kettle中的JS来完成ETL数据校验》,挺受启发的,觉得用JS来实现ETL的自动化校验,是个不错的思路。但是这篇文章里给的JS脚本样例确实有待改进,一是让初学者看着不那么清晰,二是扩展性和维护性都较差。于是我做了二次改造,重新编写了脚本,如下:

//Script here
var strConn = "TestOrcl";
var check_status=0;//如果检测到有任何一种校验错误,则check_status=1
var check_table="E_OT_PRMTALT";//校验有关的表名字
var check_table_id="LICALTID";//校验表主键
var check_name=LICALTID;//校验表主键值
var check_detail="";//校验到的错误详细情况
var check_type="";//校验到的错误类型
var check_date=new Date();//校验时间
var source_table="E_OT_PRMTALT";//数据源表名称,如果数据来自多个数据表,则需要声明多个
var source_table_id="LICALTID";//数据源表主键,如果多个表联合主键,则需要声明多个主键

/字段唯一性校验//
var isuniqueArray=new Array("LICALTID","LICID");//一维数组,表的字段名
var isunique_str="";
var isunique_column="";
for(var i=0;i0){"+ isnormalArray[i][0] +"_isnormal=1;}";
	//校验所有表需要校验的字段,如果有一个校验失败,则校验状态为1
	isnormal_str+="if(check_status==0){if("+isnormalArray[i][0]+"_isnormal==0) check_status=1;}";
	//check is normal? return not normal column
	isnormal_str+="if("+isnormalArray[i][0]+"_isnormal==0){if(isnormal_column==\"\"){ isnormal_column = \""+ isnormalArray[i][0] +"\";}else{isnormal_column+=\"、\"+\""+isnormalArray[i][0]+"\";}}";
}
//最终输出的错误详细情况
isnormal_str+="if(check_status==1){if(check_detail==\"\"){check_type=\"违反标准化规则\";check_detail=\"字段\"+ isnormal_column +\"违反了标准化规则\";}else{check_type+=\",\"+\"违反标准化规则\";check_detail+=\",字段\"+ isnormal_column +\"违反了标准化规则\";}}";
eval(isnormal_str);
//数据类型校验//
var datatypeArray = [["ALTDATE","isDate"],["ALTAF","isNum"]];//二维数组,第一列为要校验的数据字段,第二列为数据类型校验函数(isDate[日期]、isNum[数字]、isMailValid[邮箱]、isEmpty[空])
var datatype_str="";
var datatype_column="";
check_status=0;//校验状态置0
for(var i=0;i

以下是执行后的效果:

利用kettle的JS进行ETL数据校验(升级版)_第1张图片

在此基础上我们还可以扩展更多的校验,比如通过正则表达式的方式(利用kettle的isRegExp函数),如下:

//正则表达式校验//
var dataArray = [["Email","^\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}$","^[\\w-\.]+@([\\w-]+\\.)+[\\w-]{2,4}$"]];//二维数组,第一列为要校验的数据字段,第二列为规则1,第三列为规则2(可选)
var data_str="";
var data_column="";
check_status=0;//校验状态置0
for(var i=0;i-1) "+dataArray[i][0]+"_data=1;";
	//校验所有需要校验的字段,如果有一个校验失败,则校验状态为1
	data_str+="if(check_status==0){if("+dataArray[i][0]+"_data==0) check_status=1;}";
	//check is data? return not data column
	data_str+="if("+dataArray[i][0]+"_data==0){if(data_column==\"\"){data_column=\""+ dataArray[i][0] + "\"; } else {data_column+=\"、"+dataArray[i][0]+"\";}}";
}
//最终输出的错误详细情况
data_str+="if(check_status==1){if(check_detail==\"\"){check_type=\"违反数据类型规则\";check_detail=\"字段\"+ data_column +\"违反数据类型规则\";}else{check_type+=\",\"+\"违反数据类型规则\";check_detail+=\",字段\"+ data_column + \"违反数据类型规则\";}}";eval(data_str);
以上脚本的好处就是,可以直接通过修改变量,就能对不同输出表的不同字段进行校验,基本上不用修改逻辑代码,如果进一步优化一下,就可以写成函数,直接调用。可以把检验字段和检验规则进一步参数化,通过调用参数表,来执行数据驱动的校验测试(这就是一种自动化测试的思路)。

你可能感兴趣的:(软件测试,#,大数据量测试,#,自动化测试)