test-spec.md 7.4 KB

定时任务开放 API 增量测试计划

status: complete version: V8 created: 2026-07-20 updated: 2026-07-21 baseline: V6 Job 106/106、前端 18/18、Admin Reactor 42/42

1. 本轮差异

  • 新增服务账号 Token、HMAC Hash、Scope、任务 ID/任务组资源范围和管理权限。
  • 新增开放任务查询、幂等触发和执行状态查询协议。
  • 新增 Redisson 限流、幂等锁及 Redis 故障失败关闭。
  • 修改 Quartz 手动触发链路,允许预留并复用执行 ID。
  • 新增 Token 管理工作台和一次性明文展示。

2. P0 验证

编号 场景 预期
P0-01 Token 创建与轮换 明文只在响应 VO 出现,数据库实体/SQL 无明文字段,旧 Token 立即失效
P0-02 Token 认证 格式错误、Hash 错误、过期、吊销均返回 401,比较使用恒定时间方法
P0-03 Scope 与资源授权 缺 Scope 或越权任务返回 403,ID/组范围取并集且不允许空范围
P0-04 幂等触发 同 Token、任务、Key 在 24 小时内返回同一执行 ID且只提交一次
P0-05 Redis 故障 限流或幂等锁不可用时返回 503,不能创建执行记录或提交 Quartz
P0-06 执行生命周期 预留记录为 ACCEPTED,Quartz 复用同一 ID 推进 RUNNING 和终态
P0-07 开放响应安全 不返回 Bean、Handler、Service、任务参数、结果正文、异常正文或堆栈
P0-08 HTTP 错误边界 返回真实 400/401/403/404/409/429/503 和 Forge RespInfo
P0-09 管理权限审计 创建、吊销、轮换有独立权限;创建和轮换审计不保存响应正文
P0-10 模块与聚合构建 Job 插件测试、Admin Reactor 测试/构建通过

3. P1 验证

编号 场景 预期
P1-01 分页边界 pageNum >= 1pageSize 上限 100,资源过滤在 SQL 内完成
P1-02 Idempotency-Key 校验 缺失、过短、过长或非法字符返回 400,原文不落库不入日志
P1-03 限流 维度来自已认证 Key ID,超限返回 429,不信任客户端身份 Header
P1-04 任务状态 仅启用且 SYNCED 的任务可由开放接口触发,其余返回 409
P1-05 最后使用时间 按配置间隔节流且使用条件更新,失败时认证失败关闭
P1-06 前端一次性结果 创建/轮换成功后展示 Token,关闭后列表和详情均无法再次获取
P1-07 前端质量 Vitest、ESLint 和生产构建通过,Token 页面无文本溢出和嵌套卡片
P1-08 Flyway 版本唯一、防重复、默认租户为 1、逻辑删除唯一键语义正确

4. 执行命令

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-plugin-parent/forge-plugin-job -am test
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-admin-server -am package -DskipTests
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm test
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm exec eslint <本轮前端文件>
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm build
rg -n '\$\{[^}]+\}' forge-server/db/migration
rg -n 'rawToken|Authorization|Idempotency-Key|executorBean|executorHandler|executorService|exceptionMsg|jobParam' \
  forge-server/forge-framework/forge-plugin-parent/forge-plugin-job/src/main
git diff --check

5. 跳过项

  • 不自动启动真实 MySQL、Redis、Admin 或 Quartz;Flyway 实跑、真实 Bearer 请求、并发 Redis 和端到端 Quartz 执行由用户侧环境验收。
  • 不修改或清理工作区中 V1-V6 的未提交成果。

6. 执行结果

  • Job 模块:Java 17 下执行 mvn -Penable-tests -pl forge-framework/forge-plugin-parent/forge-plugin-job -am test,Job 137/137 通过,失败、错误和跳过均为 0,Reactor BUILD SUCCESS
  • Admin 聚合:Java 17 下执行 mvn -pl forge-admin-server -am package -DskipTests42/42 模块成功,生成 forge-admin-server.jar
  • 前端全量:Node 20.19.0 下执行 pnpm test,57 个测试文件、463/463 通过;V7 Token 页面 3/3 通过。
  • 前端质量:V7 目标 ESLint 无输出通过;pnpm build 生产构建通过,8721 个模块完成转换并生成 job-api-token 产物。
  • 静态检查:V1.0.46 迁移版本唯一;Flyway placeholder 无命中;四个 Job Mapper XML 通过 xmllint;开放响应 VO 不含执行目标、参数、结果或异常正文;持久化只命中幂等键 Hash;git diff --check 通过。
  • 非阻断警告:Admin 构建存在既有 EmployeeServiceImpl deprecated API 提示;Vitest 存在流程设计器组件 stub 和 Sass legacy API 提示;前端构建存在既有组件命名冲突、动态/静态导入、CSS 注释和大包体提示。
  • 用户侧验收:真实 Flyway、Bearer 请求、Redis 并发和 Quartz 端到端执行未自动启动,结果不得表述为已通过。

7. V8 本轮增量验证

编号 场景 预期
V8-P0-01 Scope 感知示例 创建/轮换弹窗只展示当前 Scope 允许的调用示例,不引导用户调用必然返回 403 的接口
V8-P0-02 触发任务示例 cURL 同时包含 Bearer Token、任务 ID 和 Idempotency-Key
V8-P0-03 明文生命周期 真实 Token 仅存在于一次性弹窗状态,关闭后继续由 clearIssuedToken() 清除
V8-P1-01 常驻说明 工作台可随时查看完整接口、Scope、服务地址和常见错误码,示例使用 Token 占位符
V8-P1-02 前端质量 目标 Vitest、目标 ESLint、生产构建和 git diff --check 通过
source ~/.nvm/nvm.sh && nvm use v20.19.0
pnpm exec vitest run src/views/system/__tests__/job-api-token.test.js \
  src/components/job/__tests__/job-open-api-usage.test.js
pnpm exec eslint src/components/job/JobOpenApiUsageGuide.vue \
  src/components/job/job-open-api-usage.js \
  src/components/job/__tests__/job-open-api-usage.test.js \
  src/views/system/job-api-token.vue \
  src/views/system/job-api-token.js \
  src/views/system/__tests__/job-api-token.test.js
NODE_OPTIONS=--max-old-space-size=8192 pnpm build

本轮只修改前端调用指导,不启动 Admin、MySQL、Redis 或 Quartz,不重复执行 V7 后端与迁移验证。

8. V8 执行结果

  • 目标测试:Node 20.19.0 下执行两个目标 Vitest 文件,2/2 文件、7/7 测试通过;覆盖 Scope 裁剪、触发幂等头、Token 占位、真实 Token 带入和服务地址更新。
  • 目标质量:六个目标 Vue/JS/测试文件执行 ESLint,无输出通过。
  • 生产构建:Node 20.19.0 下执行 NODE_OPTIONS=--max-old-space-size=8192 pnpm build,8725 个模块完成转换,job-api-token 产物生成,构建成功。
  • 静态审查:生成的触发 cURL 包含 Bearer Token、${JOB_ID}Idempotency-Key: $(uuidgen);敏感信息扫描未发现真实 Token 持久化、浏览器存储或日志输出;空白检查无输出。
  • 非阻断警告:保留仓库既有 UserSelectModal 命名冲突、动态/静态导入、CSS // 注释和大包体提示。
  • 跳过项:本轮未启动 Admin、MySQL、Redis、Quartz 或 Vite,不执行真实 Bearer E2E;交互由组件测试覆盖。