记忆深刻的bug

1、印象最深的bug
走【持牌侧TAO退券】的时候,当时做了一个测试case:券部分放款后,从OT帐套中退券,预期:持牌侧支持券部分放款
由于业务逻辑是:放款时不设定先退券金额还是货款金额,就做了极端场景,
eg:0.2货款+0.8的券+1的券
部分放款(放款1.4=0.2货款+0.8全额券+0.4部分券)后退款,预期:从OT帐套退出1.4(0.8全额券+0.4部分券),从TA帐套出0.2到待关联,1.2到券户头;事实上部分放款取消退款后发现,0.4的部分券退款了,0.8的全额券未退款,是因为退款内部有个get(0)逻辑,以前只有退款会发生退券,不会出现券之后,退回后再次使用然后再退款的场景,所以get(0)一定可以找到唯一一笔对应的券相关支付信息。但是取消关联退券引入后,发生取消关联退券后再次支付再退款时,get(0)默认拿到的是第一次券支付的记录(预期取第二笔),但该券记录已经被取消关联退过了。因此在持牌侧退券会被阻断。

2、提升

《测试职业发展、高级测试需要知道哪些、P6测试需要知道什么、测试的知识点、测试自我提升、测试圣经》
https://blog.csdn.net/qq_36701194/article/details/115294831

3、准入bug(灰度)
故障环节处理(只需要填写表格)
时间点 故障环节 过程说明 关键截图
时间点:2026-03-13
故障环节;故障引入
过程说明:收款管理权限项权限类型从 FUNCTION 改成 DATA(映射关系:有权限——>可管理全部数据,无权限——>仅可管理被分配的数据)。考虑到兼容性问题,命中灰度需要将存量数据从 FUNCTION 转成 DATA,未命中灰度需要将 DATA 转成 FUNCTION。
本次问题出现在convertDataToFunction处理这里,dataScope 为 ALL 时,hasPermission 转回 true,否则hasPermission 转回 false。
未命中缓存且没有绑定自定义角色的主账号用户,查询菜单时会读取 diamond 配置。发布时应用先发布,diamond 配置后发布。从 diamond 读取出配置后构造菜单,权限的 permissionType 定义在枚举中,由于应用此时已发布,收款管理的permissionType 此时是 DATA,并且此时未开灰度,所以会走到 convertDataToFunction的兼容逻辑,但是因此 diamond 未发布,读取的 dataScope 字段此时为 null,StringUtils.equalsIgnoreCase(permission.getDataScope(), DataPermissionScopeEnum.ALL.name())这段代码返回为 false,导致了主账号默认应该是有权限的,这里被设置成无权限。
为什么不先发配置?
之前从 diamond 配置读取出权限项的 code 之后解析成枚举,然后根据枚举获取 permissionType,此次变更还新增了一个买家信息权限项,如果先发 diamond 配置会导致新增的买家信息权限项枚举解析为 null,会 NPE,考虑需要代码兼容配置,因此需要先发应用后再发 diamond 配置。

before
image

after
image

关键截图:
权限项枚举:
image

权限类型从 DATA 转成 FUNCTION 兼容逻辑:
image

菜单 diamond 配置:
image

读diamond 构建菜单:
image

2026-03-25 17:15:09 故障发生 只有在应用发布和 diamond 配置发布间隔期,菜单查询接口未命中缓存且未绑定自定义角色的主账号在进入收款管理页面时会提示无权限,受此缺陷影响。
不太好统计实际故障发生的时间点,因此把应用发布时间当做故障发生时间。

2026-03-26 09:35 故障发现 小二反馈客户在 ACP 进去收款管理看不到数据,提示无权限
image
image

2026-03-26 09:37 业务响应 技术在群里响应
2026-03-26 09:47 初步定位
2026-03-26 11:31 根因定位
故障定位 初步定位
前端排查到菜单查询接口 queryMenu返回的收款管理 hasPermission 为 false

根因分析
09:50 反馈问题账号,免登预发可复现
11:31 根据问题账号,捞出缓存数据,查找缓存写入时间和结合代码,定位到时未绑定角色的主账号,在应用发布和配置发布之间,产生的缓存数据不兼容导致。
image
2026-03-26 09:48 故障止血 应用回滚
diamond 配置回滚
2026-03-26 10:06 故障恢复 1. 应用和配置回滚止血,消除影响
2. 1)收款管理兼容 DATA 和 FUNCTION 相互转换 bug 已修复发布;2)新增配置读取解析为枚举会 NPE 已修复发布,后续可先发配置;3)新增缓存开关,紧急情况可关闭缓存强制查 DB/diamond,快速恢复
3. 权限管理新增权限项需要额外开发兼容,当前做不到配置化实现,优化中
2026-03-26 影响消除 用户刷新菜单可恢复

【一句话原因】
收款管理权限项类型从 FUNCTION 改成 DATA,兼容逻辑未考虑全面,导致应用和配置发布间隔期缓存的数据有问题,这部分主账号收款页面打开无权限。

○ 【变更背景】故障涉及的变更背景及变更内容
■ 应用变更
● 收款管理权限项权限类型从 FUNCTION 改成 DATA,需要根据是否命中灰度进行兼容转换
● 新增买家信息权限项
■ 配置变更
● 权限列表 diamond 配置变更发布
○ 变更配置逻辑(预期与故障实际情况分析)
■ 预期未命中灰度时,收款管理权限项的权限类型 permissionType 从 DATA 设置回 FUNCTION,根据 dataScope 的枚举值设置 hasPermission 字段(dataScope=ALL,hasPermission=true;dataScope=SELF,hasPermission=false),最后清空 dataScope。实际上未考虑到在应用发布和diamond 配置发布间隔期,未命中缓存且未绑定自定义角色的账号从 diamond 配置中读取默认菜单时,dataScope 此时为空,后续根据 dataScope 设置 hasPermission 字段会直接设置为 false,导致主账号默认应该有权限变成主账号无权限。并且会将 diamond 读取出来的配置进行缓存,导致后续继续查询命中缓存,在兼容转换这个步骤继续设置 hasPermission=false,一直需要等待缓存失效(缓存失效时长:7 天)才能恢复。
■ 只有在应用发布和配置发布间隔期未命中缓存去读 diamond 配置构建新缓存才会导致这个问题,因此在自测和功能测试中都未发现此问题。
image

posted @ 2026-06-16 14:29  君庭  阅读(9)  评论(0)    收藏  举报