大家平时工作中如何做数据一致性测试呢?除了人肉 check 还有什么好的方式吗?
还可以自动化
用代码实现
什么叫数据一致性测试呢?能说得具体点吗?
你想问的是不是单纯的对比数据,自动化测试显然比人表现的好。
如果是说分布式架构的数据一致性相关,可以从以下几个方面:
借楼请教:
1,自动化对比测试,是指根据主键读出每条数据(字段和取值)进行对比吗?那如何确定主键,万一主键无序?分库分表?
2,数据量非常大的情况下,比如上千万和亿级别的条数呢? 又该采取何种方式?
3,最近用阿里云的 tablestroe 存储发现,同一列的字段值存在不同类型(比如取值是 5 则 int 类型,5.0 则浮点型),这种又该如何找出不一致的情况?
1、如果是单机系统,考人工即可保证
2、如果是分布式系统,AP 模式保证最终一致即可,需要确认下最终一致同步时间,在同步时间范围内通过自动化脚本进行确认
3、如果是 CP 系统,可以通过故障注入方式模拟,比如 jepsen,或者使用开源工具,入 chaosblade 等
如果是页面数据,统计相关的数据,建议通过自动化的方式来校验一致性。人工校验的效率比较低,往往会出现遗漏。当然自动化也要考虑到数据的覆盖率。
我的目前实现的方案是这样的 定义了数据提取规则和比对项
关联关系是 N : N
用于不同业务类型的数据提取,例如已付款和已退款可以区分成两种数据提取规则
每一个规则包含多个比对项
SQL 执行结果可以为多条
select a.order_no as order_no from table_1 a where a.CreateTM >= '2022-03-14 00:00:00';
例执行结果为
order_no |
---|
A0001 |
A0002 |
针对单项指标的比对
变量双括号标识
SQL 查询结果必须且仅有一条
将 SQL 查询结果序列化后带入比对公式
select a.TotalAmount as a_total_amount,
b.TotalAmount as b_total_amount
from table_1 a,
table_1 b
where a.order_no = b.order_no
and i.order_no = '{{ order_no }}';
SELECT {{ a_total_amount }} = {{ b_total_amount }}
遍历规则数据 将内容替换到比对项 sql 遍历中 进行执行
替换前
select a.TotalAmount as a_total_amount,
b.TotalAmount as b_total_amount
from table_1 a,
table_1 b
where a.order_no = b.order_no
and i.order_no = 'A0001';
执行结果
a_total_amount | b_total_amount |
---|---|
30000.00 | 30000.00 |
再将这个结果替换到比对公式
SELECT 30000.00 = 30000.00
再去执行这个比对公式
执行结果 1 比对成功 0 比对失败
实现方案比较简单 可能不是你所需要的
这个方案需要人工去维护比对项和数据提取规则
数据一致性的保障个人认为可以通过隔离测试环境去保证。