usr-test-gate-r3.md 8.31 KB

模块 usr — 硬测试闸证据(attempt: 3)

  • 模块: usr
  • 阶段: backend
  • attempt: 3(attempt 1 = RED,attempt 2 = RED;本轮用于辨识 flaky)
  • 分支: module-usr
  • 命令: node /Users/reporkey/Desktop/mvp/test6/scripts/test.mjs
  • 执行方式: 由本测试闸子代理派发独立 detached 子进程执行(非主会话内联跑测试),完整 stdout/stderr 落盘到独立日志 .usr-test-gate-r3.log,再据 surefire XML 取权威计数。
  • 执行时间窗口: 2026-06-01 15:32:45 ~ 15:33:02 CST(约 17 秒;测试阶段 4/5 非零退出即终止)
  • 运行 JDK: OpenJDK 25.0.2(Homebrew)—— java -version = openjdk version "25.0.2" 2026-01-20mvn -version runtime 同为 25.0.2(/opt/homebrew/Cellar/openjdk/25.0.2)。JAVA_HOME 未设置,默认走 /usr/bin/java → 25.0.2。
  • 结论: 🔴 RED(exit_code = 1,errors = 9)

① 闸门阶段执行情况

scripts/test.mjs 顺序:setup-db → build → lint → unit+integration → e2e。

阶段 命令 结果
1/5 setup test db node scripts/setup-test-db.mjs ✅ 通过(DROP+CREATE xlyweberp_vibe_erp_test @ 118.178.19.35:3318)
2/5 build mvn -q -B -DskipTests package ✅ 通过
3/5 lint mvn -q -B checkstyle:check ✅ 通过
4/5 unit + integration mvn -q -B test 🔴 失败(9 errors)
5/5 e2e echo 占位 未执行(脚本在 4/5 非零退出即终止)

Flyway 在 Spring Boot 测试启动时自动 apply(Successfully applied 1 migration ... now at version v1),与 attempt 1/2 一致。


② Surefire 汇总(据 backend/target/surefire-reports/TEST-*.xml 25 个测试类逐一聚合)

  • suites = 25
  • Tests run = 125
  • Passed = 116
  • Failures = 0
  • Errors = 9
  • Skipped = 0

备注:本次 reactor 在失败 fork 中断时 stdout 打出的 Tests run: 88, Failures: 0, Errors: 9 是 Maven 中止瞬间的局部 reactor 计数;以 surefire XML 全量聚合的 125 为权威总数(与 attempt 1/2 完全一致)。

全部 9 个 error 集中在单个测试类:com.xly.erp.modules.usr.service.UsrAuthServiceImplTest(该类 tests=9 errors=9,9/9 全 error)。其余 24 个测试类全绿,含:

  • usr 业务:UsrUserServiceImplTest(24)、UsrAuthControllerTest(6)、UsrUserControllerTest(11)、4 个 DTO 校验(3+6+5+5)、2 个 Mapper(2+3)、3 个 VO(1+1+1);
  • usr 集成测试(真实 Spring 上下文 + 真库):UsrLoginIT(12)、UsrUserQueryIT(13)、UsrUserCreateIT(5)、UsrUserUpdateIT(6)、AuthLoginConfigIT(1);
  • common 公共组件:SecurityConfigTest(2)、GlobalExceptionHandlerTest(1)、PageResultTest(2)、ResultCodeLoginTest(2)、ResultTest(2)、JwtUtilTest(1)、ErpApplicationTests(1)。

失败用例清单(9 条,均为 ERROR;据该类 XML testcase name

com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.rateLimitAfterMaxFailThrows42901
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.illegalCompanyIdThrows40001
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.userNotFoundThrows40101
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.disabledUserThrows40302AfterPasswordOk
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.wrongPasswordThrows40101
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.listCompaniesMapsAllRows
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.notFoundAndWrongPasswordSameCodeAndMessage
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.successReturnsTokenAndUpdatesLoginTime
com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.successResetsFailCounter

③ 根因(toolchain 不兼容,非业务逻辑缺陷)—— 与 attempt 1/2 完全同源

所有 9 个 error 同源,均在 @BeforeEach setUpUsrAuthServiceImplTest.java:54)用 Mockito mock JwtUtil 时抛出:

org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class com.xly.erp.common.security.JwtUtil.
...
Caused by: java.lang.IllegalStateException:
  Byte Buddy could not instrument all classes within the mock's type hierarchy
