test-report.md 32 KB

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

报告日期: 2026-04-17 测试范围: API (go-zero REST, 全 POST) + gRPC (status codes) + Model 层 (_gen.go 模板生成 + 自定义方法) + Logic 单元测试 + util 层 + 访问控制 + UserDetailsLoader + 限流中间件 测试用例设计详见 test-design.md


一、测试执行总览

指标 数值
测试用例总数 (test-design.md) 541
已覆盖 TC 数 540
未实现 TC 数 1 (TC-0189 不可达防御分支 t.Skip)
测试函数总数 690
测试子用例总数 (含 table-driven) 772
测试包数量 23
✅ 通过 771 / 772
❌ 失败 0
⏭️ 跳过 1 (TC-0189 — 防御性不可达分支)

1.1 各包测试耗时

测试包 状态 耗时
handler/pub ✅ ok 3.407s
loaders ✅ ok 1.674s
logic/auth ✅ ok 7.474s
logic/dept ✅ ok 2.951s
logic/member ✅ ok 4.107s
logic/perm ✅ ok 1.671s
logic/product ✅ ok 5.155s
logic/pub ✅ ok 6.738s
logic/role ✅ ok 4.837s
logic/user ✅ ok 6.366s
middleware ✅ ok 6.005s
model/dept ✅ ok 6.504s
model/perm ✅ ok 7.169s
model/product ✅ ok 7.660s
model/productmember ✅ ok 8.187s
model/role ✅ ok 8.775s
model/roleperm ✅ ok 8.725s
model/user ✅ ok 8.356s
model/userperm ✅ ok 8.231s
model/userrole ✅ ok 7.799s
response ✅ ok 7.298s
server ✅ ok 7.854s
util ✅ ok 6.660s

二、TC 测试结果明细

2.1 REST API — 产品端登录 (TC-0001 ~ TC-0012)

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

2.2 REST API — 管理后台登录 (TC-0500 ~ TC-0509)

TC编号 测试场景 测试结果
TC-0500 超管正常登录(管理后台) ✅ pass
TC-0501 普通用户正常登录(管理后台) ✅ pass
TC-0502 managementKey无效 ✅ pass
TC-0503 managementKey为空 ✅ pass
TC-0504 用户不存在 ✅ pass
TC-0505 密码错误 ✅ pass
TC-0506 账号冻结 ✅ pass
TC-0507 不带productCode时perms为空 ✅ pass
TC-0508 缺少必填字段(handler校验) ✅ pass
TC-0509 SQL注入username ✅ pass

2.3 REST API — 刷新Token (TC-0013 ~ TC-0018)

TC编号 测试场景 测试结果
TC-0013 正常刷新 ✅ pass
TC-0014 不带productCode(回退) ✅ pass
TC-0015 token无效 ✅ pass
TC-0016 用户已删除 ✅ pass
TC-0017 账号冻结 ✅ pass
TC-0018 超管+productCode ✅ pass
TC-0514 尝试切换产品被拒绝(H-02) ✅ pass

2.4 REST API — 同步权限 (TC-0019 ~ TC-0029, TC-0532, TC-0535)

TC编号 测试场景 测试结果
TC-0019 全部新增 ✅ pass
TC-0020 更新已有(名称变更) ✅ pass
TC-0021 无变化 ✅ pass
TC-0022 禁用权限重启 ✅ pass
TC-0023 移除不在列表的权限 ✅ pass
TC-0024 空perms数组 ✅ pass
TC-0025 验证disabled返回值 ✅ pass
TC-0026 appKey无效 ✅ pass
TC-0027 appSecret错误 ✅ pass
TC-0028 产品已禁用 ✅ pass
TC-0029 大批量(1000条) ✅ pass
TC-0532 重复code去重(M-09) ✅ pass
TC-0535 事务保护-中途失败回滚(H-05) ✅ pass

2.5 REST API — 用户信息 / 修改密码 (TC-0030 ~ TC-0044)

TC编号 测试场景 测试结果
TC-0030 正常获取-含productCode ✅ pass
TC-0031 不含productCode ✅ pass
TC-0032 未登录 ✅ pass
TC-0033 token过期 ✅ pass
TC-0034 userId=0 ✅ pass
TC-0035 正常修改 ✅ pass
TC-0036 mustChangePassword重置 ✅ pass
TC-0037 原密码错误 ✅ pass
TC-0038 新密码少于6字符 ✅ pass
TC-0039 新密码恰好6字符 ✅ pass
TC-0040 新密码空字符串 ✅ pass
TC-0041 新密码超过72字符 ✅ pass
TC-0042 新密码恰好72字符 ✅ pass
TC-0043 新旧密码相同 ✅ pass
TC-0044 用户不存在 ✅ pass

