多园区改造测试全景:从登录到业务隔离的 7 大模块验证清单
多园区改造不是改几个字段那么简单。登录态、菜单、角色、同步链路、业务数据、回归兼容——任何一个模块漏测,都可能在生产里埋雷。本文把改造测试要覆盖的 7 大模块完整拆开。
多园区改造不是改几个字段那么简单。登录态、菜单、角色、同步链路、业务数据、回归兼容——任何一个模块漏测,都可能在生产里埋雷。本文把改造测试要覆盖的 7 大模块完整拆开。
dev 环境切园区后 /user/info 仍是旧园区,访客预约列表也不刷新。问题不在业务代码,而在 admin-service 和 gateway 写入了不同 Redis DB——这次把排障链路完整记录下来。
钉钉同步两个故事:(1) 15000+ 用户同步时 HTTP 超时——根因是
toUpdateUsers循环内 3 次 DB 查询每人 = 46000 次 SQL round-trip 在一个事务内串行执行,两步优化:异步化(HTTP 立即返回”已受理”,后台静默执行)+ 批量化(循环前 IN 批量预加载到 Map,循环内 O(1) 查 Map),计划阶段就识别出 4 个潜在 bug(路径双重前缀、BaseResultMap 错映射、dirty-check 破坏恢复语义、peek 污染原始 DB 状态)。(2) 头像回填接口返回 200 但成功数始终为 0——admin 服务器在内网,DNS 无法解析钉钉 CDN 域名static-legacy.dingtalk.com,所有用户全部被静默跳过。
今天捅了两个马蜂窝:中台 Dataphin 下线了 PDEPARTS 字段,导致所有依赖该字段解析公司归属的 Java 逻辑静默失效(
getCompanyIdFromPDeparts/getDepartmentAsList返回 null),1542 个 Ding 用户 100% 缺 sys_user_park;用真实格式跑 12 个端到端测试用例,又挖出 4 个新 bug(增量更新取消删除标记失效、园区链路仍依赖 PDEPARTS、pass_user 链路同样依赖 PDEPARTS、部门 vs 公司数据源不一致)。修复方案是改用部门 UUID 沿 parent_id 递归上溯查桥表(CTE),以及补回 synSysUserToPassUser ADD 分支漏设的 distSyncStatus。
6/11 实现的”钉钉同步触发 pass_user 同步”功能本身端到端跑通,但暴露出 6/11 spec 文档第 46 行的一个事实错误判断:把
PassUserServiceImpl.synSysUserToPassUser()里的setParkId(DEFAULT_PARK_ID)误判为”无效死代码”。实际是有效过滤。更糟的是下午挖出了真正的死亡覆盖链:admin 端UserMapperExt.xml的listByConditionExtSQL 没 selecturp.park_id列,导致user.getParkId()永远是 NULL,421 条pass_user.park_id全被污染成 NULL。
今天一口气做了 2 个 feature + 1 个构建命令摸清:钉钉同步补
sys_user_park占位记录、园区绑定一级公司(顶级 org + 互斥)、admin-service 打包 fat jar。feature 走的是 spec-first + subagent-driven,3 轮 spec review + 3 轮 code review。但 06-11 集成测试第一次就跑出 500——saveCompanyBind调updateParkOrganization时,generic mapper 对 Date 字段 OGNL 求值崩了。**1 行 fix:删掉多余的WebExtUtils.iniCreate(model);**。这条经验已经写进全局 CLAUDE.md。