06-测试数据管理(v3_seed × CPT 订单生成 × 数据清理 FK 倒序)
【重建推定版 V1.0】 / DOC-BT-06 / 版本 V1.0(2026-08-21 听写重建)
依据:COLLAB-02 §B3 v3_seed 组成 + WDE-002(17 账号 ON CONFLICT)+ WDE-005(demo.py _cleanup FK 倒序)+ DIP1-Schema §种子管理
一、v3 种子组成(5 大类 + 17 demo 账号)
所有种子通过 python -m backend.seed.v3_seed 一键执行,幂等 = ON CONFLICT DO NOTHING(WDE-002 验收标准)。
| # |
种子类别 |
数据量 |
目标表 |
说明 |
| 1 |
UFCS 统一表单(V3 新) |
21 份表单模板 |
ufcs_form_templates |
21 份覆盖 8 阶段:L1 线索、L2 需求确认、L3 报价、L4 预约、L5 到店、L6 作业、L7 交付、L8 售后(× 客户/师傅/运营 3 方) |
| 2 |
VQR 二维码预设 |
16 份预设 |
vqr_presets |
6 类 NPS 采集码(L6 现场、L7 交付、L8 售后、返修、推荐、口碑)× 2~3 场景 = 16 |
| 3 |
MFR 专项演示数据 |
1 份演示(宜家 PAX) |
mfr_special_projects + mfr_checklists |
含 24 项 checklist(6 前 + 12 中 + 6 后)、MFR 认证师傅=张师傅 wkr_special_01 |
| 4 |
LGD 运费模板 |
1 份默认模板(香港岛内) |
lgd_shipping_templates |
首 3kg=40 HKD、续 1kg=+5 HKD、逆向回收=60 HKD、跨境 B2B2C=+120 HKD |
| 5 |
MDS 四库基础数据 |
7 大楼宇 × 8 大品类 × 3 级师傅 × 5 客户画像 基准 |
scl_service_catalogues / bpl_buildings / wpl_workers / cpl_customers |
SCL top5 品类=衣柜/厨柜/窗帘/灯具/空调;BPL 楼宇类型:住宅/公屋/居屋/工商厦/村屋/独栋/写字楼 |
| 6 |
17 个 Demo 账号 |
17 个账号 + 对应 RBAC 角色 |
users + rbac_role_users |
清单见 04-账号与权限 §一,全部 bcrypt(Dip1@2026) 幂等 |
二、CPT 订单测试数据生成(订单 ID 冲突策略)
2.1 订单 ID 规范
CPT-<YYYYMMDD>-<NNNN>
├── YYYYMMDD:下单日期
└── NNNN:当日序号(0001~9999,UAT 环境 = 0001~0099,避免占用生产号段)
2.2 订单生成脚本(backend/tests/scripts/generate_cpt_orders.py)
| 参数 |
可选值 |
默认值 |
说明 |
| --count |
1~200 |
26(基线用例数) |
生成订单数 |
| --scenario |
std / anomaly / b2b2c_local / b2b2c_crossborder / logistics / mfr / ops_management |
std |
对应 §二 8 阶段中 7 个大场景 |
| --customer |
cus_demo_01 ~ 03 / b2b_corp_01 |
cus_demo_01 |
下单客户 |
| --start-date |
2026-08-19 格式 |
当天 |
订单日期 |
| --cleanup-first |
true / false |
true |
运行前先执行 demo.py _cleanup(FK 倒序删除) |
2.3 订单 ID 冲突策略(WDE-002 延伸)
- 冲突发生条件:同一 ID 重复写入 → 409 Conflict 返回;
- UAT 策略:
--cleanup-first=true 默认每次首删后写,不冲突;
- 幂等性:重复执行脚本结果一致(同一 --seed 输入 → 同一订单集合);
- 数据库保留:保留
collab_test_ 前缀订单用于缺陷复现,不自动清理。
三、数据清理 FK 倒序(WDE-005 _cleanup 验收)
3.1 外键依赖链(删除必须严格倒序)
业务顺序(插入)正序:
users → rbac_role_users → cpl_customers → wpl_workers → bpl_buildings → scl_service_catalogues
→ qsv_quotes → cpt_projects → cpt_stage_logs → cpt_collected_artifacts
→ mfr_special_projects → mfr_checklist_items
→ lgd_shipments → lgd_tracking_events
→ ufcs_form_submissions → vqr_scan_records
→ rbac_audit_logs
清理顺序(删除)**必须严格倒序**(WDE-005):
rbac_audit_logs → vqr_scan_records → ufcs_form_submissions
→ lgd_tracking_events → lgd_shipments
→ mfr_checklist_items → mfr_special_projects
→ cpt_collected_artifacts → cpt_stage_logs → cpt_projects → qsv_quotes
→ scl_service_catalogues → bpl_buildings → wpl_workers → cpl_customers
→ rbac_role_users → users
3.2 _cleanup 验证脚本(每次 UAT 前自动运行)
| 验证点 |
通过标准 |
| 顺序验证 |
python -m backend.seed.demo _cleanup 执行 0 error(无 FK violation) |
| 行数验证 |
执行后 29 V3 表行数 = v3_seed 初始值(UFCS 21/VQR 16/MFR 1/LGD 1/17 账号无业务数据) |
| 重复执行验证 |
连续 3 次执行 _cleanup + v3_seed,第 3 次结果与第 1 次完全一致 |
四、UAT 数据隔离(避免污染生产)
| 维度 |
UAT 隔离策略 |
验证点 |
| 库级 |
数据库名:dip1_uat(生产=dip1_prod) |
SELECT current_database(); = dip1_uat |
| Schema 级 |
所有测试对象 schema=uat_ 前缀(如 uat_.cpt_projects) |
表名前缀正确 |
| 订单号段 |
UAT 订单号 = CPT-YYYYMMDD-0001~0099 |
生产 ≥ 0100 |
| 账号 |
17 账号 UAT 密码与生产不同(生产密码通过 env 注入,不入库) |
demo 登录失败=UAT 正确 |
| PDF/邮件 |
UAT PDF 统一输出 /data/dip1/pdf/uat/;邮件全部进入 Mailpit(不发真实客户) |
Mailpit 8025 可查 |
| 第三方 API |
OQS_ORL_BASE_URL = UAT mock 服务(UAT 调用 sandbox,返回 mock 数据不真实扣款) |
ORL 响应 mock 标志位 |
本文档为【重建推定版】,§一 v3 种子组成来源于 COLLAB-20260820-02 §B3 v3 种子(5 大类);§三 FK 倒序对应 WDE-005(demo.py _cleanup 修复);§四 数据隔离来源于 DIP1-UAT §二 首次初始化。