2.6 REST API — 产品管理 (TC-0045 ~ TC-0059, TC-0526 ~ TC-0529)

TC编号 测试场景 测试结果
TC-0045 正常创建 ✅ pass
TC-0046 事务回滚-用户创建失败 ✅ pass
TC-0047 事务回滚-成员创建失败 ✅ pass
TC-0048 编码已存在 ✅ pass
TC-0049 并发创建同编码 ✅ pass
TC-0050 正常更新 ✅ pass
TC-0051 不存在 ✅ pass
TC-0052 不传status ✅ pass
TC-0053 正常分页 ✅ pass
TC-0054 默认分页 ✅ pass
TC-0055 pageSize超过上限 ✅ pass
TC-0056 pageSize=0 ✅ pass
TC-0057 page负值 ✅ pass
TC-0058 正常查询 ✅ pass
TC-0059 不存在 ✅ pass
TC-0526 非超管AppKey隐藏(H-11) ✅ pass
TC-0527 超管可见AppKey(H-11) ✅ pass
TC-0528 详情非超管AppKey隐藏(H-11) ✅ pass
TC-0529 详情超管可见AppKey(H-11) ✅ pass

2.7 REST API — 部门管理 (TC-0060 ~ TC-0079, TC-0522, TC-0533)

TC编号 测试场景 测试结果
TC-0060 创建顶级部门 ✅ pass
TC-0061 创建子部门 ✅ pass
TC-0062 父部门不存在 ✅ pass
TC-0063 不传DeptType默认NORMAL ✅ pass
TC-0064 传DeptType=DEV ✅ pass
TC-0065 事务内FindOneWithTx可见性 ✅ pass
TC-0066 事务回滚-Insert失败 ✅ pass
TC-0067 事务回滚-UpdateWithTx失败 ✅ pass
TC-0068 多层嵌套(5层) ✅ pass
TC-0069 通过Logic创建+验证Path ✅ pass
TC-0070 正常更新 ✅ pass
TC-0071 不存在 ✅ pass
TC-0072 DeptType NORMAL→DEV ✅ pass
TC-0073 DeptType无效值忽略 ✅ pass
TC-0074 正常删除(无子部门) ✅ pass
TC-0075 有子部门 ✅ pass
TC-0076 不存在的部门 ✅ pass
TC-0077 正常获取 ✅ pass
TC-0078 空数据 ✅ pass
TC-0079 孤儿节点 ✅ pass
TC-0522 部门下有关联用户(H-07) ✅ pass
TC-0533 DeptType变更级联清除缓存(M-10) ✅ pass

2.8 REST API — 权限列表 (TC-0080 ~ TC-0083)

TC编号 测试场景 测试结果
TC-0080 正常查询 ✅ pass
TC-0081 默认分页 ✅ pass
TC-0082 pageSize超过上限 ✅ pass
TC-0083 不存在的productCode ✅ pass

2.9 REST API — 角色管理 (TC-0084 ~ TC-0100)

TC编号 测试场景 测试结果
TC-0084 正常创建 ✅ pass
TC-0085 重复角色名 ✅ pass
TC-0086 并发同名创建 ✅ pass
TC-0087 正常更新 ✅ pass
TC-0088 不存在 ✅ pass
TC-0089 正常查询 ✅ pass
TC-0090 pageSize超过上限 ✅ pass
TC-0091 正常查询 ✅ pass
TC-0092 不存在 ✅ pass
TC-0093 正常删除+级联 ✅ pass
TC-0094 事务回滚 ✅ pass
TC-0095 无关联数据 ✅ pass
TC-0096 正常绑定 ✅ pass
TC-0097 角色不存在 ✅ pass
TC-0098 清空权限 ✅ pass
TC-0099 重复permId ✅ pass
TC-0100 事务回滚 ✅ pass

2.10 REST API — 用户管理 (TC-0101 ~ TC-0145, TC-0511 ~ TC-0520, TC-0524 ~ TC-0525)

