15 KiB
15 KiB
Jog System 自动化测试 Bug 清单
| 项目 | 内容 |
|---|---|
| 生成日期 | 2026-05-18 |
| 测试依据 | doc/jog-system-automated-test-plan.md |
| 测试范围 | 后端 Maven 编译/测试、前端 Vite 构建、前后端 API 契约静态检查、数据库迁移/实体映射静态检查、安全配置静态检查 |
1. 测试执行摘要
| 测试项 | 命令/方式 | 结果 |
|---|---|---|
| 后端编译与测试 | mvn -B test |
通过编译,但所有模块均显示 No tests to run,未执行任何自有测试 |
| 前端构建(旧 Node) | npm run build |
失败,Node v16.20.2 下 Vite 启动时报 crypto$2.getRandomValues is not a function |
| 前端构建(已切换 Node) | npm run build |
通过,当前 Node v24.15.0、npm 11.12.1,构建产物已输出到 jog-admin/src/main/resources/static |
| API 契约检查 | 对比 jog-frontend/src/api/*.js 与后端 Controller |
发现多处路径和 HTTP 方法不一致 |
| 数据库映射检查 | 对比实体 @TableName 与 Flyway 建表脚本 |
发现表名、字段名大面积不一致 |
| 安全配置检查 | 对比 JWT 角色生成、SecurityConfig、Controller 路径 | 发现管理员角色无法匹配、用户接口未被鉴权规则保护 |
1.1 本轮修复记录
| Bug | 当前状态 | 修复摘要 |
|---|---|---|
| BUG-003 | 已修复,待数据库集成验证 | 实体 @TableName 已对齐 sys_* / blog_* 表名 |
| BUG-004 | 已修复,待数据库集成验证 | 对差异字段补充 @TableField,覆盖用户类型、会话 token/过期时间、登录结果、评论回复目标等 |
| BUG-005 | 已修复 | JWT access token 角色改为 ADMIN / USER,过滤器兼容旧数字角色 |
| BUG-006 | 已修复 | 用户侧 Controller 已统一到 /api/app/**,并由 SecurityConfig 保护 |
| BUG-007 | 已修复 | 认证接口已对齐前端 /api/public/user/login、/api/public/admin/login、/api/public/user/register、/api/public/refresh-token |
| BUG-008 | 已修复 | 文章、评论、用户接口已对齐前端 /api/app/** 路径 |
| BUG-009 | 已修复 | 回收站、恢复、评论审核、用户重置密码、用户状态更新的 HTTP 方法已对齐前端 |
| BUG-010 | 部分修复 | 已补标签列表/创建、验证码占位接口、关注/取关接口;验证码当前仅返回占位数据,不做真实校验 |
| BUG-011 | 已修复 | 前端路由已根据 requiresAdmin 校验本地用户角色 |
| BUG-012 | 已修复 | V2__init_data.sql 已移除 USE blog_db |
| BUG-013 | 已修复 | 文章详情标签改为返回结构化 Tag 对象,匹配前端 id/name 使用方式 |
2. Bug 清单
BUG-001 前端构建在旧 Node 版本下无法启动
| 字段 | 内容 |
|---|---|
| 严重级别 | P3 |
| 状态 | 已验证解决:Node 已切换至 v24.15.0 后构建通过 |
| 位置 | jog-frontend/package.json、本机 Node 环境 |
| 复现 | 在 jog-frontend 执行 npm run build |
| 实际结果 | TypeError: crypto$2.getRandomValues is not a function |
| 期望结果 | 前端可完成生产构建 |
| 证据 | 旧 Node 版本为 v16.20.2,切换到 v24.15.0 后 npm run build 成功 |
| 建议 | 在 README/部署文档和 package.json engines 中声明 Node >= 20;本地和 CI 统一 Node 版本 |
BUG-002 使用新版 Node 后前端构建失败
| 字段 | 内容 |
|---|---|
| 严重级别 | P3 |
| 状态 | 无法复现/已恢复:用户切换 Node 后 npm run build 通过 |
| 位置 | jog-frontend/vite.config.js:29 |
| 复现 | 使用 Node v24.14.0 执行 node node_modules/vite/bin/vite.js build |
| 实际结果 | [vite:build-html] The "fileName" or "name" properties of emitted chunks and assets must be strings that are neither absolute nor relative paths, received "E:/person/Jog/jog-frontend/index.html" |
| 期望结果 | 构建产物成功输出到后端静态资源目录 |
| 最新验证 | 当前 Node v24.15.0、npm 11.12.1 下执行 npm run build 成功 |
| 建议 | 保留 CI 构建验证;若再次出现该错误,再检查 Node/npm/Vite 解析路径差异 |
BUG-002A 前端构建存在低优先级告警
| 字段 | 内容 |
|---|---|
| 严重级别 | P3 |
| 状态 | 待优化 |
| 位置 | jog-frontend 构建配置与本机 npm 配置 |
| 实际结果 | 构建成功,但 npm 输出多条 Unknown user config 警告;Vite 输出主 chunk 超过 500 kB 的警告 |
| 期望结果 | CI 构建日志干净,首屏资源大小可控 |
| 影响 | 暂不阻断发布,但会降低构建日志可读性,主包偏大可能影响首屏性能 |
| 建议 | 清理过期 npm 配置;为 Element Plus、Tiptap 等依赖配置合理分包或接受当前 warning 并设置 chunk 预算 |
BUG-003 实体表名与 Flyway 建表脚本不一致,运行时会查不到表
| 字段 | 内容 |
|---|---|
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | jog-module-system/src/main/java/.../entity/*.java、jog-module-blog/src/main/java/.../entity/*.java、jog-module-comment/src/main/java/.../entity/*.java、jog-admin/src/main/resources/db/migration/V1__init_schema.sql |
| 复现 | 启用 Flyway 初始化后调用任意 Mapper 查询 |
| 实际结果 | 实体使用 @TableName("user")、article、comment、category 等;SQL 创建的是 sys_user、blog_article、blog_comment、blog_category 等 |
| 期望结果 | 实体表名与数据库真实表名一致 |
| 影响 | 登录、注册、文章、评论、分类等数据库操作都会失败 |
| 建议 | 统一命名策略:要么实体改为 sys_*/blog_*,要么迁移脚本改为无前缀表;推荐按迁移脚本保留前缀并修正实体 |
BUG-004 实体字段与数据库字段不一致,多个核心写入会失败或数据错列
| 字段 | 内容 |
|---|---|
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | User.java、UserSession.java、LoginLog.java、Comment.java、V1__init_schema.sql |
| 实际结果 | 例如 User.type 对应代码字段,但 SQL 是 user_type;UserSession.refreshToken/expiresAt 对应 SQL 的 token/expire_time;LoginLog.email/status/userAgent 对应 SQL 的 username/result 且 SQL 无 user_agent;Comment.replyToId 对应 SQL 的 reply_to_user_id |
| 期望结果 | 字段名可通过 MyBatis-Plus 正确映射 |
| 影响 | 登录记录、会话保存、用户角色、评论回复等核心链路会失败 |
| 建议 | 为差异字段添加 @TableField("实际字段名"),或统一 SQL 字段命名;同时增加 Mapper 集成测试覆盖插入/查询 |
BUG-005 JWT 角色值与 Spring Security 角色规则不匹配,管理员接口会 403
| 字段 | 内容 |
|---|---|
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | jog-framework/src/main/java/fun/nojava/framework/security/JwtTokenProvider.java:18、JwtAuthenticationFilter.java:39、SecurityConfig.java:51 |
| 实际结果 | Token 中 role 写入的是数字字符串 0/1,过滤器生成 ROLE_0/ROLE_1;但安全配置要求 /api/admin/** 具备 ROLE_ADMIN |
| 期望结果 | 管理员 Token 应匹配 ROLE_ADMIN,普通用户 Token 应匹配 ROLE_USER |
| 影响 | 管理后台 API 无法正常访问;普通用户权限判断也不稳定 |
| 建议 | Token 中存储 ADMIN/USER,或在过滤器中将 UserType code 转换为角色名 |
BUG-006 用户文章/评论接口未被 Spring Security 鉴权规则保护
| 字段 | 内容 |
|---|---|
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | SecurityConfig.java:52、ArticleController.java:16、CommentController.java:19、UserController.java:15 |
| 实际结果 | 安全配置只保护 /api/app/**,但后端用户业务接口实际是 /api/article、/api/comment、/api/user;这些路径最终落入 anyRequest().permitAll() |
| 期望结果 | 创建/更新/删除文章、发表评论、删除评论、获取当前用户等接口必须要求登录 |
| 影响 | 未登录用户可能访问写接口,@AuthenticationPrincipal Long userId 为空后还可能导致脏数据或空指针 |
| 建议 | 统一后端用户接口前缀为 /api/app/**,或在 SecurityConfig 中显式保护 /api/article/**、/api/comment/**、/api/user/** |
BUG-007 前后端认证接口路径完全不一致
| 字段 | 内容 |
|---|---|
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | jog-frontend/src/api/auth.js:4、auth.js:8、auth.js:12、auth.js:20、jog-module-system/src/main/java/.../AuthController.java:18 |
| 实际结果 | 前端调用 /api/public/admin/login、/api/public/user/login、/api/public/user/register、/api/public/refresh-token;后端提供 /api/auth/admin/login、/api/auth/login、/api/auth/register、/api/auth/refresh |
| 期望结果 | 前端 API 封装与后端 Controller 路径一致 |
| 影响 | 登录、注册、Token 刷新全部 404,系统无法完成认证 |
| 建议 | 建立 OpenAPI 契约检查;统一使用 /api/auth/** 或调整后端兼容前端路径 |
BUG-008 前后端文章/评论/用户接口路径不一致
| 字段 | 内容 |
|---|---|
| 严重级别 | P0 |
| 状态 | 待修复 |
| 位置 | jog-frontend/src/api/article.js:12、article.js:24、comment.js:4、auth.js:24、后端 ArticleController.java:16、CommentController.java:19、UserController.java:15 |
| 实际结果 | 前端使用 /api/app/article、/api/app/article/mine、/api/app/comment、/api/app/user/me;后端实际是 /api/article、/api/article/my、/api/comment、/api/user/info |
| 期望结果 | 前后端路径一致 |
| 影响 | 登录后的发文、我的文章、评论、当前用户信息等核心页面无法工作 |
| 建议 | 统一用户端路径前缀和资源命名,建议后端对齐 /api/app/** 或前端全部改为后端当前路径 |
BUG-009 多个前端请求 HTTP 方法与后端不一致
| 字段 | 内容 |
|---|---|
| 严重级别 | P1 |
| 状态 | 待修复 |
| 位置 | jog-frontend/src/api/article.js:28、article.js:32、comment.js:24、admin.js:8、admin.js:12;后端对应 Controller |
| 实际结果 | 前端对回收站/恢复/审核/重置密码/状态更新使用 PUT;后端分别使用 POST |
| 期望结果 | 同一接口请求方法一致 |
| 影响 | 即使路径修正,仍会返回 405 或无法命中接口 |
| 建议 | 按 REST 风格统一:状态变更可用 PUT/PATCH,动作型接口可用 POST,但前后端必须一致 |
BUG-010 前端调用了后端未实现的接口
| 字段 | 内容 |
|---|---|
| 严重级别 | P1 |
| 状态 | 待修复 |
| 位置 | jog-frontend/src/api/auth.js:16、auth.js:36、auth.js:40、article.js:44、article.js:60 |
| 实际结果 | 前端调用验证码 /api/public/captcha、关注/取关、公开标签列表、管理员创建标签;后端未发现对应 Controller 映射 |
| 期望结果 | 前端只调用已实现接口,或后端补齐对应接口 |
| 影响 | 登录页验证码、关注功能、文章编辑标签选择、后台标签管理会失败 |
| 建议 | 根据需求决定补实现还是移除前端入口;未实现需求应在自动化测试中标记为 pending |
BUG-011 前端管理员路由只校验 Token,不校验管理员角色
| 字段 | 内容 |
|---|---|
| 严重级别 | P1 |
| 状态 | 待修复 |
| 位置 | jog-frontend/src/router/index.js |
| 实际结果 | 路由定义有 requiresAdmin,但 beforeEach 只检查 requiresAuth 和 token,不检查用户类型 |
| 期望结果 | 普通用户访问 /admin/** 应在前端被拒绝或重定向 |
| 影响 | 普通用户可进入后台页面,虽然后端也应拦截,但会造成越权界面暴露和误导 |
| 建议 | 从 user_info 或 Store 中读取用户类型,补充 requiresAdmin 判断;后端仍保留最终权限校验 |
BUG-012 V2 初始化脚本写死 USE blog_db,与当前配置不一致
| 字段 | 内容 |
|---|---|
| 严重级别 | P1 |
| 状态 | 待修复 |
| 位置 | jog-admin/src/main/resources/db/migration/V2__init_data.sql:4、application.yml |
| 实际结果 | 初始化脚本写死 USE blog_db;,当前应用数据源库名不是同一个命名 |
| 期望结果 | Flyway 迁移脚本不应写死切库,应该使用当前连接的 schema |
| 影响 | 首次初始化可能写入错误数据库或直接失败 |
| 建议 | 删除 USE blog_db;,由 JDBC URL 指定 schema;CI 中增加 Flyway clean/migrate 测试 |
BUG-013 文章详情返回的标签结构与前端期望不一致
| 字段 | 内容 |
|---|---|
| 严重级别 | P2 |
| 状态 | 待修复 |
| 位置 | ArticleServiceImpl.java:283、ArticleVO.java、jog-frontend/src/views/ArticleDetail.vue:13、ArticleEditor.vue:100 |
| 实际结果 | 后端 ArticleVO.tags 是 List<String>;前端按 tag.id、tag.name 使用 |
| 期望结果 | 标签返回结构与前端一致 |
| 影响 | 文章详情标签显示异常,编辑文章时标签无法正确回填 |
| 建议 | 后端返回 List<TagVO>,或前端改为字符串数组渲染;编辑器需要 ID 时推荐返回结构化对象 |
BUG-014 限流 Key 未包含 IP 或用户维度,所有用户共享同一限流桶
| 字段 | 内容 |
|---|---|
| 严重级别 | P2 |
| 状态 | 待修复 |
| 位置 | jog-framework/src/main/java/fun/nojava/framework/aspect/RateLimitAspect.java:41 |
| 实际结果 | Redis Key 仅为 rate_limit: + 注解 key,例如所有用户共享 rate_limit:login |
| 期望结果 | 登录、注册等限流至少按 IP 或账号维度隔离 |
| 影响 | 一个用户频繁请求会误伤所有用户;也无法实现需求中的“同一 IP”限流 |
| 建议 | 将 IP、用户 ID、请求路径或账号加入限流 Key;补充并发/限流集成测试 |
BUG-015 当前项目没有自有自动化测试,质量门禁失效
| 字段 | 内容 |
|---|---|
| 严重级别 | P2 |
| 状态 | 待补齐 |
| 位置 | 全项目 |
| 实际结果 | mvn -B test 成功但所有模块均显示 No tests to run;前端没有 test:unit、test:e2e 等脚本 |
| 期望结果 | 后端至少有 Service 单元测试、Controller 集成测试;前端至少有组件测试和 E2E 冒烟 |
| 影响 | 构建通过不代表功能可用,无法防止上述契约/安全/数据库缺陷回归 |
| 建议 | 按测试计划第一阶段补齐 JUnit/Mockito/Testcontainers/Vitest/Playwright,并纳入 CI |
3. 优先修复建议
- 先修复 P0:数据库实体映射、JWT 角色映射、安全保护路径、前后端认证/业务 API 路径。
- 再修复 P1:HTTP 方法不一致、缺失接口、管理员前端路由、Flyway
USE blog_db。 - 最后补齐 P2:标签结构、限流维度、自动化测试设施。
- 修复后第一批自动化测试应优先覆盖:登录/注册、管理员登录和访问后台、创建文章、我的文章列表、发表评论、Flyway 初始化、前端构建。