Skip to content

测试样例集怎么建(造数边界 / 脱敏 / 回归门禁) ​

难度与前置

难度:进阶
前置:能在非生产环境跑通一条 ODS→DWD→ADS 链路;知道明文 PII 不能出隔离区。
读完能做什么:为一张敏感明细表建「最小可复现样例集」:造数边界清晰、脱敏样例可对字典抽检、合入/发版前有回归门禁数字记录。

适用场景 ​

  • 新表 / 新脱敏视图 / 新口径上线前,需要可重复的本地或测试环境验收
  • 改掩码规则、哈希 salt、过滤条件后,要证明「行为没悄悄变坏」
  • 外包或跨组联调只能接触脱敏数据,仍要覆盖边界与脏数据
  • 事故复盘后要把「当时漏测的那一行」固化进样例集

不适用:

  • Docker / dbt / Great Expectations 等工具选型课(本文只定样例与门禁清单)
  • 生产全量对账与发布切流本身(见 ADS 出数验收、质量闭环)
  • 环境账号 / 网络 / 发布隔离总原则(见 环境隔离)
  • 访问矩阵与导出门禁细则(见 访问与脱敏)

真实场景(一条) ​

短剧投放组要给外包开 ads_campaign_user_reach(投放触达明细)只读,并在测试库验收「掩码手机号 + 渠道未知桶」逻辑。开发从生产 SELECT * LIMIT 1000 拷到共享盘:

  • 含完整手机号与设备号;样例只有「正常行」,无空渠道、无重复主键、无异常金额
  • 脱敏 SQL 改了一版后无人回归,看板渠道 UV 漂了 2% 才发现 __UNKNOWN__ 映射丢了
  • 合入只看「任务绿」,没有样例断言

按本清单重来:在 test 隔离区造最小字段集(含边界值与脏数据)→ 脱敏样例与 访问与脱敏 字典对齐,明文不出非隔离环境 → 合入前跑通行数 / 主键 / 掩码抽检 / 未知桶断言。同迭代无「拷生产明文」与「静默改义」工单。

怎么做(步骤清单) ​

1. 造数边界:最小字段 + 边界值 + 脏数据注入 ​

先写清「样例要证明什么」,再造数——禁止「随便 dump 一千行当 fixture」。

text
样例集意图单(最小)
对象:库.表 / 视图 / 任务 ________
要证明的行为(≤5 条):
  1. ________
  2. ________
环境:□dev □test/staging(禁止默认用 prod 明文)
行数上限:____(建议先 ≤ 200,能覆盖边界即可)
负责人 / 有效期:________

最小字段集(只留断言需要的列;多一列就多一份脱敏与维护成本):

类别示例字段为何要
主键 / 粒度event_id、user_id、dt验幂等与粒度
敏感mobile、device_id验掩码/哈希
口径相关channel、spend、is_gift验未知桶、过滤、汇总
分区 / 时间dt、event_ts验分区裁剪与迟到窗

边界值清单(每张样例表至少勾几项,写进 README):

text
□ 正常行(对照基线)
□ 主键重复 / 同分区重跑应覆盖的行(对接幂等)
□ NULL / 空串 / 哨兵默认值(对接 NULL 语义专篇)
□ 枚举外值、未知渠道、大小写变体
□ 金额 0 / 负值 / 超大值(若业务有上限)
□ 分区边界:跨日、空分区、补数窗口内旧分区
□ 敏感字段:完整号段形态、已掩码形态、非法长度

脏数据注入(故意写坏,确认任务/质检会拦或按约定落桶):

  1. 缺主键、类型错位(字符串进金额)
  2. 重复投同一 event_id 两次(验 幂等 覆盖而非翻倍)
  3. 渠道 '' / unknown / 0 混用(验映射到统一未知码)
  4. 一行含明文手机号塞进「应对脱敏视图」的导出路径(应被门禁或抽检打回)

造数落点:只写 dev/test 库或隔离 bucket;数据来源优先合成或已脱敏子集。需要近生产分布时,走隔离区抽样 + 脱敏,禁止个人邮箱/共享盘中转生产明文(对齐 环境隔离、访问与脱敏)。

2. 脱敏样例:与 access-masking 对齐,明文不出非隔离环境 ​

样例集里的敏感列必须能回答:「谁在什么环境能看见什么形态」。

样例层内容谁可读存放
明文夹具(可选)合成明文,仅用于生成掩码/哈希期望owner / 本组开发;白名单仅隔离区;禁止导出到个人盘
脱敏期望表掩码/哈希后的黄金行分析师、外包联调、CItest 库或版本库(无明文)
聚合夹具无个体标识的汇总看板联调可较宽开放

落地约定:

  1. 期望值写死在脱敏形态:CI/回归断言对比的是掩码串、哈希摘要、未知桶码,不是生产明文
  2. 哈希用与生产一致的平台 salt;salt 不进可导出样例包
  3. 掩码规则与 访问与脱敏 字典同版本号;改规则 = 改样例期望 + 走变更
  4. 样例包 README 写明:含不含 PII、适用环境、销毁方式;过期夹具按隔离规范清掉

抽检口令(合入前人工或脚本均可):

text
随机 N 行(建议 N≥50,小夹具则全量):
- 脱敏视图:0 行完整手机号/证件形态
- 哈希列:长度/字符集符合约定;与明文夹具(仅隔离区)可复算一致
- 导出试跑:走审批单字段;行数 ≤ 样例上限;文件名含水印