TC编号 测试场景 测试结果
TC-0101 正常创建 ✅ pass
TC-0102 用户名已存在(预检) ✅ pass
TC-0103 带完整可选字段 ✅ pass
TC-0104 非法email格式 ✅ pass
TC-0105 合法email ✅ pass
TC-0106 email为空(可选) ✅ pass
TC-0107 非法phone格式 ✅ pass
TC-0108 合法phone(国际) ✅ pass
TC-0109 phone为空(可选) ✅ pass
TC-0110 并发同username(TOCTOU) ✅ pass
TC-0111 唯一索引冲突消息 ✅ pass
TC-0112 正常更新 ✅ pass
TC-0113 不存在 ✅ pass
TC-0114 仅传id ✅ pass
TC-0115 清空nickname ✅ pass
TC-0116 清空email ✅ pass
TC-0117 清空remark ✅ pass
TC-0118 非法email格式 ✅ pass
TC-0119 非法phone格式 ✅ pass
TC-0120 合法phone ✅ pass
TC-0121 不传email(nil) ✅ pass
TC-0122 DeptId设为0(取消部门) ✅ pass
TC-0123 DeptId设为正值 ✅ pass
TC-0124 DeptId不传(nil) ✅ pass
TC-0125 含productCode ✅ pass
TC-0126 不含productCode ✅ pass
TC-0127 pageSize超过上限 ✅ pass
TC-0128 用户不在产品中 ✅ pass
TC-0129 批量查询DB异常 ✅ pass
TC-0130 正常查询 ✅ pass
TC-0131 正常查询-含Avatar ✅ pass
TC-0132 不存在 ✅ pass
TC-0133 正常绑定 ✅ pass
TC-0134 用户不存在 ✅ pass
TC-0135 清空角色 ✅ pass
TC-0136 事务回滚 ✅ pass
TC-0137 正常ALLOW ✅ pass
TC-0138 用户不存在 ✅ pass
TC-0139 DENY权限 ✅ pass
TC-0140 清空权限 ✅ pass
TC-0141 正常冻结 ✅ pass
TC-0142 正常解冻 ✅ pass
TC-0143 非法status(0) ✅ pass
TC-0144 冻结自己 ✅ pass
TC-0145 冻结超管 ✅ pass
TC-0511 updateUser自己修改DeptId被拒绝(H-01) ✅ pass
TC-0512 updateUser自己修改Status被拒绝(H-01) ✅ pass
TC-0513 updateUser未登录被拒绝(H-01) ✅ pass
TC-0515 bindRoles角色不属于当前产品(H-03) ✅ pass
TC-0516 bindRoles角色已禁用(H-03) ✅ pass
TC-0517 bindRoles角色不存在(H-03) ✅ pass
TC-0518 setUserPerms无效Effect值(H-04) ✅ pass
TC-0519 setUserPerms PermId不存在(H-04) ✅ pass
TC-0520 setUserPerms权限不属于当前产品(H-04) ✅ pass
TC-0524 createUser密码少于6字符(H-10) ✅ pass
TC-0525 createUser密码超过72字符(H-10) ✅ pass

2.11 REST API — 成员管理 (TC-0146 ~ TC-0160, TC-0530 ~ TC-0531)

TC编号 测试场景 测试结果
TC-0146 正常添加 ✅ pass
TC-0147 产品不存在 ✅ pass
TC-0148 用户不存在 ✅ pass
TC-0149 已是成员 ✅ pass
TC-0150 并发添加 ✅ pass
TC-0151 正常更新 ✅ pass
TC-0152 不存在 ✅ pass
TC-0153 正常查询(批量查用户) ✅ pass
TC-0154 成员用户已删除 ✅ pass
TC-0155 pageSize超过上限 ✅ pass
TC-0156 空成员列表 ✅ pass
TC-0157 正常移除+级联(事务内) ✅ pass
TC-0158 跨产品隔离 ✅ pass
TC-0159 成员不存在 ✅ pass
TC-0160 事务回滚 ✅ pass
TC-0530 addMember无效MemberType(M-06) ✅ pass
TC-0531 updateMember无效MemberType(M-06) ✅ pass

2.12 gRPC 接口 (TC-0161 ~ TC-0183, TC-0510)

TC编号 测试场景 测试结果
TC-0161 正常同步 ✅ pass
TC-0162 appKey无效 ✅ pass
TC-0163 appSecret错误 ✅ pass
TC-0164 产品已禁用 ✅ pass
TC-0165 验证disabled计数 ✅ pass
TC-0166 正常登录(普通用户+productCode) ✅ pass
TC-0167 用户不存在 ✅ pass
TC-0168 密码错误 ✅ pass
TC-0169 账号冻结 ✅ pass
TC-0170 超管被拒绝(PermissionDenied) ✅ pass
TC-0171 普通用户+productCode ✅ pass
TC-0510 productCode为空(InvalidArgument) ✅ pass
TC-0172 正常刷新 ✅ pass
TC-0173 token无效 ✅ pass
TC-0174 账号冻结 ✅ pass
TC-0175 productCode回退到claims ✅ pass
TC-0176 超管+productCode ✅ pass
TC-0177 普通用户+productCode ✅ pass
TC-0178 有效token ✅ pass
TC-0179 无效token ✅ pass
TC-0180 缺少userId ✅ pass
TC-0181 用户不存在 ✅ pass
TC-0182 超管 ✅ pass
TC-0183 MEMBER-DENY覆盖 ✅ pass

2.13 中间件 / 统一响应 (TC-0184 ~ TC-0193, TC-0434, TC-0478 ~ TC-0480, TC-0536 ~ TC-0541)

