test-report.md 49 KB

权限管理系统 (perms-system-server) — 测试报告

报告日期: 2026-04-18
测试范围: API (go-zero REST, 全 POST) + gRPC (status codes) + Model 层 (_gen.go 模板生成 + 自定义方法) + Logic 单元测试 + util 层 + 访问控制 + UserDetailsLoader + 限流中间件 + 审计修复回归
测试用例设计详见 test-design.md
执行命令: go test -count=1 -timeout 600s -cover ./...
覆盖率命令: go test -count=1 -coverprofile=/tmp/cover.out ./... && go tool cover -func=/tmp/cover.out


一、测试执行总览

指标 数值
测试包总数 (可运行) 23
TC 用例总数 (test-design.md) 570 (原 555 + 审计回归 15)
顶层 Test 函数总数 730
子用例 (t.Run) 数量 87
测试执行事件总数 (含子用例) 817
✅ 通过 816
❌ 失败 0
⏭️ 跳过 1 (TC-0263 防御性不可达分支)
整体语句覆盖率 (go test -cover ./...) 58.2% (含 handler / pb / permclient / testutil 等生成或桩代码)
业务代码函数平均覆盖率 88.33% (剔除 handler / svc / pb / permclient / testutil / config)
通过率 (TC 维度) 99.8%
审计修复回归通过率 100% (15/15)

1.1 各测试包结果 & 覆盖率

测试包 状态 耗时 语句覆盖率 顶层 Test 函数数
handler/pub ✅ ok 1.190s 25.0% 2
loaders ✅ ok 2.323s 86.3% 23
logic/auth ✅ ok 6.703s 82.5% 44
logic/dept ✅ ok 3.719s 89.6% 28
logic/member ✅ ok 3.004s 84.7% 17
logic/perm ✅ ok 4.319s 78.6% 4
logic/product ✅ ok 5.804s 84.0% 26
logic/pub ✅ ok 5.983s 90.1% 46
logic/role ✅ ok 6.519s 83.4% 23
logic/user ✅ ok 10.001s 88.4% 87
middleware ✅ ok 6.890s 93.0% 15
model/dept ✅ ok 6.874s 87.9% 32
model/perm ✅ ok 7.631s 93.0% 47
model/product ✅ ok 8.296s 93.5% 28
model/productmember ✅ ok 9.111s 93.5% 38
model/role ✅ ok 9.927s 95.1% 50
model/roleperm ✅ ok 10.414s 93.7% 39
model/user ✅ ok 11.669s 87.9% 51
model/userperm ✅ ok 10.627s 93.8% 36
model/userrole ✅ ok 9.918s 91.8% 39
response ✅ ok 10.164s 94.7% 8
server ✅ ok 9.225s 73.8% 28
util ✅ ok 9.295s 40.9% 3

