抽样对比策略和全量对比策略
抽样 VS 全量
抽样策略主要分为全部比对与抽样比对两种方式,两者各有利弊。
全量比对:
- 优点是能够最大程度覆盖到测试环境所有的情况,可以发现抽样测试不能发现的问题。
- 缺点是验证时间与花费精力显著高于抽样比对,对于*乎*移数据的ods层,投入这些测试资源是否有这个必要
抽样比对:
- 优点是最经济型的测试方式,对于*乎*移数据的ods 层,抽样比对性价比无疑是最高的。
- 缺点是可能漏情况。
PS: 个人认为能全量就全量,如果不是客观条件不允许,尽量不要抽样比对。因为在之前测试ODS的过程中,发现了若干遇到特殊数据解析异常的例子,若抽样的话不保证能覆盖到这些场景。
全量对比策略
目前我们采用将原始库比如sqlserver,redshift中的数据导出成csv,或S3上压缩包内的csv文件通过导入hive的方式,验证我们手工导入的表与开发的表有无字段不同来判断开发做的这张表有无异常。
举个例子,我们将原始数据导入到的临时测试库是source_data,导入后的表作为期望结果表,测试的字段是FieldName,当然进行到全量对比的前提一定是已经比较过两表的数据总量与主键。
首先,将数据源导入到临时测试库 source_data 库,由于目前有两种数据格式的数据源,导入临时数据库的方式有如下两种:
1、josn串格式源数据
2、逗号分割格式源数据
3、sql查询出对比失败的数据
验证源表中字段ToUserName值落入ODS_PRE层目标表FieldName是否正确
-- 通过主键关联目标表a和期望表b,过滤要对比字段FieldName不相同的数据,即为有问题的数据。有些值是null的话用!= 判断不出来,但是这部分数据是对的,后面的两个条件会把这部分数据找出来。
select * from ad_ods_pre.tablename a
left join source_data.tablename b on a.keycolumn= b.keycolumn
where (a.FieldName != b.FieldName )
or (a.FieldName is null and b.FieldName is not null)
or (a.FieldName is not null and b.FieldName is null);
执行此类sql,对于4千万的表,执行约需要4分钟。实际时间与环境资源,表大小,表设计都有关系(仅供参考)
抽样对比策略
先从目标表中随机抽取若干记录
第一步目标表
select * from DNM_new_label where etl_date in (select etl_date from DNM_new_label order by etl_date desc limit 1) order by rand() limit 3;
然后到原始库中根据主键找到对应的数据
第二步源表
SELECT [tsr_membertierId],[CreatedOn] ,[ModifiedOn] ,[tsr_memberaccountid],[tsr_name],[tsr_tierid],[tsr_upgradedate],[statuscode],[new_updatetag] FROM [AdidasCRM_MSCRM].[dbo].[new_label]
where [tsr_membertierId] in();
最后比对二者有无不同的字段