问答 测试如何保障数据一致性?

teessstttt · 2022年03月11日 · 最后由 LingtianShi 回复于 2022年03月25日 · 5034 次阅读

大家平时工作中如何做数据一致性测试呢?除了人肉 check 还有什么好的方式吗?

共收到 10 条回复 时间 点赞

还可以自动化

用代码实现

什么叫数据一致性测试呢?能说得具体点吗?

Jerry li 回复

是高可用里面的一致性么?共识一致性?还是分布式数据一致性?

你想问的是不是单纯的对比数据,自动化测试显然比人表现的好。

如果是说分布式架构的数据一致性相关,可以从以下几个方面:

  1. 早点参与设计评审,从业务出发审核一致性模型,再看看实现是否合理正确
  2. 设计专门的数据测试覆盖数据一致性问题(容错和并发数据场景重点考虑) 正所谓 CAP 不可兼得,得根据软件你特性考虑要重点保障哪个,有时候是要为了可用性牺牲一致性的。

借楼请教:
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 查询结果序列化后带入比对公式

比对 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 比对失败

实现方案比较简单 可能不是你所需要的

这个方案需要人工去维护比对项和数据提取规则

数据一致性的保障个人认为可以通过隔离测试环境去保证。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册