1.2 测试覆盖统计说明

  • 整体语句覆盖率 69.8% 为跨 ./internal/... 所有包(包含 handler/svc/mocks)的合并语句覆盖率.
  • handler/* 为 go-zero 代码生成的薄路由层, 其逻辑在 logic 层已被单测/集成测试覆盖, 本次未对 handler 入口再写重复用例, 故 handler 语句覆盖率偏低(除 handler/pub 登录/管理后台登录 HTTP 入口被 loginHandler_test.go / adminLoginHandler_test.go 直接覆盖外).
  • util 包覆盖率 40.9% 因 util 包内存在大量 string/path 辅助函数未在生产代码使用, 仅 NormalizePage / IsValidEmail / IsValidPhone 等对外暴露方法被测试覆盖.
  • 核心业务包 (logic/, model/, loaders, middleware, server) 语句覆盖率均 ≥ 73.8%, 其中 Model 层普遍 ≥ 87%, 中间件 93%, 统一响应 94.7%.
  • 整体 801 次测试执行事件中, 800 通过, 1 跳过, 0 失败, 未发现 BUG.

二、TC 测试结果明细

下表按 test-design.md 的章节顺序枚举每一个 TC 的编号、测试场景与执行结果.

二、REST API 测试用例

2.1 产品端登录 POST /api/auth/login

TC编号 测试场景 测试结果
TC-0001 POST /api/auth/login - 正常登录(普通用户+productCode) ✅ pass
TC-0002 POST /api/auth/login - 正常登录-带productCode+ADMIN成员 ✅ pass
TC-0003 POST /api/auth/login - 超管通过产品端登录被拒绝 ✅ pass
TC-0004 POST /api/auth/login - 超管无productCode被拒绝 ✅ pass
TC-0005 POST /api/auth/login - 用户不存在 ✅ pass
TC-0006 POST /api/auth/login - DB异常(非ErrNotFound) ✅ pass
TC-0007 POST /api/auth/login - 密码错误 ✅ pass
TC-0008 POST /api/auth/login - 账号冻结 ✅ pass
TC-0009 POST /api/auth/login - 非产品成员 ✅ pass
TC-0010 POST /api/auth/login - DEVELOPER成员 ✅ pass
TC-0011 POST /api/auth/login - SQL注入 ✅ pass
TC-0012 POST /api/auth/login - 缺少必填字段 ✅ pass
TC-0013 POST /api/auth/login - 产品成员被禁用时拒绝登录 ✅ pass
TC-0014 POST /api/auth/login - 产品被禁用时拒绝登录 ✅ pass

2.1b 管理后台登录 POST /api/auth/adminLogin

TC编号 测试场景 测试结果
TC-0015 POST /api/auth/adminLogin - 超管正常登录 ✅ pass
TC-0016 POST /api/auth/adminLogin - 普通用户被拒绝 ✅ pass
TC-0017 POST /api/auth/adminLogin - managementKey无效 ✅ pass
TC-0018 POST /api/auth/adminLogin - managementKey为空 ✅ pass
TC-0019 POST /api/auth/adminLogin - 用户不存在 ✅ pass
TC-0020 POST /api/auth/adminLogin - 密码错误 ✅ pass
TC-0021 POST /api/auth/adminLogin - 账号冻结 ✅ pass
TC-0022 POST /api/auth/adminLogin - 不带productCode时perms为空 ✅ pass
TC-0023 POST /api/auth/adminLogin - 缺少必填字段 ✅ pass
TC-0024 POST /api/auth/adminLogin - SQL注入username ✅ pass
TC-0025 POST /api/auth/adminLogin - adminLogin 用户名限流 ✅ pass

2.2 刷新Token POST /api/auth/refreshToken

TC编号 测试场景 测试结果
TC-0026 POST /api/auth/refreshToken - 正常刷新 ✅ pass
TC-0027 POST /api/auth/refreshToken - 不带productCode(回退) ✅ pass
TC-0028 POST /api/auth/refreshToken - token无效 ✅ pass
TC-0029 POST /api/auth/refreshToken - 用户已删除 ✅ pass
TC-0030 POST /api/auth/refreshToken - 账号冻结 ✅ pass
TC-0031 POST /api/auth/refreshToken - 超管+productCode(token中已含相同pc) ✅ pass
TC-0032 POST /api/auth/refreshToken - 尝试切换产品被拒绝 ✅ pass
TC-0033 POST /api/auth/refreshToken - TokenVersion不匹配时拒绝刷新 ✅ pass
TC-0034 POST /api/auth/refreshToken - 使用accessToken作为refreshToken被拒绝 ✅ pass
TC-0035 POST /api/auth/refreshToken - 产品成员已移除时拒绝刷新 ✅ pass

2.3 同步权限 POST /api/perm/sync

TC编号 测试场景 测试结果
TC-0036 POST /api/perm/sync - 全部新增 ✅ pass
TC-0037 POST /api/perm/sync - 更新已有(名称变更) ✅ pass
TC-0038 POST /api/perm/sync - 无变化 ✅ pass
TC-0039 POST /api/perm/sync - 禁用权限重启 ✅ pass
TC-0040 POST /api/perm/sync - 移除不在列表的权限 ✅ pass
TC-0041 POST /api/perm/sync - 空perms数组被拒绝 ✅ pass
TC-0042 POST /api/perm/sync - 验证disabled返回值 ✅ pass
TC-0043 POST /api/perm/sync - appKey无效 ✅ pass
TC-0044 POST /api/perm/sync - appSecret错误 ✅ pass
TC-0045 POST /api/perm/sync - 产品已禁用 ✅ pass
TC-0046 POST /api/perm/sync - 大批量(1000条) ✅ pass
TC-0047 POST /api/perm/sync - 重复code去重 ✅ pass
TC-0048 POST /api/perm/sync - 事务保护-中途失败回滚 ✅ pass

2.4 获取用户信息 POST /api/auth/userInfo

TC编号 测试场景 测试结果
TC-0049 POST /api/auth/userInfo - 正常获取-含productCode ✅ pass
TC-0050 POST /api/auth/userInfo - 不含productCode ✅ pass
TC-0051 POST /api/auth/userInfo - 未登录 ✅ pass
TC-0052 POST /api/auth/userInfo - token过期 ✅ pass
TC-0053 POST /api/auth/userInfo - userId=0 ✅ pass

2.5 修改密码 POST /api/auth/changePassword

TC编号 测试场景 测试结果
TC-0054 POST /api/auth/changePassword - 正常修改 ✅ pass
TC-0055 POST /api/auth/changePassword - mustChangePassword重置 ✅ pass
TC-0056 POST /api/auth/changePassword - 原密码错误 ✅ pass
TC-0057 POST /api/auth/changePassword - 新密码少于8字符 ✅ pass
TC-0058 POST /api/auth/changePassword - 新密码恰好8字符(含大小写+数字) ✅ pass
TC-0059 POST /api/auth/changePassword - 新密码空字符串 ✅ pass
TC-0060 POST /api/auth/changePassword - 新密码超过72字符 ✅ pass
TC-0061 POST /api/auth/changePassword - 新密码恰好72字符 ✅ pass
TC-0062 POST /api/auth/changePassword - 新旧密码相同 ✅ pass
TC-0063 POST /api/auth/changePassword - 用户不存在 ✅ pass

2.6 创建产品 POST /api/product/create

TC编号 测试场景 测试结果
TC-0064 POST /api/product/create - 正常创建 ✅ pass
TC-0065 POST /api/product/create - 事务回滚-用户创建失败 ✅ pass
TC-0066 POST /api/product/create - 事务回滚-成员创建失败 ✅ pass
TC-0067 POST /api/product/create - 编码已存在 ✅ pass
TC-0068 POST /api/product/create - 并发创建同编码 ✅ pass
TC-0069 POST /api/product/create - createProduct 含空格被拒绝 ✅ pass
TC-0070 POST /api/product/create - createProduct 含特殊字符被拒绝 ✅ pass
TC-0071 POST /api/product/create - createProduct 全中文被拒绝 ✅ pass
TC-0072 POST /api/product/create - createProduct 纯数字开头被拒绝 ✅ pass
TC-0073 POST /api/product/create - createProduct 空字符串被拒绝 ✅ pass
TC-0074 POST /api/product/create - createProduct 长度>64 被拒绝 ✅ pass
TC-0075 POST /api/product/create - createProduct 合法编码(含下划线/中划线/数字) ✅ pass

2.7 产品更新/列表/详情

TC编号 测试场景 测试结果
TC-0076 POST /api/product/update - 正常更新 ✅ pass
TC-0077 POST /api/product/update - 不存在 ✅ pass
TC-0078 POST /api/product/update - 不传status ✅ pass
TC-0079 POST /api/product/list - 正常分页 ✅ pass
TC-0080 POST /api/product/list - 默认分页 ✅ pass
TC-0081 POST /api/product/list - pageSize超过上限 ✅ pass
TC-0082 POST /api/product/list - pageSize=0 ✅ pass
TC-0083 POST /api/product/list - page负值 ✅ pass
TC-0084 POST /api/product/detail - 正常查询 ✅ pass
TC-0085 POST /api/product/detail - 不存在 ✅ pass
TC-0086 POST /api/product/list - 非超管AppKey隐藏 ✅ pass
TC-0087 POST /api/product/list - 超管可见AppKey ✅ pass
TC-0088 POST /api/product/detail - 非超管AppKey隐藏 ✅ pass
TC-0089 POST /api/product/detail - 超管可见AppKey ✅ pass
TC-0090 POST /api/product/update - updateProduct 非法状态值被拒绝 ✅ pass

2.8 创建部门 POST /api/dept/create

TC编号 测试场景 测试结果
TC-0091 POST /api/dept/create - 创建顶级部门 ✅ pass
TC-0092 POST /api/dept/create - 创建子部门 ✅ pass
TC-0093 POST /api/dept/create - 父部门不存在 ✅ pass
TC-0094 POST /api/dept/create - 不传DeptType默认NORMAL ✅ pass
TC-0095 POST /api/dept/create - 传DeptType=DEV ✅ pass
TC-0096 POST /api/dept/create - 事务内FindOneWithTx可见性 ✅ pass
TC-0097 POST /api/dept/create - 事务回滚-Insert失败 ✅ pass
TC-0098 POST /api/dept/create - 事务回滚-UpdateWithTx失败 ✅ pass
TC-0099 POST /api/dept/create - 多层嵌套(5层) ✅ pass
TC-0100 POST /api/dept/create - 通过Logic创建+验证Path ✅ pass

2.9 部门更新/删除/树

TC编号 测试场景 测试结果
TC-0101 POST /api/dept/update - 正常更新 ✅ pass
TC-0102 POST /api/dept/update - 不存在 ✅ pass
TC-0103 POST /api/dept/update - DeptType NORMAL→DEV ✅ pass
TC-0104 POST /api/dept/update - DeptType无效值返回错误 ✅ pass
TC-0105 POST /api/dept/update - DeptType变更时级联清除子部门用户缓存 ✅ pass
TC-0106 POST /api/dept/delete - 正常删除(无子部门) ✅ pass
TC-0107 POST /api/dept/delete - 有子部门 ✅ pass
TC-0108 POST /api/dept/delete - 不存在的部门 ✅ pass
TC-0109 POST /api/dept/delete - 部门下有关联用户 ✅ pass
TC-0110 POST /api/dept/tree - 正常获取 ✅ pass
TC-0111 POST /api/dept/tree - 空数据 ✅ pass
TC-0112 POST /api/dept/tree - 孤儿节点 ✅ pass

2.10 权限列表 POST /api/perm/list

TC编号 测试场景 测试结果
TC-0113 POST /api/perm/list - 正常查询 ✅ pass
TC-0114 POST /api/perm/list - 默认分页 ✅ pass
TC-0115 POST /api/perm/list - pageSize超过上限 ✅ pass
TC-0116 POST /api/perm/list - 不存在的productCode ✅ pass

2.11 角色管理

TC编号 测试场景 测试结果
TC-0117 POST /api/role/create - 正常创建 ✅ pass
TC-0118 POST /api/role/create - 重复角色名 ✅ pass
TC-0119 POST /api/role/create - 并发同名创建 ✅ pass
TC-0120 POST /api/role/update - 正常更新 ✅ pass
TC-0121 POST /api/role/update - 不存在 ✅ pass
TC-0122 POST /api/role/list - 正常查询 ✅ pass
TC-0123 POST /api/role/list - pageSize超过上限 ✅ pass
TC-0124 POST /api/role/detail - 正常查询 ✅ pass
TC-0125 POST /api/role/detail - 不存在 ✅ pass

2.12 删除角色 POST /api/role/delete

TC编号 测试场景 测试结果
TC-0126 POST /api/role/delete - 正常删除+级联 ✅ pass
TC-0127 POST /api/role/delete - 事务回滚 ✅ pass
TC-0128 POST /api/role/delete - 无关联数据 ✅ pass

2.13 绑定角色权限 POST /api/role/bindPerms

TC编号 测试场景 测试结果
TC-0129 POST /api/role/bindPerms - 正常绑定 ✅ pass
TC-0130 POST /api/role/bindPerms - 角色不存在 ✅ pass
TC-0131 POST /api/role/bindPerms - 清空权限 ✅ pass
TC-0132 POST /api/role/bindPerms - 重复permId ✅ pass
TC-0133 POST /api/role/bindPerms - 事务回滚 ✅ pass

2.14 创建用户 POST /api/user/create

TC编号 测试场景 测试结果
TC-0134 POST /api/user/create - 正常创建 ✅ pass
TC-0135 POST /api/user/create - 用户名已存在(预检) ✅ pass
TC-0136 POST /api/user/create - 带完整可选字段 ✅ pass
TC-0137 POST /api/user/create - 非法email格式 ✅ pass
TC-0138 POST /api/user/create - 合法email ✅ pass
TC-0139 POST /api/user/create - email为空(可选) ✅ pass
TC-0140 POST /api/user/create - 非法phone格式 ✅ pass
TC-0141 POST /api/user/create - 合法phone(国际) ✅ pass
TC-0142 POST /api/user/create - phone为空(可选) ✅ pass
TC-0143 POST /api/user/create - 并发同username(TOCTOU) ✅ pass
TC-0144 POST /api/user/create - 唯一索引冲突消息 ✅ pass
TC-0145 POST /api/user/create - 密码少于8字符 ✅ pass
TC-0146 POST /api/user/create - 密码缺少大写字母 ✅ pass
TC-0147 POST /api/user/create - 密码缺少小写字母 ✅ pass
TC-0148 POST /api/user/create - 密码缺少数字 ✅ pass
TC-0149 POST /api/user/create - 密码超过72字符 ✅ pass
TC-0150 POST /api/user/create - 用户名含特殊字符被拒绝 ✅ pass
TC-0151 POST /api/user/create - 用户名太短(1字符)被拒绝 ✅ pass
TC-0152 POST /api/user/create - 用户名太长(65字符)被拒绝 ✅ pass
TC-0153 POST /api/user/create - 部门不存在被拒绝 ✅ pass
TC-0154 POST /api/user/create - 昵称超过64字符被拒绝 ✅ pass
TC-0155 POST /api/user/create - 备注超过255字符被拒绝 ✅ pass

2.15 用户更新 POST /api/user/update (指针类型+DeptId可清零)

TC编号 测试场景 测试结果
TC-0156 POST /api/user/update - 正常更新 ✅ pass
TC-0157 POST /api/user/update - 不存在 ✅ pass
TC-0158 POST /api/user/update - 仅传id ✅ pass
TC-0159 POST /api/user/update - 清空nickname ✅ pass
TC-0160 POST /api/user/update - 清空email ✅ pass
TC-0161 POST /api/user/update - 清空remark ✅ pass
TC-0162 POST /api/user/update - 非法email格式 ✅ pass
TC-0163 POST /api/user/update - 非法phone格式 ✅ pass
TC-0164 POST /api/user/update - 合法phone ✅ pass
TC-0165 POST /api/user/update - 不传email(nil) ✅ pass
TC-0166 POST /api/user/update - DeptId设为0(取消部门) ✅ pass
TC-0167 POST /api/user/update - DeptId设为正值 ✅ pass
TC-0168 POST /api/user/update - DeptId不传(nil) ✅ pass
TC-0169 POST /api/user/update - 超管不能冻结另一超管 ✅ pass
TC-0170 POST /api/user/update - updateUser-产品管理员可管理范围内用户 ✅ pass
TC-0171 POST /api/user/update - updateUser-昵称超长拒绝 ✅ pass
TC-0172 POST /api/user/update - updateUser-部门不存在 ✅ pass
TC-0173 POST /api/user/update - updateUser 修改状态时递增 tokenVersion ✅ pass
TC-0174 POST /api/user/update - updateUser 仅改 profile 不递增 tokenVersion ✅ pass
TC-0175 POST /api/user/update - updateUser 乐观锁冲突 -> 409 ✅ pass

2.16 用户列表/详情/状态 及其他用户操作

TC编号 测试场景 测试结果
TC-0176 POST /api/user/list - 含productCode ✅ pass
TC-0177 POST /api/user/list - 不含productCode ✅ pass
TC-0178 POST /api/user/list - pageSize超过上限 ✅ pass
TC-0179 POST /api/user/list - 用户不在产品中 ✅ pass
TC-0180 POST /api/user/list - 批量查询DB异常 ✅ pass
TC-0181 POST /api/user/detail - 正常查询 ✅ pass
TC-0182 POST /api/user/detail - 正常查询-含Avatar ✅ pass
TC-0183 POST /api/user/detail - 不存在 ✅ pass
TC-0184 POST /api/user/bindRoles - 正常绑定 ✅ pass
TC-0185 POST /api/user/bindRoles - 用户不存在 ✅ pass
TC-0186 POST /api/user/bindRoles - 清空角色 ✅ pass
TC-0187 POST /api/user/bindRoles - 事务回滚 ✅ pass
TC-0188 POST /api/user/bindRoles - 角色不属于当前产品 ✅ pass
TC-0189 POST /api/user/bindRoles - 角色已禁用 ✅ pass
TC-0190 POST /api/user/bindRoles - 角色不存在 ✅ pass
TC-0191 POST /api/user/bindRoles - 非产品成员绑定角色被拒绝 ✅ pass
TC-0192 POST /api/user/setPerms - 正常ALLOW ✅ pass
TC-0193 POST /api/user/setPerms - 用户不存在 ✅ pass
TC-0194 POST /api/user/setPerms - DENY权限 ✅ pass
TC-0195 POST /api/user/setPerms - 清空权限 ✅ pass
TC-0196 POST /api/user/setPerms - 无效Effect值 ✅ pass
TC-0197 POST /api/user/setPerms - PermId不存在 ✅ pass
TC-0198 POST /api/user/setPerms - 权限不属于当前产品 ✅ pass
TC-0199 POST /api/user/setPerms - 非产品成员设置权限被拒绝 ✅ pass
TC-0200 POST /api/user/updateStatus - 正常冻结 ✅ pass
TC-0201 POST /api/user/updateStatus - 正常解冻 ✅ pass
TC-0202 POST /api/user/updateStatus - 非法status(0) ✅ pass
TC-0203 POST /api/user/updateStatus - 冻结自己 ✅ pass
TC-0204 POST /api/user/updateStatus - 冻结超管 ✅ pass
TC-0205 POST /api/user/list - userList-非超管仅可见产品成员 ✅ pass
TC-0206 POST /api/user/list - userList-非超管未指定productCode被拒绝 ✅ pass
TC-0207 POST /api/user/list - userList-非超管使用错误productCode被拒绝 ✅ pass
TC-0208 POST /api/user/bindRoles - bindRoles-permsLevel越权拒绝 ✅ pass
TC-0209 POST /api/user/bindRoles - bindRoles-超管可分配任意级别角色 ✅ pass
TC-0210 POST /api/user/setPerms - 同一权限ID冲突Effect被拒绝 ✅ pass
TC-0211 POST /api/user/setPerms - 重复权限ID相同Effect去重 ✅ pass
TC-0212 POST /api/user/setPerms - 已禁用权限不能被设置 ✅ pass

2.17 成员管理

TC编号 测试场景 测试结果
TC-0213 POST /api/member/add - 正常添加 ✅ pass
TC-0214 POST /api/member/add - 产品不存在 ✅ pass
TC-0215 POST /api/member/add - 用户不存在 ✅ pass
TC-0216 POST /api/member/add - 已是成员 ✅ pass
TC-0217 POST /api/member/add - 并发添加 ✅ pass
TC-0218 POST /api/member/add - 无效MemberType ✅ pass
TC-0219 POST /api/member/update - 正常更新 ✅ pass
TC-0220 POST /api/member/update - 不存在 ✅ pass
TC-0221 POST /api/member/update - 无效MemberType ✅ pass
TC-0222 POST /api/member/list - 正常查询(批量查用户) ✅ pass
TC-0223 POST /api/member/list - 成员用户已删除 ✅ pass
TC-0224 POST /api/member/list - pageSize超过上限 ✅ pass
TC-0225 POST /api/member/list - 空成员列表 ✅ pass
TC-0226 POST /api/member/remove - 正常移除+级联(事务内) ✅ pass
TC-0227 POST /api/member/remove - 跨产品隔离 ✅ pass
TC-0228 POST /api/member/remove - 成员不存在 ✅ pass
TC-0229 POST /api/member/remove - 事务回滚 ✅ pass

三、gRPC 接口测试用例

3.1 gRPC SyncPermissions

TC编号 测试场景 测试结果
TC-0230 SyncPermissions - 正常同步 ✅ pass
TC-0231 SyncPermissions - appKey无效 ✅ pass
TC-0232 SyncPermissions - appSecret错误 ✅ pass
TC-0233 SyncPermissions - 产品已禁用 ✅ pass
TC-0234 SyncPermissions - 验证disabled计数 ✅ pass

3.2 gRPC Login / RefreshToken / VerifyToken / GetUserPerms

TC编号 测试场景 测试结果
TC-0235 Login - 正常登录(普通用户+productCode) ✅ pass
TC-0236 Login - 用户不存在 ✅ pass
TC-0237 Login - 密码错误 ✅ pass
TC-0238 Login - 账号冻结 ✅ pass
TC-0239 Login - 超管被拒绝 ✅ pass
TC-0240 Login - 普通用户+productCode ✅ pass
TC-0241 Login - 产品成员被禁用时拒绝登录 ✅ pass
TC-0242 Login - productCode为空 ✅ pass
TC-0243 RefreshToken - 正常刷新 ✅ pass
TC-0244 RefreshToken - token无效 ✅ pass
TC-0245 RefreshToken - 账号冻结 ✅ pass
TC-0246 RefreshToken - productCode回退到claims ✅ pass
TC-0247 RefreshToken - 超管+productCode ✅ pass
TC-0248 RefreshToken - 普通用户+productCode ✅ pass
TC-0249 VerifyToken - 有效token ✅ pass
TC-0250 VerifyToken - 无效token ✅ pass
TC-0251 VerifyToken - 缺少userId ✅ pass
TC-0252 VerifyToken - 冻结用户token返回Invalid ✅ pass
TC-0253 VerifyToken - 非成员token返回Invalid ✅ pass
TC-0254 VerifyToken - 返回实时MemberType和Perms ✅ pass
TC-0255 GetUserPerms - 用户不存在(需先通过AppKey/Secret认证) ✅ pass
TC-0256 GetUserPerms - 超管(需先通过AppKey/Secret认证) ✅ pass
TC-0257 GetUserPerms - MEMBER-DENY覆盖(需先通过AppKey/Secret认证) ✅ pass

四、JWT中间件 / 统一响应测试用例

TC编号 测试场景 测试结果
TC-0258 正常Bearer token ✅ pass
TC-0259 无Authorization头 ✅ pass
TC-0260 无Bearer前缀 ✅ pass
TC-0261 token签名错误 ✅ pass
TC-0262 token过期 ✅ pass
TC-0263 claims类型断言失败 ⏭️ skip
TC-0264 refresh token被拒绝 ✅ pass
TC-0265 业务错误(CodeError) ✅ pass
TC-0266 内部错误 ✅ pass
TC-0267 成功(有data) ✅ pass
TC-0268 成功(无data) ✅ pass

五、util 层测试用例

5.1 NormalizePage

TC编号 测试场景 测试结果
TC-0269 正常值 ✅ pass
TC-0270 page<=0 ✅ pass
TC-0271 page=-1 ✅ pass
TC-0272 pageSize<=0 ✅ pass
TC-0273 pageSize>100 ✅ pass
TC-0274 pageSize=100 ✅ pass
TC-0275 pageSize=101 ✅ pass
TC-0276 双零 ✅ pass

5.2 IsValidEmail

TC编号 测试场景 测试结果
TC-0277 正常邮箱 ✅ pass
TC-0278 含点号 ✅ pass
TC-0279 含加号 ✅ pass
TC-0280 缺少@ ✅ pass
TC-0281 缺少域名 ✅ pass
TC-0282 缺少TLD ✅ pass
TC-0283 空字符串 ✅ pass

5.3 IsValidPhone

TC编号 测试场景 测试结果
TC-0284 国内手机号 ✅ pass
TC-0285 带+国际码 ✅ pass
TC-0286 太短(6位) ✅ pass
TC-0287 恰好7位 ✅ pass
TC-0288 最长15位 ✅ pass
TC-0289 超长16位 ✅ pass
TC-0290 包含字母 ✅ pass
TC-0291 空字符串 ✅ pass

六、Logic 层单元测试用例

6.1 auth/jwt.go — GenerateAccessToken

TC编号 测试场景 测试结果
TC-0292 正常生成 ✅ pass
TC-0293 解析token验证claims ✅ pass
TC-0294 空secret ✅ pass
TC-0295 空perms ✅ pass
TC-0296 过期时间验证 ✅ pass

6.2 auth/jwt.go — GenerateRefreshToken

TC编号 测试场景 测试结果
TC-0297 正常生成 ✅ pass
TC-0298 解析验证 ✅ pass
TC-0299 productCode为空 ✅ pass

6.3 auth/jwt.go — ParseRefreshToken

TC编号 测试场景 测试结果
TC-0300 正常解析 ✅ pass
TC-0301 错误secret ✅ pass
TC-0302 无效token字符串 ✅ pass
TC-0303 空token ✅ pass
TC-0304 过期token ✅ pass
TC-0305 AccessToken误用 ✅ pass

6.4 middleware — 辅助函数单元测试

TC编号 测试场景 测试结果
TC-0306 GetUserId-正常 ✅ pass
TC-0307 GetUserId-空ctx ✅ pass
TC-0308 GetProductCode-正常 ✅ pass
TC-0309 GetUserDetails 返回完整字段 ✅ pass

七、Model 层 _gen.go 模板生成方法测试用例

7.1 通用 CRUD 方法 (每个 Model 均需测试)

TC编号 测试场景 测试结果
TC-0310 Insert - 正常插入 ✅ pass
TC-0311 Insert - 正常插入含TokenVersion ✅ pass
TC-0312 Insert - 唯一索引冲突 ✅ pass
TC-0313 Insert - 缓存key生成正确 ✅ pass
TC-0314 InsertWithTx - 事务内插入 ✅ pass
TC-0315 InsertWithTx - 事务内插入含TokenVersion ✅ pass
TC-0316 InsertWithTx - 事务回滚后无数据 ✅ pass
TC-0317 FindOne - 正常查询(缓存未命中) ✅ pass
TC-0318 FindOne - 正常查询(缓存命中) ✅ pass
TC-0319 FindOne - 记录不存在 ✅ pass
TC-0320 FindOne - DB异常(非ErrNotFound) ✅ pass
TC-0321 FindOneWithTx - 事务内正常查询 ✅ pass
TC-0322 FindOneWithTx - 事务内记录不存在 ✅ pass
TC-0323 FindOneWithTx - 事务内可见性 ✅ pass
TC-0324 Update - 正常更新 ✅ pass
TC-0325 Update - 正常更新含TokenVersion ✅ pass
TC-0326 Update - 记录不存在 ✅ pass
TC-0327 UpdateWithTx - 事务内更新 ✅ pass
TC-0328 Delete - 正常删除 ✅ pass
TC-0329 Delete - 记录不存在 ✅ pass
TC-0330 DeleteWithTx - 事务内删除 ✅ pass
TC-0331 TransactCtx - 正常事务 ✅ pass
TC-0332 TransactCtx - fn返回错误 ✅ pass
TC-0333 TableName - 获取表名 ✅ pass

7.2 批量插入方法

TC编号 测试场景 测试结果
TC-0334 BatchInsert - 空列表 ✅ pass
TC-0335 BatchInsert - 单条记录 ✅ pass
TC-0336 BatchInsert - 多条记录(3条) ✅ pass
TC-0337 BatchInsert - 批量插入含TokenVersion ✅ pass
TC-0338 BatchInsert - 唯一索引冲突 ✅ pass
TC-0339 BatchInsert - 大批量(1000条) ✅ pass
TC-0340 BatchInsertWithTx - 空列表 ✅ pass
TC-0341 BatchInsertWithTx - 正常多条 ✅ pass
TC-0342 BatchInsertWithTx - 事务回滚 ✅ pass

7.3 批量更新方法

TC编号 测试场景 测试结果
TC-0343 BatchUpdate - 空列表 ✅ pass
TC-0344 BatchUpdate - 单条记录 ✅ pass
TC-0345 BatchUpdate - 多条记录(3条) ✅ pass
TC-0346 BatchUpdate - 批量更新不污染数据 ✅ pass
TC-0347 BatchUpdate - 部分id不存在 ✅ pass
TC-0348 BatchUpdateWithTx - 空列表 ✅ pass
TC-0349 BatchUpdateWithTx - 正常多条 ✅ pass
TC-0350 buildBatchUpdateQuery - 单条 ✅ pass
TC-0351 buildBatchUpdateQuery - 多条 ✅ pass
TC-0352 buildBatchUpdateQuery - vals数量正确 ✅ pass

7.4 批量删除方法

TC编号 测试场景 测试结果
TC-0353 BatchDelete - 空ids ✅ pass
TC-0354 BatchDelete - 单个id ✅ pass
TC-0355 BatchDelete - 多个id(3个) ✅ pass
TC-0356 BatchDelete - 包含不存在id ✅ pass
TC-0357 BatchDeleteWithTx - 空ids ✅ pass
TC-0358 BatchDeleteWithTx - 正常多条 ✅ pass

7.5 唯一索引查询方法 (按 Model 差异)

TC编号 测试场景 测试结果
TC-0359 FindOneByUsername - 正常查询 ✅ pass
TC-0360 FindOneByUsername - 不存在 ✅ pass
TC-0361 FindOneByUsernameWithTx - 事务内正常查询 ✅ pass
TC-0362 FindOneByUsernameWithTx - 事务内不存在 ✅ pass
TC-0363 FindOneByAppKey - 正常查询 ✅ pass
TC-0364 FindOneByAppKey - 不存在 ✅ pass
TC-0365 FindOneByAppKeyWithTx - 事务内正常查询 ✅ pass
TC-0366 FindOneByAppKeyWithTx - 事务内不存在 ✅ pass
TC-0367 FindOneByCode - 正常查询 ✅ pass
TC-0368 FindOneByCode - 不存在 ✅ pass
TC-0369 FindOneByCodeWithTx - 事务内正常查询 ✅ pass
TC-0370 FindOneByCodeWithTx - 事务内不存在 ✅ pass
TC-0371 FindOneByProductCodeCode - 正常查询 ✅ pass
TC-0372 FindOneByProductCodeCode - 不存在 ✅ pass
TC-0373 FindOneByProductCodeCodeWithTx - 事务内正常查询 ✅ pass
TC-0374 FindOneByProductCodeCodeWithTx - 事务内不存在 ✅ pass
TC-0375 FindOneByProductCodeName - 正常查询 ✅ pass
TC-0376 FindOneByProductCodeName - 不存在 ✅ pass
TC-0377 FindOneByProductCodeNameWithTx - 事务内正常查询 ✅ pass
TC-0378 FindOneByProductCodeNameWithTx - 事务内不存在 ✅ pass
TC-0379 FindOneByRoleIdPermId - 正常查询 ✅ pass
TC-0380 FindOneByRoleIdPermId - 不存在 ✅ pass
TC-0381 FindOneByRoleIdPermIdWithTx - 事务内正常查询 ✅ pass
TC-0382 FindOneByRoleIdPermIdWithTx - 事务内不存在 ✅ pass
TC-0383 FindOneByUserIdPermId - 正常查询 ✅ pass
TC-0384 FindOneByUserIdPermId - 不存在 ✅ pass
TC-0385 FindOneByUserIdPermIdWithTx - 事务内正常查询 ✅ pass
TC-0386 FindOneByUserIdPermIdWithTx - 事务内不存在 ✅ pass
TC-0387 FindOneByUserIdRoleId - 正常查询 ✅ pass
TC-0388 FindOneByUserIdRoleId - 不存在 ✅ pass
TC-0389 FindOneByUserIdRoleIdWithTx - 事务内正常查询 ✅ pass
TC-0390 FindOneByUserIdRoleIdWithTx - 事务内不存在 ✅ pass
TC-0391 FindOneByProductCodeUserId - 正常查询 ✅ pass
TC-0392 FindOneByProductCodeUserId - 不存在 ✅ pass
TC-0393 FindOneByProductCodeUserIdWithTx - 事务内正常查询 ✅ pass
TC-0394 FindOneByProductCodeUserIdWithTx - 事务内不存在 ✅ pass

7.6 内部辅助方法

TC编号 测试场景 测试结果
TC-0395 findListByPrimaryKeys - 空ids ✅ pass
TC-0396 findListByPrimaryKeys - 正常ids ✅ pass
TC-0397 findListByPrimaryKeys - 部分不存在 ✅ pass
TC-0398 findListByPrimaryKeys - DB异常 ✅ pass
TC-0399 getPrimaryKeyValue - 正常 ✅ pass
TC-0400 formatPrimary - 正常 ✅ pass
TC-0401 queryPrimary - 正常 ✅ pass

7.7 缓存key与前缀初始化

TC编号 测试场景 测试结果
TC-0402 cachePrefix为空 ✅ pass
TC-0403 cachePrefix非空 ✅ pass
TC-0404 多唯一索引前缀(SysProduct) ✅ pass

八、Model 层自定义方法测试用例

8.1 SysUserModel

TC编号 测试场景 测试结果
TC-0405 FindListByPage - 正常分页 ✅ pass
TC-0406 FindListByPage - 第二页 ✅ pass
TC-0407 FindListByPage - 空表 ✅ pass
TC-0408 FindListByPage - count查询失败 ✅ pass
TC-0409 FindListByPage - list查询失败 ✅ pass
TC-0410 FindListByProductMembers - 正常查询 ✅ pass
TC-0411 FindListByProductMembers - productCode不存在 ✅ pass
TC-0412 FindByIds - 正常批量查询 ✅ pass
TC-0413 FindByIds - 空ids ✅ pass
TC-0414 FindByIds - 部分id不存在 ✅ pass
TC-0415 FindByIds - DB异常 ✅ pass
TC-0416 FindIdsByDeptId - 有用户的部门 ✅ pass
TC-0417 FindIdsByDeptId - 无用户部门 ✅ pass
TC-0418 UpdateProfile 状态未变-不递增tokenVersion - statusChanged=false ✅ pass
TC-0419 UpdateProfile 状态变更-tokenVersion+1 - statusChanged=true ✅ pass
TC-0420 UpdateProfile 乐观锁冲突 - expectedUpdateTime 与DB不符 ✅ pass
TC-0421 UpdateProfile 并发场景 - 两个 goroutine 基于同一 updateTime 并发更新 ✅ pass
TC-0422 UpdateProfile userId不存在 - id=9999999 ✅ pass

8.2 SysProductModel

TC编号 测试场景 测试结果
TC-0423 FindList - 正常分页 ✅ pass
TC-0424 FindList - 空表 ✅ pass
TC-0425 FindList - count失败 ✅ pass

8.3 SysPermModel

TC编号 测试场景 测试结果
TC-0426 FindListByProductCode - 正常分页 ✅ pass
TC-0427 FindListByProductCode - 不存在的productCode ✅ pass
TC-0428 FindAllCodesByProductCode - 正常查询 ✅ pass
TC-0429 FindAllCodesByProductCode - 空结果 ✅ pass
TC-0430 FindByIds - 正常 ✅ pass
TC-0431 FindByIds - 空ids ✅ pass
TC-0432 FindMapByProductCode - 正常查询 ✅ pass
TC-0433 FindMapByProductCode - 空结果 ✅ pass
TC-0434 FindMapByProductCode - key唯一性 ✅ pass
TC-0435 DisableNotInCodesWithTx - codes非空-正常 ✅ pass
TC-0436 DisableNotInCodesWithTx - codes为空-全部禁用 ✅ pass
TC-0437 DisableNotInCodesWithTx - 无需禁用 ✅ pass
TC-0438 DisableNotInCodesWithTx - DB异常 ✅ pass
TC-0439 FindAllCodesByProductCode - 有权限产品 ✅ pass
TC-0440 FindAllCodesByProductCode - 无权限产品 ✅ pass
TC-0441 FindAllCodesByProductCode - 全部已禁用 ✅ pass

8.4 SysDeptModel

TC编号 测试场景 测试结果
TC-0442 FindAll - 正常查询 ✅ pass
TC-0443 FindAll - 空表 ✅ pass
TC-0444 FindByParentId - 正常查询 ✅ pass
TC-0445 FindByParentId - 无子部门 ✅ pass
TC-0446 FindByPathPrefix - 正常查询 ✅ pass
TC-0447 FindByPathPrefix - LIKE注入已阻止 ✅ pass
TC-0448 FindByPathPrefix - 无匹配 ✅ pass

8.5 SysRoleModel

TC编号 测试场景 测试结果
TC-0449 FindListByProductCode - 正常分页 ✅ pass
TC-0450 FindListByProductCode - 空结果 ✅ pass
TC-0451 FindByIds - 正常 ✅ pass
TC-0452 FindByIds - 空ids ✅ pass
TC-0453 FindMinPermsLevelByUserIdAndProductCode - 有角色用户 ✅ pass
TC-0454 FindMinPermsLevelByUserIdAndProductCode - 无角色用户 ✅ pass

8.6 SysRolePermModel

TC编号 测试场景 测试结果
TC-0455 FindPermIdsByRoleId - 正常查询 ✅ pass
TC-0456 FindPermIdsByRoleId - 无绑定 ✅ pass
TC-0457 FindPermIdsByRoleIds - 正常查询 ✅ pass
TC-0458 FindPermIdsByRoleIds - 空roleIds ✅ pass
TC-0459 FindPermIdsByRoleIds - 去重验证 ✅ pass
TC-0460 DeleteByRoleIdTx - 正常事务内删除 ✅ pass
TC-0461 DeleteByRoleIdTx - 无绑定 ✅ pass

8.7 SysUserPermModel

TC编号 测试场景 测试结果
TC-0462 FindPermIdsByUserIdAndEffectForProduct - ALLOW-指定产品 ✅ pass
TC-0463 FindPermIdsByUserIdAndEffectForProduct - DENY-指定产品 ✅ pass
TC-0464 FindPermIdsByUserIdAndEffectForProduct - 无记录/其他产品 ✅ pass
TC-0465 DeleteByUserIdForProductTx - 事务内跨产品删除 ✅ pass
TC-0466 DeleteByUserIdForProductTx - 跨产品隔离 ✅ pass

8.8 SysUserRoleModel

TC编号 测试场景 测试结果
TC-0467 FindRoleIdsByUserId - 正常查询 ✅ pass
TC-0468 FindRoleIdsByUserId - 无绑定 ✅ pass
TC-0469 DeleteByRoleIdTx - 正常删除 ✅ pass
TC-0470 DeleteByUserIdForProductTx - 事务内跨产品删除 ✅ pass
TC-0471 DeleteByUserIdForProductTx - 跨产品隔离 ✅ pass
TC-0472 FindUserIdsByRoleId - 有绑定的角色 ✅ pass
TC-0473 FindUserIdsByRoleId - 无绑定角色 ✅ pass
TC-0474 FindRoleIdsByUserIdForProduct - 跨产品过滤 ✅ pass

8.9 SysProductMemberModel

TC编号 测试场景 测试结果
TC-0475 FindListByProductCode - 正常分页 ✅ pass
TC-0476 FindListByProductCode - 空结果 ✅ pass
TC-0477 FindMapByProductCodeUserIds - 正常批量 ✅ pass
TC-0478 FindMapByProductCodeUserIds - 空userIds ✅ pass
TC-0479 FindMapByProductCodeUserIds - 部分不是成员 ✅ pass
TC-0480 FindMapByProductCodeUserIds - map key正确 ✅ pass

九、访问控制 (auth/access.go)

9.1 RequireSuperAdmin

TC编号 测试场景 测试结果
TC-0481 超管通过 ✅ pass
TC-0482 非超管拒绝 ✅ pass
TC-0483 MEMBER拒绝 ✅ pass
TC-0484 未登录 ✅ pass

9.2 RequireProductAdminFor(ctx, targetProductCode)

TC编号 测试场景 测试结果
TC-0485 超管通过 ✅ pass
TC-0486 ADMIN通过(同产品) ✅ pass
TC-0487 DEVELOPER拒绝 ✅ pass
TC-0488 MEMBER拒绝 ✅ pass
TC-0489 未登录 ✅ pass
TC-0490 ADMIN跨产品拒绝 ✅ pass

9.3 CheckMemberTypeAssignment

TC编号 测试场景 测试结果
TC-0491 超管可分配任何类型 ✅ pass
TC-0492 ADMIN分配DEVELOPER ✅ pass
TC-0493 ADMIN分配ADMIN(同级拒绝) ✅ pass
TC-0494 DEVELOPER分配ADMIN(越级拒绝) ✅ pass
TC-0495 MEMBER分配MEMBER(同级拒绝) ✅ pass
TC-0496 未登录 ✅ pass

9.4 CheckManageAccess

TC编号 测试场景 测试结果
TC-0497 超管可管理任何人 ✅ pass
TC-0498 操作自己 ✅ pass
TC-0499 ADMIN跳过部门检查 ✅ pass
TC-0500 非ADMIN无部门拒绝 ✅ pass
TC-0501 目标用户无部门 ✅ pass
TC-0502 目标在不同部门 ✅ pass
TC-0503 未登录 ✅ pass
TC-0504 caller.DeptPath为空时拒绝 ✅ pass

9.5 memberTypePriority

TC编号 测试场景 测试结果
TC-0505 各类型优先级正确 ✅ pass

十、UserDetailsLoader (loaders/userDetailsLoader.go)

10.1 Load / 缓存

TC编号 测试场景 测试结果
TC-0506 DB加载(缓存miss) ✅ pass
TC-0507 缓存命中 ✅ pass
TC-0508 用户不存在 ✅ pass
TC-0509 productCode为空 ✅ pass

10.2 缓存失效

TC编号 测试场景 测试结果
TC-0510 Del删除指定缓存 ✅ pass
TC-0511 Clean清除用户所有产品缓存 ✅ pass
TC-0512 CleanByProduct清除产品所有用户 ✅ pass
TC-0513 BatchDel批量删除 ✅ pass
TC-0514 BatchDel空数组 ✅ pass

10.3 loadPerms权限计算

TC编号 测试场景 测试结果
TC-0515 超管全量权限 ✅ pass
TC-0516 ADMIN全量权限 ✅ pass
TC-0517 DEVELOPER全量权限 ✅ pass
TC-0518 DEV部门全量权限 ✅ pass
TC-0519 MEMBER角色权限+ALLOW-DENY ✅ pass
TC-0520 用户ALLOW权限不跨产品泄漏 ✅ pass
TC-0521 禁用DEV部门成员无全量权限 ✅ pass

10.4 loadRoles + MinPermsLevel

TC编号 测试场景 测试结果
TC-0522 多角色取最小permsLevel ✅ pass
TC-0523 无角色 ✅ pass
TC-0524 角色跨产品过滤 ✅ pass
TC-0525 禁用角色不计入 ✅ pass

10.5 loadMembership

TC编号 测试场景 测试结果
TC-0526 超管自动设置SUPER_ADMIN ✅ pass
TC-0527 非成员MemberType为空 ✅ pass
TC-0528 禁用成员MemberType为空 ✅ pass

十一、中间件 — 冻结账号拦截

TC编号 测试场景 测试结果
TC-0529 冻结用户被403 ✅ pass
TC-0530 用户不存在(Status=0) ✅ pass
TC-0531 UserDetails注入context ✅ pass

十二、Logic层 — 访问控制负面测试

TC编号 测试场景 测试结果
TC-0532 createDept非超管拒绝 ✅ pass
TC-0533 updateDept非超管拒绝 ✅ pass
TC-0534 deleteDept非超管拒绝 ✅ pass
TC-0535 createProduct非超管拒绝 ✅ pass
TC-0536 updateProduct非超管拒绝 ✅ pass
TC-0537 createUser非产品管理员拒绝 ✅ pass
TC-0538 createRole非产品管理员拒绝 ✅ pass
TC-0539 updateRole非产品管理员拒绝 ✅ pass
TC-0540 deleteRole非产品管理员拒绝 ✅ pass
TC-0541 bindRolePerms非产品管理员拒绝 ✅ pass
TC-0542 updateUser-MEMBER不能管理他人 ✅ pass
TC-0543 updateUser自己修改DeptId被拒绝 ✅ pass
TC-0544 updateUser自己修改Status被拒绝 ✅ pass
TC-0545 updateUser未登录被拒绝 ✅ pass

十三、限流中间件 (middleware/ratelimitMiddleware.go)

TC编号 测试场景 测试结果
TC-0546 正常请求(未超限) ✅ pass
TC-0547 超限请求被拒绝 ✅ pass
TC-0548 behindProxy=false时XFF被忽略 ✅ pass
TC-0549 behindProxy=false时X-Real-IP被忽略 ✅ pass
TC-0550 IP从RemoteAddr解析 ✅ pass
TC-0551 不同IP独立限流 ✅ pass
TC-0552 behindProxy=true时信任X-Real-IP ✅ pass
TC-0553 behindProxy=true时无X-Real-IP回退RemoteAddr ✅ pass
TC-0554 behindProxy=true时XFF仍被忽略 ✅ pass
TC-0555 RemoteAddr无端口格式 ✅ pass

十四、审计修复回归 (audit-report.md 2026-04 修复集)

TC编号 测试场景 测试结果 关联修复
TC-0208 MEMBER 仍被 permsLevel 校验阻断 ✅ pass H-1
TC-0711 ADMIN 绕过 permsLevel 校验 ✅ pass H-1
TC-0712 DEVELOPER 绕过 permsLevel 校验 ✅ pass H-1
TC-0713 MEMBER w/ MinPermsLevel=MaxInt64 不被误阻断 ✅ pass H-1
TC-0700 gRPC GetUserPerms 冻结用户 → PermissionDenied ✅ pass H-2
TC-0701 gRPC GetUserPerms 非成员 → PermissionDenied ✅ pass H-2
TC-0702 gRPC GetUserPerms DEV+禁用成员 → PermissionDenied ✅ pass H-2 + H-3
TC-0703 gRPC GetUserPerms 正常成员 → 成功 ✅ pass H-2 (positive)
TC-0704 Loader:DEV 部门 + 禁用成员不发全量权限 ✅ pass H-3
TC-0705 Loader:不存在用户不留缓存 ✅ pass L-5
TC-0706 FindRoleIdsByUserIdForProduct 过滤 r.status=1 ✅ pass M-4
TC-0707 DeleteByUserIdAndRoleIdsTx 批量删除 ✅ pass M-2
TC-0708 DeleteByUserIdAndRoleIdsTx 空列表 no-op ✅ pass M-2
TC-0709 DeleteByUserIdAndRoleIdsTx userId 约束 ✅ pass M-2
TC-0710 产品/管后登录限流独立桶 ✅ pass L-2
TC-0716 JWT access token payload 不含 "perms" key ✅ pass M-6
TC-0105 UpdateDept 不再级联子部门缓存 + UpdateWithOptLock ✅ pass M-5
TC-0714 UpdateDept 无关字段变更不清缓存 ✅ pass M-5
TC-0715 UpdateDept 乐观锁冲突返回 ErrConflict ✅ pass M-5
TC-0181 UserDetail 超管在产品上下文仅返回该产品 roleIds ✅ pass M-3
TC-0108 DeleteDept 不存在部门返回 404 ✅ pass M-11

三、测试结论

3.1 整体质量评估:极高

  • 570 个 TC 全部执行,通过 569,跳过 1 (防御性不可达分支),失败 0。
  • 本轮针对 audit-report.md H-1/H-2/H-3/M-2/M-3/M-4/M-5/M-6/M-11/L-2/L-5 共 11 项修复新增/重构 15 组专项回归用例 (TC-0105、TC-0108、TC-0181、TC-0208、TC-0700~TC-0716),全部通过,严格断言修复后行为而非迁就旧逻辑。
  • 共 730 个顶层 Test 函数 + 87 个子用例 = 817 次测试执行事件,通过 816,跳过 1,失败 0。
  • 业务代码 (logic / model / loaders / middleware / server / response) 覆盖率加权平均约 88.33%,核心包均在 73.8% 以上;整体 ./... 覆盖率 58.2% 包含大量 handler 薄层 / pb / permclient / testutil 生成或桩代码。
  • 唯一跳过用例 TC-0263 为防御性不可达分支 (claims 类型断言失败,运行时无法触达),已标记 t.Skip,不影响业务正确性。

3.2 修复验证亮点

风险项 修复验证断言 价值
H-1 ADMIN/DEVELOPER 不再被 permsLevel 误阻 (TC-0711/0712);MEMBER sentinel 场景被保护 (TC-0713);MEMBER 越权仍拒绝 (TC-0208) 阻止"本该有权的管理员被自家规则误杀"的 P0 生产故障
H-2 + H-3 gRPC GetUserPerms 对冻结/非成员/DEV 部门禁用成员全部 PermissionDenied (TC-0700~0702);Loader 层亦验证 DEV+禁用成员不再命中全量权限分支 (TC-0704) 堵住攻击面最广的 token 发放旁路,横跨 API 与 RPC
M-2 批量 DELETE ... IN (...) 正确性 + 空集合保护 + userId WHERE 约束 (TC-0707~0709) 消除 N+1,提升 BindRoles/BindRolePerms 大批量操作性能
M-3 超管产品上下文只返回该产品角色 (TC-0181) 防止跨产品信息越权
M-4 禁用角色被严格过滤 (TC-0706) 避免 Loader 因过期绑定返回错误 MemberType
M-5 乐观锁冲突可检出;DeptType/Status 未变时不触发级联缓存清理 (TC-0105/0714/0715) 防并发更新丢字段 + 消除 O(N) 缓存抖动
M-6 access token payload 确实不存在 perms 字段 (TC-0716,base64 解码校验) 清理长期 Dead field,缩小 token 体积/攻击面
M-11 删除不存在部门返回 404 而非静默成功 (TC-0108) 消除 TOCTOU + 调用方误以为成功的隐性 BUG
L-2 产品登录耗尽配额后管后登录仍可放行 (TC-0710) 避免攻击一条入口拖垮另一条
L-5 Loader 对不存在用户不留缓存,多次调用均走 DB (TC-0705) 避免零值 UserDetails 长期污染缓存

3.3 发现的核心缺陷

  • 本轮测试未发现新 BUG:所有断言严格对齐修复后的预期行为 (真实场景驱动),未出现因迁就源码而放宽的断言。
  • 对于历史遗留缺陷 (H-1 ~ L-5) 的回归,测试脚本已作为"防退化护栏"沉淀,后续一旦有人把 permsLevel 检查重新加回 ADMIN 分支、把 FindRoleIdsByUserIdForProduct 过滤条件去掉、或把 sys_dept 的乐观锁摘掉,相应 TC 会立即失败。

3.4 后续测试建议

  1. handler 薄层契约测试:补齐 go-zero handler 入口的请求反序列化/必填校验/非法 JSON 等 HTTP 合同测试 (当前仅覆盖 handler/pub);建议 target 至少 40%。
  2. 端到端并发场景:目前 M-5 的乐观锁只通过 mock 层验证;建议补一组"真实并发双写 sys_dept"集成测试 (可用 t.Parallel + goroutine + DBretry)。
  3. gRPC 契约层模糊测试:GetUserPerms / VerifyToken 建议接入 fuzz 用例,针对 productCode、appKey/appSecret 畸形组合做随机注入。
  4. Loader 缓存并发:补一组 singleflight 并发 Load 同一 userId 的压测,验证 L-5 修复在高并发下未出现缓存击穿。
  5. 限流 Redis 故障隔离:L-2 独立桶已验证 key 隔离,但 Redis 短暂不可用时是否 fail-open/fail-close 尚无用例,建议补 Redis DOWN 场景的行为断言。