3. 回归门禁:跑通检查再合入 / 发版 ​

门禁分两档——合入门禁(改 SQL/规则必过)与 发版门禁(切 ADS/current 或开权限前再跑)。

text
合入门禁(最小断言,失败即拒)
□ 样例分区行数 = 期望(或落在约定容差)
□ 主键 / 粒度:样例内唯一键无意外重复(见 [粒度校验](/warehouse/grain-check))
□ 幂等:同一夹具跑两遍,目标分区 diff = 0
□ 脱敏:掩码/哈希/未知桶与期望表一致(0 行漂移)
□ 脏数据:约定应丢弃/入错数桶/阻断的行,行为符合文档
□ 明文扫描:非隔离产物路径 grep 不到完整号段形态(抽检)
text
发版 / 开放权限前(加码)
□ 目标角色账号抽检:打不开明文表,打得开脱敏视图
□ 与上游夹具或固定 ADS 影子指标 diff 可解释(对接 ads-publish)
□ 影响面已评估(改规则/加敏感列时对接 lineage-impact)
□ 观察窗口与回滚点写明

建议把断言做成「一条命令或一个调度空跑任务」挂在 MR/发版检查上;数字写入验收记录,而不是群里一句「我本地过了」。

与质量闭环的分工:样例集证明已知边界的可复现行为;全量波动、新鲜度、对账仍走 质量闭环 / 对账,本篇不替代。

常见坑(至少这些) ​

  1. 用生产明文 LIMIT 当 fixture,还拷到共享盘
    样例本身变成出仓事故。

  2. 只有快乐路径,无重复主键 / 未知枚举 / 空串
    一上线边界全炸。

  3. 断言对比明文,CI 日志把 PII 打出来

  4. 脱敏规则改了,期望表没改,门禁长期红或被跳过

  5. 样例行数上万「更真实」,维护不动最后没人跑

  6. 合入只看任务成功,不看样例 diff(绿但错)

  7. 把本篇写成工具清单,勾了 Docker/GE 却无边界清单

  8. 脏数据注入后不声明期望行为,失败了互相甩锅

如何验收(带数字的前后对比) ​

项改前(示例)改后(目标)
样例来源生产明文 LIMIT / 共享盘 CSV100% 合成或隔离区脱敏子集
边界覆盖仅正常行≥ 6 类边界勾选有文档
脱敏抽检未做或偶发全量或 N≥50:0 行明文形态
幂等双跑 diff未跑目标分区 diff = 0
合入跳过样例门禁次数 / 迭代≥ 10(例外有书面免责)
因缺样例导致的静默改义 / 出仓工单有观察期内 0
text
测试样例集验收记录(可复制)
对象:库.表 / 视图 / 任务
环境:dev / test(禁止 prod 明文夹具默认路径)
意图条数:____;样例行数:____
边界勾选:正常/重复键/空值/枚举外/金额极端/分区边界/敏感形态
脱敏:字典版本 ____;抽检 N=____;明文命中行数 ____(期望 0)
回归:双跑 diff ____;脏数据行为 ____;合入门禁:通过/失败
发版加码:角色抽检 ____;ADS/影子 diff 解释:有/无/不适用
签字(数据 owner):________  日期:________

Checklist:

  • [ ] 意图单 ≤5 条可测行为,字段集最小
  • [ ] 边界与脏数据有清单与期望行为
  • [ ] 脱敏期望与 access-masking 字典同版本;明文仅隔离区
  • [ ] 合入门禁含行数 / 主键或粒度 / 幂等双跑 / 脱敏断言
  • [ ] 验收记录含数字前后对比
  • [ ] 链到环境隔离 / 访问脱敏 / 幂等 / ADS / 质量闭环 / 影响评估,不重写专篇
  • [ ] 无未公开公司项目名与真实内部表名风格泄露
  • [ ] 未写成工具选型清单

相关专篇(互链,不重写) ​

你要做的事看哪篇
谁能看、掩码/哈希、导出门禁访问与脱敏
样例与明文落在哪套环境环境隔离
双跑不翻倍、回刷覆盖离线幂等、幂等回刷
对外出口怎么验收再切ADS 出数验收
改规则/加敏感列前的影响面改表前影响评估
全量质量与对账质量闭环
NULL / 空串 / 未知桶语义NULL/默认值语义
本篇只建最小可复现样例与回归门禁,不替代上述专篇

相关面试题 ​

题库小程序链接待定;先用站内锚点占位。

  • [ ] 题:样例为何禁止默认从生产明文 LIMIT?怎样验收来源合规?(考察点:100% 合成或隔离区脱敏子集)→ 占位:#todo-interview-test-fixture-source
  • [ ] 题:边界覆盖最少要勾哪些类?仅正常行为什么不够?(考察点:≥6 类边界勾选有文档)→ 占位:#todo-interview-test-fixture-boundary
  • [ ] 题:脱敏抽检怎样才算过?(考察点:N≥50 或全量;0 行明文形态;字典与 access-masking 同版本)→ 占位:#todo-interview-test-fixture-masking
  • [ ] 题:合入前回归门禁最少断言什么?(考察点:幂等双跑 diff=0;跳过门禁次数=0)→ 占位:#todo-interview-test-fixture-gate

改写说明:清单体例对齐访问脱敏 / 影响评估专篇;造数边界 → 脱敏样例 → 回归门禁三步;工具选型不展开。虚构通用短剧投放例,无未公开公司数据。