TC编号 测试场景 测试结果
TC-0184 正常Bearer token ✅ pass
TC-0185 无Authorization头 ✅ pass
TC-0186 无Bearer前缀 ✅ pass
TC-0187 token签名错误 ✅ pass
TC-0188 token过期 ✅ pass
TC-0189 claims类型断言失败 ⏭️ skip(防御性分支不可达)
TC-0434 refresh token被拒绝 ✅ pass
TC-0478 冻结用户被403 ✅ pass
TC-0479 用户不存在(Status=0) ✅ pass
TC-0480 UserDetails注入context ✅ pass
TC-0190 业务错误(CodeError) ✅ pass
TC-0191 内部错误 ✅ pass
TC-0192 成功(有data) ✅ pass
TC-0193 成功(无data) ✅ pass
TC-0536 限流-正常请求(未超限) ✅ pass
TC-0537 限流-超限请求被拒绝(429) ✅ pass
TC-0538 限流-IP从X-Forwarded-For获取 ✅ pass
TC-0539 限流-IP从X-Real-IP获取 ✅ pass
TC-0540 限流-IP从RemoteAddr获取 ✅ pass
TC-0541 限流-不同IP独立限流 ✅ pass

2.14 util 层 (TC-0194 ~ TC-0216)

TC编号 测试场景 测试结果
TC-0194 正常值 ✅ pass
TC-0195 page<=0 ✅ pass
TC-0196 page=-1 ✅ pass
TC-0197 pageSize<=0 ✅ pass
TC-0198 pageSize>100 ✅ pass
TC-0199 pageSize=100 ✅ pass
TC-0200 pageSize=101 ✅ pass
TC-0201 双零 ✅ pass
TC-0202 正常邮箱 ✅ pass
TC-0203 含点号 ✅ pass
TC-0204 含加号 ✅ pass
TC-0205 缺少@ ✅ pass
TC-0206 缺少域名 ✅ pass
TC-0207 缺少TLD ✅ pass
TC-0208 空字符串 ✅ pass
TC-0209 国内手机号 ✅ pass
TC-0210 带+国际码 ✅ pass
TC-0211 太短(6位) ✅ pass
TC-0212 恰好7位 ✅ pass
TC-0213 最长15位 ✅ pass
TC-0214 超长16位 ✅ pass
TC-0215 包含字母 ✅ pass
TC-0216 空字符串 ✅ pass

2.15 Logic 层单元测试 — JWT / 权限计算 / Helper (TC-0217 ~ TC-0266, TC-0534)

TC编号 测试场景 测试结果
TC-0217 正常生成 ✅ pass
TC-0218 解析token验证claims ✅ pass
TC-0219 空secret ✅ pass
TC-0220 空perms ✅ pass
TC-0221 过期时间验证 ✅ pass
TC-0222 正常生成 ✅ pass
TC-0223 解析验证 ✅ pass
TC-0224 productCode为空 ✅ pass
TC-0225 正常解析 ✅ pass
TC-0226 错误secret ✅ pass
TC-0227 无效token字符串 ✅ pass
TC-0228 空token ✅ pass
TC-0229 过期token ✅ pass
TC-0230 AccessToken误用 ✅ pass
TC-0231 超管 ✅ pass
TC-0232 超管+查询失败 ✅ pass
TC-0233 非产品成员 ✅ pass
TC-0234 成员查询失败(非ErrNotFound) ✅ pass
TC-0235 DEVELOPER成员 ✅ pass
TC-0236 ADMIN成员 ✅ pass
TC-0237 DEVELOPER+查询失败 ✅ pass
TC-0238 MEMBER-DEV部门-全权限 ✅ pass
TC-0239 MEMBER-DEV部门-查询权限失败 ✅ pass
TC-0240 MEMBER-非DEV部门-正常回退 ✅ pass
TC-0241 MEMBER-部门不存在-正常回退 ✅ pass
TC-0242 MEMBER-deptId=0-跳过部门检查 ✅ pass
TC-0243 MEMBER-无角色无自定义 ✅ pass
TC-0244 MEMBER-有角色权限 ✅ pass
TC-0245 MEMBER-角色跨产品过滤 ✅ pass
TC-0246 MEMBER-角色已禁用 ✅ pass
TC-0247 MEMBER-ALLOW添加 ✅ pass
TC-0248 MEMBER-DENY排除角色权限 ✅ pass
TC-0249 MEMBER-DENY排除ALLOW ✅ pass
TC-0250 MEMBER-ALLOW+角色去重 ✅ pass
TC-0251 MEMBER-最终perm.Status=2 ✅ pass
TC-0252 MEMBER-FindRoleIdsByUserId失败 ✅ pass
TC-0253 MEMBER-FindByIds(roles)失败 ✅ pass
TC-0254 MEMBER-FindPermIdsByRoleIds失败 ✅ pass
TC-0255 MEMBER-FindPermIdsByUserIdAndEffect(ALLOW)失败 ✅ pass
TC-0256 MEMBER-FindPermIdsByUserIdAndEffect(DENY)失败 ✅ pass
TC-0257 MEMBER-FindByIds(perms)失败 ✅ pass
TC-0258 GetUserId-正常 ✅ pass
TC-0259 GetUserId-空ctx ✅ pass
TC-0260 GetUsername-正常 ✅ pass
TC-0261 GetUsername-空ctx ✅ pass
TC-0262 GetProductCode-正常 ✅ pass
TC-0263 GetMemberType-正常 ✅ pass
TC-0264 IsSuperAdmin-是 ✅ pass
TC-0265 IsSuperAdmin-否 ✅ pass
TC-0266 IsSuperAdmin-空 ✅ pass
TC-0534 GetUserPerms委托到UserDetailsLoader(L-03) ✅ pass

