外观
测试样例集怎么建(造数边界 / 脱敏 / 回归门禁)
难度与前置
难度:进阶
前置:能在非生产环境跑通一条 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 / 负值 / 超大值(若业务有上限)
□ 分区边界:跨日、空分区、补数窗口内旧分区
□ 敏感字段:完整号段形态、已掩码形态、非法长度脏数据注入(故意写坏,确认任务/质检会拦或按约定落桶):
- 缺主键、类型错位(字符串进金额)
- 重复投同一
event_id两次(验 幂等 覆盖而非翻倍) - 渠道
''/unknown/0混用(验映射到统一未知码) - 一行含明文手机号塞进「应对脱敏视图」的导出路径(应被门禁或抽检打回)
造数落点:只写 dev/test 库或隔离 bucket;数据来源优先合成或已脱敏子集。需要近生产分布时,走隔离区抽样 + 脱敏,禁止个人邮箱/共享盘中转生产明文(对齐 环境隔离、访问与脱敏)。
2. 脱敏样例:与 access-masking 对齐,明文不出非隔离环境
样例集里的敏感列必须能回答:「谁在什么环境能看见什么形态」。
| 样例层 | 内容 | 谁可读 | 存放 |
|---|---|---|---|
| 明文夹具(可选) | 合成明文,仅用于生成掩码/哈希期望 | owner / 本组开发;白名单 | 仅隔离区;禁止导出到个人盘 |
| 脱敏期望表 | 掩码/哈希后的黄金行 | 分析师、外包联调、CI | test 库或版本库(无明文) |
| 聚合夹具 | 无个体标识的汇总 | 看板联调 | 可较宽开放 |
落地约定:
- 期望值写死在脱敏形态:CI/回归断言对比的是掩码串、哈希摘要、未知桶码,不是生产明文
- 哈希用与生产一致的平台 salt;salt 不进可导出样例包
- 掩码规则与 访问与脱敏 字典同版本号;改规则 = 改样例期望 + 走变更
- 样例包 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/发版检查上;数字写入验收记录,而不是群里一句「我本地过了」。
与质量闭环的分工:样例集证明已知边界的可复现行为;全量波动、新鲜度、对账仍走 质量闭环 / 对账,本篇不替代。
常见坑(至少这些)
用生产明文 LIMIT 当 fixture,还拷到共享盘
样例本身变成出仓事故。只有快乐路径,无重复主键 / 未知枚举 / 空串
一上线边界全炸。断言对比明文,CI 日志把 PII 打出来
脱敏规则改了,期望表没改,门禁长期红或被跳过
样例行数上万「更真实」,维护不动最后没人跑
合入只看任务成功,不看样例 diff(绿但错)
把本篇写成工具清单,勾了 Docker/GE 却无边界清单
脏数据注入后不声明期望行为,失败了互相甩锅
如何验收(带数字的前后对比)
| 项 | 改前(示例) | 改后(目标) |
|---|---|---|
| 样例来源 | 生产明文 LIMIT / 共享盘 CSV | 100% 合成或隔离区脱敏子集 |
| 边界覆盖 | 仅正常行 | ≥ 6 类边界勾选有文档 |
| 脱敏抽检 | 未做或偶发 | 全量或 N≥50:0 行明文形态 |
| 幂等双跑 diff | 未跑 | 目标分区 diff = 0 |
| 合入跳过样例门禁次数 / 迭代 | ≥ 1 | 0(例外有书面免责) |
| 因缺样例导致的静默改义 / 出仓工单 | 有 | 观察期内 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
改写说明:清单体例对齐访问脱敏 / 影响评估专篇;造数边界 → 脱敏样例 → 回归门禁三步;工具选型不展开。虚构通用短剧投放例,无未公开公司数据。