Caused by: java.lang.IllegalArgumentException: Java 25 (69) is not supported by the
  current version of Byte Buddy which officially supports Java 22 (66) -
  update Byte Buddy or set net.bytebuddy.experimental as a VM property
  at net.bytebuddy.utility.OpenedClassReader.of(OpenedClassReader.java:100)
  ...
  at com.xly.erp.modules.usr.service.UsrAuthServiceImplTest.setUp(UsrAuthServiceImplTest.java:54)

环境取证:

  • 运行 JDK:openjdk version "25.0.2",vendor Homebrew,JVM OpenJDK 64-Bit Server VM 25.0.2(class file major 69)。
  • 随 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 失败。

即:这是构建工具链(JDK 版本 × Mockito/Byte Buddy 兼容性)问题,非 usr 模块业务代码或测试断言缺陷。不依赖 Mockito inline mock 的集成测试(真实 Spring 上下文 + 真库:UsrLoginIT/UsrUserQueryIT/UsrUserCreateIT/UsrUserUpdateIT/AuthLoginConfigIT)以及不 mock JwtUtil 的纯单元测试全部通过,佐证业务逻辑路径是通的。

本测试闸不改源码 / 不改构建工具链(超出 gate 作用域,属上层仲裁/remediation 决策)。建议修复方向(供上层 retry/仲裁,三选一):

  1. 降低构建 JDK 至 LTS 21(最稳;本机已装 openjdk@21 21.0.11,可经 JAVA_HOME=$(/usr/libexec/java_home -v 21) 或 Maven toolchains 切换);或
  2. 升级 Byte Buddy / Mockito 至支持 Java 25 的版本(pom 显式提升 byte-buddy + byte-buddy-agent,或升 mockito-core);或
  3. 临时绕过:Surefire 加 -Dnet.bytebuddy.experimental=true(仅解燃眉,不推荐长期)。

④ 关键输出摘录(stdout,≤ 30 行)

[test.mjs] 1/5 setup test db
[setup-test-db] done — schema will be applied by Flyway when Spring Boot starts
[test.mjs] 2/5 build        (mvn -q -B -DskipTests package) ✅
[test.mjs] 3/5 lint         (mvn -q -B checkstyle:check)    ✅
[test.mjs] 4/5 unit + integration  (mvn -q -B test)
Flyway: Successfully applied 1 migration ... now at version v1
[ERROR] Tests run: 9, Failures: 0, Errors: 9, Skipped: 0 -- in UsrAuthServiceImplTest
[ERROR] UsrAuthServiceImplTest.setUp:54 Mockito
Mockito cannot mock this class: class com.xly.erp.common.security.JwtUtil.
Java               : 25
JVM vendor version : 25.0.2
Caused by: java.lang.IllegalArgumentException: Java 25 (69) is not supported by the
  current version of Byte Buddy which officially supports Java 22 (66) -
  update Byte Buddy or set net.bytebuddy.experimental as a VM property
[ERROR] Tests run: 88, Failures: 0, Errors: 9, Skipped: 0   (reactor 中止瞬间局部计数)
[ERROR] Failed to execute goal ...maven-surefire-plugin:3.1.2:test (default-test) on project erp-backend
[test.mjs] FAIL (backend test) exit=1
===EXIT_CODE=1 END 2026-06-01 15:33:02 CST===

⑤ flake 识别参考(attempt 1 vs 2 vs 3 三轮对比)

维度 attempt 1 (r1) attempt 2 (r2) attempt 3 (r3)
结论 🔴 RED, exit=1 🔴 RED, exit=1 🔴 RED, exit=1
Tests run(XML 聚合) 125 125 125
Errors 9 9 9
Failures 0 0 0
失败类 UsrAuthServiceImplTest(9/9) UsrAuthServiceImplTest(9/9) UsrAuthServiceImplTest(9/9)
失败用例集合 同下 9 条 完全相同 9 条 完全相同 9 条
失败位置 setUp:54 setUp:54 setUp:54
根因 JDK25 / Byte Buddy 不支持 (69>66) 同一根因,逐字一致
运行 JDK 25.0.2 25.0.2 25.0.2

判定:非 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 本身不放行。

每个 attempt 独立成文:本文件 usr-test-gate-r3.md 不覆盖 usr-test-gate-r1.md / usr-test-gate-r2.md