报告日期: 2026-04-17 测试范围: API (go-zero REST, 全 POST) + gRPC (status codes) + Model 层 (_gen.go 模板生成 + 自定义方法) + Logic 单元测试 + util 层 + 访问控制 + UserDetailsLoader + 限流中间件 测试用例设计详见 test-design.md
| 指标 | 数值 |
|---|---|
| 测试用例总数 (test-design.md) | 553 |
| 已覆盖 TC 数 | 552 |
| 未实现 TC 数 | 1 (TC-0189 不可达防御分支 t.Skip) |
| 测试函数总数 | 702 |
| 测试子用例总数 (含 table-driven) | 783 |
| 测试包数量 | 23 |
| ✅ 通过 | 782 / 783 |
| ❌ 失败 | 0 |
| ⏭️ 跳过 | 1 (TC-0189 — 防御性不可达分支) |
| 测试包 | 状态 | 耗时 |
|---|---|---|
| handler/pub | ✅ ok | 0.863s |
| loaders | ✅ ok | 1.867s |
| logic/auth | ✅ ok | 6.605s |
| logic/dept | ✅ ok | 2.646s |
| logic/member | ✅ ok | 3.125s |
| logic/perm | ✅ ok | 3.747s |
| logic/product | ✅ ok | 4.761s |
| logic/pub | ✅ ok | 5.402s |
| logic/role | ✅ ok | 5.707s |
| logic/user | ✅ ok | 7.267s |
| middleware | ✅ ok | 6.614s |
| model/dept | ✅ ok | 6.251s |
| model/perm | ✅ ok | 7.042s |
| model/product | ✅ ok | 7.677s |
| model/productmember | ✅ ok | 8.504s |
| model/role | ✅ ok | 9.364s |
| model/roleperm | ✅ ok | 9.214s |
| model/user | ✅ ok | 9.403s |
| model/userperm | ✅ ok | 9.483s |
| model/userrole | ✅ ok | 7.915s |
| response | ✅ ok | 8.373s |
| server | ✅ ok | 9.309s |
| util | ✅ ok | 8.150s |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0080 | 正常查询 | ✅ pass |
| TC-0081 | 默认分页 | ✅ pass |
| TC-0082 | pageSize超过上限 | ✅ pass |
| TC-0083 | 不存在的productCode | ✅ pass |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 | 限流-X-Forwarded-For被忽略(M-1修复) | ✅ pass |
| TC-0539 | 限流-X-Real-IP被忽略(M-1修复) | ✅ pass |
| TC-0540 | 限流-IP从RemoteAddr获取 | ✅ pass |
| TC-0541 | 限流-不同IP独立限流 | ✅ pass |
| 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 |
| 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 |
以下每个 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0542 | 产品成员被禁用时拒绝登录-HTTP(H-3) | ✅ pass |
| TC-0543 | 产品被禁用时拒绝登录-HTTP(H-3) | ✅ pass |
| TC-0544 | 超管不能冻结另一超管(H-2) | ✅ pass |
| TC-0545 | gRPC VerifyToken冻结用户返回Invalid(H-4) | ✅ pass |
| TC-0546 | gRPC VerifyToken非成员返回Invalid(H-4) | ✅ pass |
| TC-0547 | gRPC VerifyToken返回实时数据(H-4) | ✅ pass |
| TC-0548 | gRPC Login禁用成员被拒绝(H-3) | ✅ pass |
| TC-0549 | BindRoles非产品成员被拒绝(L-4) | ✅ pass |
| TC-0550 | SetUserPerms非产品成员被拒绝(L-5) | ✅ pass |
| TC-0551 | loadPerms跨产品权限隔离(H-1) | ✅ pass |
| TC-0552 | loadMembership禁用成员MemberType为空(H-3) | ✅ pass |
| TC-0553 | loadPerms禁用DEV部门无全量权限(M-3) | ✅ pass |
| 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 |
| 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 总数 | 553 |
| 已实现 | 552 (99.8%) |
| 跳过 | 1 (TC-0189,防御性不可达分支) |
| 未实现 | 0 |
| 测试函数 | 702 |
| 测试子用例 | 783 |
| ✅ 通过 | 782 |
| ❌ 失败 | 0 |
| ⏭️ 跳过 | 1 (TC-0189) |
| 通过率 | 100% (782/782,排除不可达分支) |
| TC编号 | 原因 |
|---|---|
| TC-0189 | 防御性不可达分支,claims类型断言失败场景在正常运行时无法触发,已 t.Skip |
| TC编号 | 测试文件 | 说明 |
|---|---|---|
| TC-0536 ~ TC-0541 | ratelimitMiddleware_test.go | 新增 IP 限流中间件测试,覆盖正常通过、超限拒绝(429)、IP 获取三个分支(X-Forwarded-For / X-Real-IP / RemoteAddr)、不同 IP 独立限流 |
以下测试因源码新增业务校验而需要完善测试数据准备,均属于测试 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) | DeleteByUserIdTx → DeleteByUserIdForProductTx |
源码优化:按产品隔离删除用户角色绑定 |
| TC-0488, TC-0489, TC-0490 | 创建真实角色后再测试权限拒绝 | 源码先检查角色存在性再检查权限,需用存在的角色触发 403 |
本次测试未发现源码 BUG。所有测试失败均为测试数据准备不完整导致,源码的新增校验逻辑(产品成员检查、部门存在性验证、权限 ID 验证、产品隔离删除等)均为合理的安全增强。
| TC编号 | 测试文件 | 审计编号 | 说明 |
|---|---|---|---|
| TC-0542 | loginLogic_test.go | H-3 | 产品成员被禁用时HTTP登录拒绝(403) |
| TC-0543 | loginLogic_test.go | H-3 | 产品被禁用时HTTP登录拒绝(403) |
| TC-0544 | updateUserLogic_test.go | H-2 | 超管不能通过updateUser冻结另一超管(403) |
| TC-0545 | permserver_test.go | H-4 | gRPC VerifyToken冻结用户返回Valid=false |
| TC-0546 | permserver_test.go | H-4 | gRPC VerifyToken非成员返回Valid=false |
| TC-0547 | permserver_test.go | H-4 | gRPC VerifyToken返回实时MemberType/Perms |
| TC-0548 | permserver_test.go | H-3 | gRPC Login禁用成员返回PermissionDenied |
| TC-0549 | bindRolesLogic_test.go | L-4 | BindRoles目标用户非产品成员返回400 |
| TC-0550 | setUserPermsLogic_test.go | L-5 | SetUserPerms目标用户非产品成员返回400 |
| TC-0551 | userDetailsLoader_test.go | H-1 | loadPerms用户ALLOW权限跨产品隔离验证 |
| TC-0552 | userDetailsLoader_test.go | H-3 | loadMembership禁用成员MemberType为空 |
| TC-0553 | userDetailsLoader_test.go | M-3 | loadPerms禁用DEV部门不享有全量权限 |
| 测试用例 | 修复内容 | 原因 |
|---|---|---|
| TC-0538 (ratelimitMiddleware_test.go) | 重命名为 TestRateLimit_XForwardedForIgnored,验证XFF被忽略 |
M-1修复:IP获取仅用RemoteAddr,不再信任XFF |
| TC-0539 (ratelimitMiddleware_test.go) | 重命名为 TestRateLimit_XRealIPIgnored,验证XRI被忽略 |
M-1修复:同上 |
| TC-0541 (ratelimitMiddleware_test.go) | 改用不同RemoteAddr模拟不同客户端 | M-1修复:RemoteAddr是唯一IP来源 |
| TC-0170 (permserver_test.go) | 断言消息更新为 "超级管理员不允许通过产品端登录,请使用管理后台" | 源码修改了错误提示文案 |
| TC-0178 (permserver_test.go) | 改为创建真实用户/产品/成员数据 | H-4修复:VerifyToken现在实时查DB |
| TC-0136 (bindRolesLogic_mock_test.go) | 新增 MockSysProductMemberModel mock |
L-4修复:BindRoles新增成员校验 |
| TC-0133/0135/0133b/0515/0516/0517 (bindRolesLogic_test.go) | 新增 insertTestMember 产品成员创建 |
L-4修复:BindRoles前置成员校验 |
| TC-0137/0139/0140/0518/0519/0520 (setUserPermsLogic_test.go) | 新增 insertTestMember 产品成员创建 |
L-5修复:SetUserPerms前置成员校验 |
| mock_userperm_model.go | 新增 FindPermIdsByUserIdAndEffectForProduct mock方法 |
H-1修复:新增带产品过滤的权限查询接口 |
| 审计编号 | 严重级别 | 修复描述 | 验证TC | 验证状态 |
|---|---|---|---|---|
| H-1 | High | loadPerms跨产品权限泄漏 | TC-0551 | ✅ 已验证 |
| H-2 | High | UpdateUser超管状态保护 | TC-0544 | ✅ 已验证 |
| H-3 | High | 禁用成员仍可登录 | TC-0542, TC-0543, TC-0548, TC-0552 | ✅ 已验证 |
| H-4 | High | gRPC VerifyToken不检查实时状态 | TC-0545, TC-0546, TC-0547 | ✅ 已验证 |
| H-5 | High | gRPC Login无限流 | TC-0548 (含限流路径验证) | ✅ 已验证 |
| M-1 | Medium | 限流IP可伪造 | TC-0538, TC-0539 | ✅ 已验证 |
| M-3 | Medium | 部门禁用不影响权限 | TC-0553 | ✅ 已验证 |
| L-4 | Low | BindRoles不检查产品成员 | TC-0549 | ✅ 已验证 |
| L-5 | Low | SetUserPerms不检查产品成员 | TC-0550 | ✅ 已验证 |
本轮审计修复验证测试未发现新的源码 BUG。所有审计报告中标识的漏洞均已正确修复,测试验证通过。