2.16 Model 层 _gen.go 通用 CRUD / 批量方法 (TC-0267 ~ TC-0310)

以下每个 TC 为通用模式,适用于全部 9 个 Model,实际测试函数数 = TC × 模型数。

TC编号 测试场景 测试结果
TC-0267 正常插入 ✅ pass
TC-0268 唯一索引冲突 ✅ pass
TC-0269 缓存key生成正确 ✅ pass
TC-0270 事务内插入 ✅ pass
TC-0271 事务回滚后无数据 ✅ pass
TC-0272 正常查询(缓存未命中) ✅ pass
TC-0273 正常查询(缓存命中) ✅ pass
TC-0274 记录不存在 ✅ pass
TC-0275 DB异常(非ErrNotFound) ✅ pass
TC-0276 事务内正常查询 ✅ pass
TC-0277 事务内记录不存在 ✅ pass
TC-0278 事务内可见性 ✅ pass
TC-0279 正常更新 ✅ pass
TC-0280 记录不存在 ✅ pass
TC-0281 事务内更新 ✅ pass
TC-0282 正常删除 ✅ pass
TC-0283 记录不存在 ✅ pass
TC-0284 事务内删除 ✅ pass
TC-0285 正常事务 ✅ pass
TC-0286 fn返回错误 ✅ pass
TC-0287 获取表名 ✅ pass
TC-0288 空列表 ✅ pass
TC-0289 单条记录 ✅ pass
TC-0290 多条记录(3条) ✅ pass
TC-0291 唯一索引冲突 ✅ pass
TC-0292 大批量(1000条) ✅ pass
TC-0293 空列表 ✅ pass
TC-0294 正常多条 ✅ pass
TC-0295 事务回滚 ✅ pass
TC-0296 空列表 ✅ pass
TC-0297 单条记录 ✅ pass
TC-0298 多条记录(3条) ✅ pass
TC-0299 部分id不存在 ✅ pass
TC-0300 空列表 ✅ pass
TC-0301 正常多条 ✅ pass
TC-0302 单条 ✅ pass
TC-0303 多条 ✅ pass
TC-0304 vals数量正确 ✅ pass
TC-0305 空ids ✅ pass
TC-0306 单个id ✅ pass
TC-0307 多个id(3个) ✅ pass
TC-0308 包含不存在id ✅ pass
TC-0309 空ids ✅ pass
TC-0310 正常多条 ✅ pass

2.17 Model 层 _gen.go 唯一索引方法 (TC-0311 ~ TC-0346)

