测试 Spec — 租户切换用户会话循环修复
status: complete
created: 2026-08-04
0. 测试原则
- 复用仓库 JUnit 5、Mockito 和 Vitest 基线,不启动真实服务或数据库。
- 先跑聚焦测试,再执行相关编译和前端构建。
- 记录实际命令、结果、警告及跳过项,不把未执行的浏览器冒烟表述为通过。
1. P0 核心场景
| 场景 |
输入 |
预期 |
| 跨租户刷新用户 |
Session 用户 userId=1、当前租户为目标租户 |
调用 loadUserByUserId(1, targetTenantId, activeOrgId),不按用户名查询 |
| 刷新会话元数据 |
新构建 LoginUser |
保留原登录时间、IP、客户端并写回 Session |
| 未登录刷新 |
Session 无 LoginUser |
返回空数据,不调用用户加载服务 |
| 前端初始化失败 |
用户/菜单初始化抛错 |
清理登录态一次,路由守卫完成一次,跳转 /login 一次 |
| 登录跳转地址 |
原始业务路由带 query |
登录目标携带完整 fullPath,不重新进入原权限初始化分支 |
2. P1 集成与静态检查
- Auth Starter 定向 JUnit 测试通过。
- 前端定向 Vitest 与相关 JS ESLint 通过。
- 后端 Auth Starter 聚合编译通过。
- 前端生产构建通过。
git diff --check 通过,工作树既有 .DS_Store 变更未被纳入。
3. 计划命令
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home \
PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH \
mvn -Penable-tests -pl forge-framework/forge-starter-parent/forge-starter-auth -am \
-Dtest=AuthControllerTest -Dsurefire.failIfNoSpecifiedTests=false test
source ~/.nvm/nvm.sh
nvm use v20.19.0
pnpm exec vitest run src/router/guards/__tests__/auth-bootstrap-recovery.spec.js
pnpm exec eslint src/router/guards/permission-guard.js \
src/router/guards/auth-bootstrap-recovery.js \
src/router/guards/__tests__/auth-bootstrap-recovery.spec.js
pnpm build
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home \
PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH \
mvn -pl forge-framework/forge-starter-parent/forge-starter-auth -am compile -DskipTests
git diff --check
4. 跳过项
- 不启动 Admin、MySQL、Redis,不执行真实 Token 的跨租户浏览器 E2E。
- 部署环境需冒烟:默认租户登录 → 切换“小米连锁” → 用户信息、菜单正常 → 刷新仍保持目标租户。
5. 实际结果
| 范围 |
结果 |
备注 |
| 失败基线 |
passed(成功复现) |
旧后端调用未命中 loadUserByUserId,测试 1/2 失败;前端恢复模块不存在,测试套件失败 |
| 后端定向 JUnit |
passed,2/2 |
聚合 16 模块执行;无失败或跳过的目标测试 |
| 前端定向 Vitest |
passed,2/2 |
单次恢复与登录页自重定向保护通过 |
| 前端定向 ESLint |
passed |
首次发现文件尾多空行,修正后重跑通过 |
| 后端聚合 compile |
passed,16/16 modules |
存在既有 Lombok Builder、deprecated 警告 |
| 前端 production build |
passed,8848 modules,2m35s |
存在既有组件命名、CSS 注释、动态导入和 chunk 警告 |
| 差异空白检查 |
passed |
未包含用户既有 .DS_Store 变更 |