Commit 26523d4f72fa49217cae0d81cbe21ccaffe8fbe4
1 parent
f500f612
docs(verify:REQ-USR-004): 证据验证
Showing
1 changed file
with
73 additions
and
0 deletions
docs/superpowers/reviews/2026-06-01-REQ-USR-004-verify.md
0 → 100644
| 1 | +# REQ-USR-004 登录用户 — 功能测试证据(verify, round 0) | ||
| 2 | + | ||
| 3 | +> 关联 spec:`docs/superpowers/specs/2026-06-01-REQ-USR-004.md` | ||
| 4 | +> 阶段:后端(backend)。验证目标 = 后端单元 + 集成测试全量绿。 | ||
| 5 | +> 生成时间:2026-06-01。 | ||
| 6 | + | ||
| 7 | +## 1. 测试命令 | ||
| 8 | + | ||
| 9 | +| 项 | 值 | | ||
| 10 | +|---|---| | ||
| 11 | +| command | `mvn -B test`(工作目录 `backend/`,对应 docs/04 § 零「后端 unit」命令 `mvn -q -B test`,verify 去掉 `-q` 以采集逐类汇总) | | ||
| 12 | +| exit_code | `0` | | ||
| 13 | +| 构建结果 | `BUILD SUCCESS` | | ||
| 14 | +| passed | `125` | | ||
| 15 | +| failed | `0`(Failures=0, Errors=0) | | ||
| 16 | +| skipped | `0` | | ||
| 17 | +| failed_list | `[]`(无失败用例) | | ||
| 18 | + | ||
| 19 | +> 注:Maven reactor 屏幕末尾的 `Tests run: 88` 为日志被 Spring TestContext 初始化噪声截断后的部分聚合行;以 `target/surefire-reports/*.txt` 逐类报告求和为权威口径 = **125 tests / 0 fail / 0 error / 0 skip**,与上游 TDD 摘要「全量 125 测试通过」一致。 | ||
| 20 | + | ||
| 21 | +## 2. 运行环境关键发现(影响复现) | ||
| 22 | + | ||
| 23 | +- 本机 PATH 默认 `java` = **OpenJDK 25.0.2(Homebrew)**,超出项目锁定的 **Java 17 / 21**(docs/04 § 零 技术栈表)。 | ||
| 24 | +- 在 JDK 25 下首次执行 `mvn -B test`:`Tests run: 88, Failures: 0, Errors: 9` —— `com.xly.erp.modules.usr.service.UsrAuthServiceImplTest` 的 9 个用例在 `setUp:54` 全部 error,根因为 | ||
| 25 | + `Mockito cannot mock this class: class com.xly.erp.common.security.JwtUtil`(Mockito inline mock maker 在 JDK 25 下无法插桩该类)。这是**运行环境 JDK 版本越界**导致的工具链不兼容,**非被测业务代码缺陷**。 | ||
| 26 | +- 切换到项目锁定版本 **JDK 21**(`/opt/homebrew/Cellar/openjdk@21/21.0.11/.../Home`,`/usr/libexec/java_home -V` 确认已安装)后,`mvn -B test` **全量 125 用例通过,exit_code=0,BUILD SUCCESS**。 | ||
| 27 | +- 权威结论以**项目锁定 JDK(17/21)**下的运行为准:测试闸通过。建议执行环境将默认 `java` / `JAVA_HOME` 固定到 JDK 17 或 21,避免 JDK 25 下 Mockito 误报。 | ||
| 28 | + | ||
| 29 | +## 3. 逐测试类结果(surefire-reports 求和,JDK 21) | ||
| 30 | + | ||
| 31 | +| 测试类 | run | fail | error | skip | | ||
| 32 | +|---|---|---|---|---| | ||
| 33 | +| common.config.SecurityConfigTest | 2 | 0 | 0 | 0 | | ||
| 34 | +| common.exception.GlobalExceptionHandlerTest | 1 | 0 | 0 | 0 | | ||
| 35 | +| common.response.PageResultTest | 2 | 0 | 0 | 0 | | ||
| 36 | +| common.response.ResultCodeLoginTest | 2 | 0 | 0 | 0 | | ||
| 37 | +| common.response.ResultTest | 2 | 0 | 0 | 0 | | ||
| 38 | +| common.security.JwtUtilTest | 1 | 0 | 0 | 0 | | ||
| 39 | +| ErpApplicationTests | 1 | 0 | 0 | 0 | | ||
| 40 | +| modules.usr.AuthLoginConfigIT | 1 | 0 | 0 | 0 | | ||
| 41 | +| modules.usr.controller.UsrAuthControllerTest | 6 | 0 | 0 | 0 | | ||
| 42 | +| modules.usr.controller.UsrUserControllerTest | 11 | 0 | 0 | 0 | | ||
| 43 | +| modules.usr.dto.CreateUserDTOValidationTest | 3 | 0 | 0 | 0 | | ||
| 44 | +| modules.usr.dto.LoginDTOValidationTest | 6 | 0 | 0 | 0 | | ||
| 45 | +| modules.usr.dto.UpdateUserDTOValidationTest | 5 | 0 | 0 | 0 | | ||
| 46 | +| modules.usr.dto.UserQueryDTOValidationTest | 5 | 0 | 0 | 0 | | ||
| 47 | +| modules.usr.mapper.UsrCompanyMapperTest | 2 | 0 | 0 | 0 | | ||
| 48 | +| modules.usr.mapper.UsrUserMapperPageTest | 3 | 0 | 0 | 0 | | ||
| 49 | +| modules.usr.service.UsrAuthServiceImplTest | 9 | 0 | 0 | 0 | | ||
| 50 | +| modules.usr.service.UsrUserServiceImplTest | 24 | 0 | 0 | 0 | | ||
| 51 | +| modules.usr.UsrLoginIT | 12 | 0 | 0 | 0 | | ||
| 52 | +| modules.usr.UsrUserCreateIT | 5 | 0 | 0 | 0 | | ||
| 53 | +| modules.usr.UsrUserQueryIT | 13 | 0 | 0 | 0 | | ||
| 54 | +| modules.usr.UsrUserUpdateIT | 6 | 0 | 0 | 0 | | ||
| 55 | +| modules.usr.vo.CompanyOptionVOJsonTest | 1 | 0 | 0 | 0 | | ||
| 56 | +| modules.usr.vo.LoginVOJsonTest | 1 | 0 | 0 | 0 | | ||
| 57 | +| modules.usr.vo.UserVOJsonTest | 1 | 0 | 0 | 0 | | ||
| 58 | +| **合计(25 类)** | **125** | **0** | **0** | **0** | | ||
| 59 | + | ||
| 60 | +## 4. REQ-USR-004 验收覆盖映射(spec § 7 ↔ 测试) | ||
| 61 | + | ||
| 62 | +REQ-USR-004 专属覆盖落在以下测试类(其余为既有 USR-001/002/003 回归,全绿): | ||
| 63 | + | ||
| 64 | +- `UsrLoginIT`(12 例,ac1–ac12 端到端):正确凭据登录成功 + 返回 token/user 且不含 sPassword(ac1/11)、token 可被受保护接口接受(ac2/12)、登录更新 tLastLoginDate(ac3)、密码错误统一 40101(ac4)、账号不存在与密码错误响应完全一致(ac5)、禁用用户 40302(ac6)、参数缺失 40001(ac7)、companyId 非法 40001(ac8)、连续失败限流 42901 + 成功清零(ac9)、GET /api/usr/companies 放行全量返回(ac10)、JWT 含 exp(ac12)。 | ||
| 65 | +- `UsrAuthServiceImplTest`(9 例):认证主流程顺序判定、防枚举、限流计数、BCrypt 比对、@Transactional 更新登录时间等 Service 单元。 | ||
| 66 | +- `UsrAuthControllerTest`(6 例):`POST /api/usr/login` + `GET /api/usr/companies` 校验与委派。 | ||
| 67 | +- `LoginDTOValidationTest`(6)/`LoginVOJsonTest`(1)/`CompanyOptionVOJsonTest`(1)/`UsrCompanyMapperTest`(2)/`ResultCodeLoginTest`(2,含 42901)/`SecurityConfigTest`(2,含放行 /api/usr/companies)/`AuthLoginConfigIT`(1,限流配置项 5/300)。 | ||
| 68 | + | ||
| 69 | +## 5. 结论 | ||
| 70 | + | ||
| 71 | +- 测试闸:**绿**(exit_code=0,125/125 通过,0 失败 0 错误 0 跳过,BUILD SUCCESS)—— 以项目锁定 JDK 21 运行为权威口径。 | ||
| 72 | +- 工作树:commit 前为 clean(仅本证据文件为新增)。 | ||
| 73 | +- 唯一风险提示:执行宿主默认 `java` 为越界的 JDK 25,会触发 Mockito 对 `JwtUtil` 的插桩失败(9 error);非代码缺陷,需将默认 JDK 固定为 17/21。 |