TC编号 Model 方法 测试场景 测试结果
TC-0311 SysUser FindOneByUsername 正常查询 ✅ pass
TC-0312 SysUser FindOneByUsername 不存在 ✅ pass
TC-0313 SysUser FindOneByUsernameWithTx 事务内正常查询 ✅ pass
TC-0314 SysUser FindOneByUsernameWithTx 事务内不存在 ✅ pass
TC-0315 SysProduct FindOneByAppKey 正常查询 ✅ pass
TC-0316 SysProduct FindOneByAppKey 不存在 ✅ pass
TC-0317 SysProduct FindOneByAppKeyWithTx 事务内正常查询 ✅ pass
TC-0318 SysProduct FindOneByAppKeyWithTx 事务内不存在 ✅ pass
TC-0319 SysProduct FindOneByCode 正常查询 ✅ pass
TC-0320 SysProduct FindOneByCode 不存在 ✅ pass
TC-0321 SysProduct FindOneByCodeWithTx 事务内正常查询 ✅ pass
TC-0322 SysProduct FindOneByCodeWithTx 事务内不存在 ✅ pass
TC-0323 SysPerm FindOneByProductCodeCode 正常查询 ✅ pass
TC-0324 SysPerm FindOneByProductCodeCode 不存在 ✅ pass
TC-0325 SysPerm FindOneByProductCodeCodeWithTx 事务内正常查询 ✅ pass
TC-0326 SysPerm FindOneByProductCodeCodeWithTx 事务内不存在 ✅ pass
TC-0327 SysRole FindOneByProductCodeName 正常查询 ✅ pass
TC-0328 SysRole FindOneByProductCodeName 不存在 ✅ pass
TC-0329 SysRole FindOneByProductCodeNameWithTx 事务内正常查询 ✅ pass
TC-0330 SysRole FindOneByProductCodeNameWithTx 事务内不存在 ✅ pass
TC-0331 SysRolePerm FindOneByRoleIdPermId 正常查询 ✅ pass
TC-0332 SysRolePerm FindOneByRoleIdPermId 不存在 ✅ pass
TC-0333 SysRolePerm FindOneByRoleIdPermIdWithTx 事务内正常查询 ✅ pass
TC-0334 SysRolePerm FindOneByRoleIdPermIdWithTx 事务内不存在 ✅ pass
TC-0335 SysUserPerm FindOneByUserIdPermId 正常查询 ✅ pass
TC-0336 SysUserPerm FindOneByUserIdPermId 不存在 ✅ pass
TC-0337 SysUserPerm FindOneByUserIdPermIdWithTx 事务内正常查询 ✅ pass
TC-0338 SysUserPerm FindOneByUserIdPermIdWithTx 事务内不存在 ✅ pass
TC-0339 SysUserRole FindOneByUserIdRoleId 正常查询 ✅ pass
TC-0340 SysUserRole FindOneByUserIdRoleId 不存在 ✅ pass
TC-0341 SysUserRole FindOneByUserIdRoleIdWithTx 事务内正常查询 ✅ pass
TC-0342 SysUserRole FindOneByUserIdRoleIdWithTx 事务内不存在 ✅ pass
TC-0343 SysProductMember FindOneByProductCodeUserId 正常查询 ✅ pass
TC-0344 SysProductMember FindOneByProductCodeUserId 不存在 ✅ pass
TC-0345 SysProductMember FindOneByProductCodeUserIdWithTx 事务内正常查询 ✅ pass
TC-0346 SysProductMember FindOneByProductCodeUserIdWithTx 事务内不存在 ✅ pass

2.18 Model 层 _gen.go 内部辅助方法 (TC-0347 ~ TC-0356)

TC编号 测试场景 测试结果
TC-0347 空ids ✅ pass
TC-0348 正常ids ✅ pass
TC-0349 部分不存在 ✅ pass
TC-0350 DB异常 ✅ pass
TC-0351 正常 ✅ pass
TC-0352 正常 ✅ pass
TC-0353 正常 ✅ pass
TC-0354 cachePrefix为空 ✅ pass
TC-0355 cachePrefix非空 ✅ pass
TC-0356 多唯一索引前缀(SysProduct) ✅ pass

2.19 Model 层自定义方法 (TC-0357 ~ TC-0433)

TC编号 测试场景 测试结果
TC-0357 正常分页 ✅ pass
TC-0358 第二页 ✅ pass
TC-0359 空表 ✅ pass
TC-0360 count查询失败 ✅ pass
TC-0361 list查询失败 ✅ pass
TC-0362 正常查询 ✅ pass
TC-0363 空deptIds ✅ pass
TC-0364 单个deptId ✅ pass
TC-0365 deptId不存在 ✅ pass
TC-0366 正常批量查询 ✅ pass
TC-0367 空ids ✅ pass
TC-0368 部分id不存在 ✅ pass
TC-0369 DB异常 ✅ pass
TC-0370 正常分页 ✅ pass
TC-0371 空表 ✅ pass
TC-0372 count失败 ✅ pass
TC-0373 正常分页 ✅ pass
TC-0374 不存在的productCode ✅ pass
TC-0375 正常查询(仅status=1) ✅ pass
TC-0376 无启用权限 ✅ pass
TC-0377 正常查询 ✅ pass
TC-0378 空结果 ✅ pass
TC-0379 正常 ✅ pass
TC-0380 空ids ✅ pass
TC-0381 正常查询 ✅ pass
TC-0382 空结果 ✅ pass
TC-0383 key唯一性 ✅ pass
TC-0384 codes非空-正常 ✅ pass
TC-0385 codes为空-全部禁用 ✅ pass
TC-0386 无需禁用 ✅ pass
TC-0387 DB异常 ✅ pass
TC-0388 正常查询 ✅ pass
TC-0389 空表 ✅ pass
TC-0390 正常查询 ✅ pass
TC-0391 无子部门 ✅ pass
TC-0392 正常查询 ✅ pass
TC-0393 LIKE注入已阻止 ✅ pass
TC-0394 无匹配 ✅ pass
TC-0395 正常分页 ✅ pass
TC-0396 空结果 ✅ pass
TC-0397 正常 ✅ pass
TC-0398 空ids ✅ pass
TC-0399 正常查询 ✅ pass
TC-0400 无绑定 ✅ pass
TC-0401 正常查询 ✅ pass
TC-0402 空roleIds ✅ pass
TC-0403 去重验证 ✅ pass
TC-0404 正常删除 ✅ pass
TC-0405 无绑定 ✅ pass
TC-0406 正常事务内删除 ✅ pass
TC-0407 正常查询 ✅ pass
TC-0408 无记录 ✅ pass
TC-0409 ALLOW ✅ pass
TC-0410 DENY ✅ pass
TC-0411 无记录 ✅ pass
TC-0412 正常删除 ✅ pass
TC-0413 事务内删除 ✅ pass
TC-0414 正常删除 ✅ pass
TC-0415 跨产品隔离 ✅ pass
TC-0416 事务内跨产品删除 ✅ pass
TC-0417 正常查询 ✅ pass
TC-0418 无绑定 ✅ pass
TC-0419 正常查询 ✅ pass
TC-0420 正常删除 ✅ pass
TC-0421 事务内删除 ✅ pass
TC-0422 正常删除 ✅ pass
TC-0423 正常删除 ✅ pass
TC-0424 跨产品隔离 ✅ pass
TC-0425 事务内跨产品删除 ✅ pass
TC-0426 正常分页 ✅ pass
TC-0427 空结果 ✅ pass
TC-0428 正常查询 ✅ pass
TC-0429 无成员身份 ✅ pass
TC-0430 正常批量 ✅ pass
TC-0431 空userIds ✅ pass
TC-0432 部分不是成员 ✅ pass
TC-0433 map key正确 ✅ pass

