Commit 8928dfb1185be3c9d3f4ef676d50676892f7f447
1 parent
eb1a03fc
chore(usr): record test-gate attempt 3 red evidence (REQ-USR test gate r3)
Showing
1 changed file
with
135 additions
and
0 deletions
docs/superpowers/module-reports/usr-test-gate-r3.md
0 → 100644
| 1 | +# 模块 usr — 硬测试闸证据(attempt: 3) | ||
| 2 | + | ||
| 3 | +- **模块**: usr | ||
| 4 | +- **阶段**: backend | ||
| 5 | +- **attempt**: 3(attempt 1 = RED,attempt 2 = RED;本轮用于辨识 flaky) | ||
| 6 | +- **分支**: module-usr | ||
| 7 | +- **命令**: `node /Users/reporkey/Desktop/mvp/test6/scripts/test.mjs` | ||
| 8 | +- **执行方式**: 由本测试闸子代理**派发独立 detached 子进程**执行(非主会话内联跑测试),完整 stdout/stderr 落盘到独立日志 `.usr-test-gate-r3.log`,再据 surefire XML 取权威计数。 | ||
| 9 | +- **执行时间窗口**: 2026-06-01 15:32:45 ~ 15:33:02 CST(约 17 秒;测试阶段 4/5 非零退出即终止) | ||
| 10 | +- **运行 JDK**: OpenJDK 25.0.2(Homebrew)—— `java -version` = `openjdk version "25.0.2" 2026-01-20`;`mvn -version` runtime 同为 25.0.2(`/opt/homebrew/Cellar/openjdk/25.0.2`)。`JAVA_HOME` 未设置,默认走 `/usr/bin/java` → 25.0.2。 | ||
| 11 | +- **结论**: 🔴 RED(exit_code = 1,errors = 9) | ||
| 12 | + | ||
| 13 | +--- | ||
| 14 | + | ||
| 15 | +## ① 闸门阶段执行情况 | ||
| 16 | + | ||
| 17 | +`scripts/test.mjs` 顺序:setup-db → build → lint → unit+integration → e2e。 | ||
| 18 | + | ||
| 19 | +| 阶段 | 命令 | 结果 | | ||
| 20 | +|------|------|------| | ||
| 21 | +| 1/5 setup test db | `node scripts/setup-test-db.mjs` | ✅ 通过(DROP+CREATE `xlyweberp_vibe_erp_test` @ 118.178.19.35:3318) | | ||
| 22 | +| 2/5 build | `mvn -q -B -DskipTests package` | ✅ 通过 | | ||
| 23 | +| 3/5 lint | `mvn -q -B checkstyle:check` | ✅ 通过 | | ||
| 24 | +| 4/5 unit + integration | `mvn -q -B test` | 🔴 失败(9 errors) | | ||
| 25 | +| 5/5 e2e | echo 占位 | 未执行(脚本在 4/5 非零退出即终止) | | ||
| 26 | + | ||
| 27 | +Flyway 在 Spring Boot 测试启动时自动 apply(`Successfully applied 1 migration ... now at version v1`),与 attempt 1/2 一致。 | ||
| 28 | + | ||
| 29 | +--- | ||
| 30 | + | ||
| 31 | +## ② Surefire 汇总(据 `backend/target/surefire-reports/TEST-*.xml` 25 个测试类逐一聚合) | ||
| 32 | + | ||
| 33 | +- **suites = 25** | ||
| 34 | +- **Tests run = 125** | ||
| 35 | +- **Passed = 116** | ||
| 36 | +- **Failures = 0** | ||
| 37 | +- **Errors = 9** | ||
| 38 | +- **Skipped = 0** | ||
| 39 | + | ||
| 40 | +> 备注:本次 reactor 在失败 fork 中断时 stdout 打出的 `Tests run: 88, Failures: 0, Errors: 9` 是 Maven 中止瞬间的**局部 reactor 计数**;以 surefire XML 全量聚合的 **125** 为权威总数(与 attempt 1/2 完全一致)。 | ||
| 41 | + | ||
| 42 | +全部 9 个 error 集中在单个测试类:`com.xly.erp.modules.usr.service.UsrAuthServiceImplTest`(该类 `tests=9 errors=9`,9/9 全 error)。其余 24 个测试类全绿,含: | ||
| 43 | +- usr 业务:`UsrUserServiceImplTest`(24)、`UsrAuthControllerTest`(6)、`UsrUserControllerTest`(11)、4 个 DTO 校验(3+6+5+5)、2 个 Mapper(2+3)、3 个 VO(1+1+1); | ||
| 44 | +- usr 集成测试(真实 Spring 上下文 + 真库):`UsrLoginIT`(12)、`UsrUserQueryIT`(13)、`UsrUserCreateIT`(5)、`UsrUserUpdateIT`(6)、`AuthLoginConfigIT`(1); | ||
| 45 | +- common 公共组件:`SecurityConfigTest`(2)、`GlobalExceptionHandlerTest`(1)、`PageResultTest`(2)、`ResultCodeLoginTest`(2)、`ResultTest`(2)、`JwtUtilTest`(1)、`ErpApplicationTests`(1)。 | ||
| 46 | + | ||
| 47 | +### 失败用例清单(9 条,均为 ERROR;据该类 XML `testcase name`) | ||
| 48 | + | ||
| 49 | +``` | ||
| 50 | +com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.rateLimitAfterMaxFailThrows42901 | ||
| 51 | +com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.illegalCompanyIdThrows40001 | ||
| 52 | +com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.userNotFoundThrows40101 | ||
| 53 | +com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.disabledUserThrows40302AfterPasswordOk | ||
| 54 | +com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.wrongPasswordThrows40101 | ||
| 55 | +com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.listCompaniesMapsAllRows | ||
| 56 | +com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.notFoundAndWrongPasswordSameCodeAndMessage | ||
| 57 | +com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.successReturnsTokenAndUpdatesLoginTime | ||
| 58 | +com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.successResetsFailCounter | ||
| 59 | +``` | ||
| 60 | + | ||
| 61 | +--- | ||
| 62 | + | ||
| 63 | +## ③ 根因(toolchain 不兼容,非业务逻辑缺陷)—— 与 attempt 1/2 完全同源 | ||
| 64 | + | ||
| 65 | +所有 9 个 error 同源,均在 `@BeforeEach setUp`(`UsrAuthServiceImplTest.java:54`)用 Mockito mock `JwtUtil` 时抛出: | ||
| 66 | + | ||
| 67 | +``` | ||
| 68 | +org.mockito.exceptions.base.MockitoException: | ||
| 69 | +Mockito cannot mock this class: class com.xly.erp.common.security.JwtUtil. | ||
| 70 | +... | ||
| 71 | +Caused by: java.lang.IllegalStateException: | ||
| 72 | + Byte Buddy could not instrument all classes within the mock's type hierarchy | ||
| 73 | +Caused by: java.lang.IllegalArgumentException: Java 25 (69) is not supported by the | ||
| 74 | + current version of Byte Buddy which officially supports Java 22 (66) - | ||
| 75 | + update Byte Buddy or set net.bytebuddy.experimental as a VM property | ||
| 76 | + at net.bytebuddy.utility.OpenedClassReader.of(OpenedClassReader.java:100) | ||
| 77 | + ... | ||
| 78 | + at com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.setUp(UsrAuthServiceImplTest.java:54) | ||
| 79 | +``` | ||
| 80 | + | ||
| 81 | +环境取证: | ||
| 82 | +- 运行 JDK:`openjdk version "25.0.2"`,vendor `Homebrew`,JVM `OpenJDK 64-Bit Server VM 25.0.2`(class file major 69)。 | ||
| 83 | +- 随 Spring Boot 3.2.5 BOM 引入的 Byte Buddy(`byte-buddy-agent 1.14.13`)官方仅支持到 Java 22(major 66),无法 instrument Java 25 字节码,inline mock maker 创建 `JwtUtil` mock 失败。 | ||
| 84 | + | ||
| 85 | +即:这是**构建工具链(JDK 版本 × Mockito/Byte Buddy 兼容性)问题**,非 usr 模块业务代码或测试断言缺陷。不依赖 Mockito inline mock 的集成测试(真实 Spring 上下文 + 真库:`UsrLoginIT`/`UsrUserQueryIT`/`UsrUserCreateIT`/`UsrUserUpdateIT`/`AuthLoginConfigIT`)以及不 mock `JwtUtil` 的纯单元测试全部通过,佐证业务逻辑路径是通的。 | ||
| 86 | + | ||
| 87 | +> 本测试闸不改源码 / 不改构建工具链(超出 gate 作用域,属上层仲裁/remediation 决策)。建议修复方向(供上层 retry/仲裁,三选一): | ||
| 88 | +> 1. **降低构建 JDK 至 LTS 21**(最稳;本机已装 `openjdk@21 21.0.11`,可经 `JAVA_HOME=$(/usr/libexec/java_home -v 21)` 或 Maven toolchains 切换);或 | ||
| 89 | +> 2. **升级 Byte Buddy / Mockito 至支持 Java 25 的版本**(pom 显式提升 `byte-buddy` + `byte-buddy-agent`,或升 `mockito-core`);或 | ||
| 90 | +> 3. **临时绕过**:Surefire 加 `-Dnet.bytebuddy.experimental=true`(仅解燃眉,不推荐长期)。 | ||
| 91 | + | ||
| 92 | +--- | ||
| 93 | + | ||
| 94 | +## ④ 关键输出摘录(stdout,≤ 30 行) | ||
| 95 | + | ||
| 96 | +``` | ||
| 97 | +[test.mjs] 1/5 setup test db | ||
| 98 | +[setup-test-db] done — schema will be applied by Flyway when Spring Boot starts | ||
| 99 | +[test.mjs] 2/5 build (mvn -q -B -DskipTests package) ✅ | ||
| 100 | +[test.mjs] 3/5 lint (mvn -q -B checkstyle:check) ✅ | ||
| 101 | +[test.mjs] 4/5 unit + integration (mvn -q -B test) | ||
| 102 | +Flyway: Successfully applied 1 migration ... now at version v1 | ||
| 103 | +[ERROR] Tests run: 9, Failures: 0, Errors: 9, Skipped: 0 -- in UsrAuthServiceImplTest | ||
| 104 | +[ERROR] UsrAuthServiceImplTest.setUp:54 Mockito | ||
| 105 | +Mockito cannot mock this class: class com.xly.erp.common.security.JwtUtil. | ||
| 106 | +Java : 25 | ||
| 107 | +JVM vendor version : 25.0.2 | ||
| 108 | +Caused by: java.lang.IllegalArgumentException: Java 25 (69) is not supported by the | ||
| 109 | + current version of Byte Buddy which officially supports Java 22 (66) - | ||
| 110 | + update Byte Buddy or set net.bytebuddy.experimental as a VM property | ||
| 111 | +[ERROR] Tests run: 88, Failures: 0, Errors: 9, Skipped: 0 (reactor 中止瞬间局部计数) | ||
| 112 | +[ERROR] Failed to execute goal ...maven-surefire-plugin:3.1.2:test (default-test) on project erp-backend | ||
| 113 | +[test.mjs] FAIL (backend test) exit=1 | ||
| 114 | +===EXIT_CODE=1 END 2026-06-01 15:33:02 CST=== | ||
| 115 | +``` | ||
| 116 | + | ||
| 117 | +--- | ||
| 118 | + | ||
| 119 | +## ⑤ flake 识别参考(attempt 1 vs 2 vs 3 三轮对比) | ||
| 120 | + | ||
| 121 | +| 维度 | attempt 1 (r1) | attempt 2 (r2) | attempt 3 (r3) | | ||
| 122 | +|------|----------------|----------------|----------------| | ||
| 123 | +| 结论 | 🔴 RED, exit=1 | 🔴 RED, exit=1 | 🔴 RED, exit=1 | | ||
| 124 | +| Tests run(XML 聚合) | 125 | 125 | 125 | | ||
| 125 | +| Errors | 9 | 9 | 9 | | ||
| 126 | +| Failures | 0 | 0 | 0 | | ||
| 127 | +| 失败类 | `UsrAuthServiceImplTest`(9/9) | `UsrAuthServiceImplTest`(9/9) | `UsrAuthServiceImplTest`(9/9) | | ||
| 128 | +| 失败用例集合 | 同下 9 条 | 完全相同 9 条 | **完全相同 9 条** | | ||
| 129 | +| 失败位置 | `setUp:54` | `setUp:54` | `setUp:54` | | ||
| 130 | +| 根因 | JDK25 / Byte Buddy 不支持 (69>66) | 同 | **同一根因,逐字一致** | | ||
| 131 | +| 运行 JDK | 25.0.2 | 25.0.2 | 25.0.2 | | ||
| 132 | + | ||
| 133 | +**判定:非 flake(确定性失败)。** 连续三轮 attempt 结果 100% 一致——相同 9 条用例、同一 `UsrAuthServiceImplTest.setUp:54`、同一 `Byte Buddy ... Java 25 (69) is not supported` 异常链,与时序 / 网络 / 数据 / 并发顺序无关。属构建工具链版本不兼容(JDK 25 × Byte Buddy 1.14.13 ≤ Java 22),需上层按 ③ 修复构建工具链后再 retry,gate 本身不放行。 | ||
| 134 | + | ||
| 135 | +> 每个 attempt 独立成文:本文件 `usr-test-gate-r3.md` 不覆盖 `usr-test-gate-r1.md` / `usr-test-gate-r2.md`。 |