2.20 访问控制 access.go (TC-0435 ~ TC-0457, TC-0523)

TC编号 测试场景 测试结果
TC-0435 RequireSuperAdmin-超管通过 ✅ pass
TC-0436 RequireSuperAdmin-ADMIN拒绝 ✅ pass
TC-0437 RequireSuperAdmin-MEMBER拒绝 ✅ pass
TC-0438 RequireSuperAdmin-未登录 ✅ pass
TC-0439 RequireProductAdmin-超管通过 ✅ pass
TC-0440 RequireProductAdmin-ADMIN通过 ✅ pass
TC-0441 RequireProductAdmin-DEVELOPER拒绝 ✅ pass
TC-0442 RequireProductAdmin-MEMBER拒绝 ✅ pass
TC-0443 RequireProductAdmin-未登录 ✅ pass
TC-0444 CheckMemberTypeAssignment-超管分配任何类型 ✅ pass
TC-0445 CheckMemberTypeAssignment-ADMIN分配DEVELOPER ✅ pass
TC-0446 CheckMemberTypeAssignment-同级拒绝 ✅ pass
TC-0447 CheckMemberTypeAssignment-越级拒绝 ✅ pass
TC-0448 CheckMemberTypeAssignment-MEMBER同级拒绝 ✅ pass
TC-0449 CheckMemberTypeAssignment-未登录 ✅ pass
TC-0450 CheckManageAccess-超管可管理任何人 ✅ pass
TC-0451 CheckManageAccess-操作自己 ✅ pass
TC-0452 CheckManageAccess-ADMIN跳过部门检查 ✅ pass
TC-0453 CheckManageAccess-无部门拒绝 ✅ pass
TC-0454 CheckManageAccess-目标用户无部门 ✅ pass
TC-0455 CheckManageAccess-不同部门拒绝 ✅ pass
TC-0456 CheckManageAccess-未登录 ✅ pass
TC-0457 memberTypePriority-全类型验证 ✅ pass
TC-0523 caller.DeptPath为空时拒绝(H-08) ✅ pass

2.21 UserDetailsLoader (TC-0458 ~ TC-0477)

TC编号 测试场景 测试结果
TC-0458 Load-DB加载(缓存miss) ✅ pass
TC-0459 Load-缓存命中 ✅ pass
TC-0460 Load-用户不存在 ✅ pass
TC-0461 Load-productCode为空 ✅ pass
TC-0462 Del删除指定缓存 ✅ pass
TC-0463 Clean清除用户所有产品缓存 ✅ pass
TC-0464 CleanByProduct清除产品所有用户 ✅ pass
TC-0465 BatchDel批量删除 ✅ pass
TC-0466 BatchDel空数组 ✅ pass
TC-0467 loadPerms-超管全量权限 ✅ pass
TC-0468 loadPerms-ADMIN全量权限 ✅ pass
TC-0469 loadPerms-DEVELOPER全量权限 ✅ pass
TC-0470 loadPerms-DEV部门全量权限 ✅ pass
TC-0471 loadPerms-MEMBER角色权限+ALLOW-DENY ✅ pass
TC-0472 loadRoles-多角色取最小permsLevel ✅ pass
TC-0473 loadRoles-无角色 ✅ pass
TC-0474 loadRoles-角色跨产品过滤 ✅ pass
TC-0475 loadRoles-禁用角色不计入 ✅ pass
TC-0476 loadMembership-超管自动SUPER_ADMIN ✅ pass
TC-0477 loadMembership-非成员MemberType为空 ✅ pass

2.22 Logic 层访问控制负面测试 (TC-0481 ~ TC-0491)

TC编号 测试场景 测试结果
TC-0481 createDept-非超管拒绝 ✅ pass
TC-0482 updateDept-非超管拒绝 ✅ pass
TC-0483 deleteDept-非超管拒绝 ✅ pass
TC-0484 createProduct-非超管拒绝 ✅ pass
TC-0485 updateProduct-非超管拒绝 ✅ pass
TC-0486 createUser-非产品管理员拒绝 ✅ pass
TC-0487 createRole-非产品管理员拒绝 ✅ pass
TC-0488 updateRole-非产品管理员拒绝 ✅ pass
TC-0489 deleteRole-非产品管理员拒绝 ✅ pass
TC-0490 bindRolePerms-非产品管理员拒绝 ✅ pass
TC-0491 updateUser-非本人非超管拒绝 ✅ pass

2.23 Model 层新增方法 (TC-0492 ~ TC-0499)

TC编号 测试场景 测试结果
TC-0492 FindMinPermsLevelByUserIdAndProductCode-正常 ✅ pass
TC-0493 FindMinPermsLevelByUserIdAndProductCode-无角色 ✅ pass
TC-0494 FindAllCodesByProductCode-正常 ✅ pass
TC-0495 FindAllCodesByProductCode-无权限 ✅ pass
TC-0496 FindIdsByDeptId-正常 ✅ pass
TC-0497 FindIdsByDeptId-空部门 ✅ pass
TC-0498 FindUserIdsByRoleId-正常 ✅ pass
TC-0499 FindUserIdsByRoleId-无绑定 ✅ pass

三、测试覆盖统计

指标 数值
TC 总数 541
已实现 540 (99.8%)
跳过 1 (TC-0189,防御性不可达分支)
未实现 0
测试函数 690
测试子用例 772
✅ 通过 771
❌ 失败 0
⏭️ 跳过 1 (TC-0189)
通过率 100% (771/771,排除不可达分支)

3.1 未实现 TC 说明

TC编号 原因
TC-0189 防御性不可达分支,claims类型断言失败场景在正常运行时无法触发,已 t.Skip

四、本次测试调整记录 (2026-04-17)

4.1 新增测试用例

TC编号 测试文件 说明
TC-0536 ~ TC-0541 ratelimitMiddleware_test.go 新增 IP 限流中间件测试,覆盖正常通过、超限拒绝(429)、IP 获取三个分支(X-Forwarded-For / X-Real-IP / RemoteAddr)、不同 IP 独立限流

4.2 测试数据修复(非源码 BUG)

以下测试因源码新增业务校验而需要完善测试数据准备,均属于测试 setup 不完整,非源码逻辑错误:

测试用例 修复内容 原因
TC-0001 (loginLogic_test.go) 新增 insertTestProductMember 源码新增产品成员校验,正常登录需先建立成员关系
TC-0009 (loginLogic_test.go) 改为断言 code=403 "您不是该产品的成员" 非成员登录现返回 403 拒绝(安全增强),test-design.md 已同步更新
TC-0166 (permserver_test.go) 新增 SysProductMember 插入 gRPC 登录同样需要成员关系
TC-0112, TC-0122, TC-0123, TC-0124 (updateUserLogic_test.go) 新增 insertTestDept 创建真实部门 源码新增部门存在性校验,DeptId>0 时必须指向真实部门
TC-0111 (createUserLogic_mock_test.go) 移除 FindOneByUsername mock 源码优化:移除预查重,改为依赖 DB 唯一约束
TC-0100 (bindRolePermsLogic_mock_test.go) 新增 SysPermModel.FindByIds mock 源码新增权限 ID 验证(存在性+产品归属)
TC-0136 (bindRolesLogic_mock_test.go) DeleteByUserIdTxDeleteByUserIdForProductTx 源码优化:按产品隔离删除用户角色绑定
TC-0488, TC-0489, TC-0490 创建真实角色后再测试权限拒绝 源码先检查角色存在性再检查权限,需用存在的角色触发 403

4.3 发现的源码 BUG

本次测试未发现源码 BUG。所有测试失败均为测试数据准备不完整导致,源码的新增校验逻辑(产品成员检查、部门存在性验证、权限 ID 验证、产品隔离删除等)均为合理的安全增强。