Files
Jog/doc/jog-system-automated-test-plan.md
T
2026-05-18 03:22:40 +08:00

22 KiB
Raw Blame History

Jog System 自动化测试计划

项目 内容
文档版本 V1.0
生成日期 2026-05-18
适用范围 Jog System 后端 Maven 多模块、Vue 3 前端、数据库迁移与部署验证
测试目标 建立可持续运行的自动化测试体系,覆盖核心业务、接口契约、安全控制、前端流程和发布质量门禁

1. 项目扫描结论

1.1 技术与模块

本项目为前后端分离的博客系统:

  • 后端:Spring Boot 3.4.5、Java 21、Maven 多模块、Spring Security + JWT、MyBatis-Plus、MySQL、Redis、Flyway、SpringDoc OpenAPI。
  • 前端:Vue 3.5、Vite 6、Element Plus、Pinia、Vue Router、Axios、Tiptap。
  • 模块结构:
    • jog-common:统一响应、分页模型、异常、枚举、限流注解等公共能力。
    • jog-framework:安全配置、JWT、鉴权过滤器、XSS 过滤、限流切面、全局异常。
    • jog-module-system:登录、注册、用户信息、管理员用户管理。
    • jog-module-blog:文章、分类、标签、点赞、公开列表、后台文章管理。
    • jog-module-comment:评论、回复、点赞、审核、后台评论管理。
    • jog-admin:启动入口、应用配置、Flyway 数据库迁移。
    • jog-frontend:前台浏览、登录注册、个人中心、文章编辑、后台管理页面。

1.2 当前测试基础

  • 后端仅 jog-admin 显式引入 spring-boot-starter-test,其余业务模块未单独声明测试依赖。
  • 项目源码中未发现自有 src/test 测试目录。
  • 前端 package.json 当前仅包含 devbuildpreview,未配置单元测试、组件测试、E2E 测试或 lint 脚本。
  • node_modules 已存在于工作区,属于依赖产物,不纳入源码测试范围。

1.3 扫描发现的测试重点

  • 后端 Controller 实际路径为 /api/auth/api/article/api/comment/api/admin/**/api/public/** 等。
  • 前端 API 封装中存在 /api/public/user/login/api/app/article/mine/api/app/comment/** 等路径,与当前后端 Controller 的部分路径不一致,应将“前后端接口契约一致性”列为首要自动化检查。
  • SecurityConfig/api/admin/** 需要 ADMIN 角色,/api/app/** 需要 USERADMIN,但部分业务 Controller 未挂在 /api/app 下,需通过安全回归测试确认实际权限边界。
  • application.yml 中含真实数据库、Redis 地址和密码样式配置,测试环境应改用隔离配置与环境变量,禁止自动化测试直接访问生产或公网中间件。
  • 需求文档与当前代码实现存在差异,例如验证码、邮箱验证、多端会话上限、评论三级嵌套、图片上传、关注、通知、标签管理等能力并未完整落地,自动化测试应区分“已实现回归”和“需求缺口验证”。

2. 测试目标与质量门禁

2.1 测试目标

  • 保证登录、注册、文章发布、文章浏览、点赞、评论、后台审核、分类和用户管理等核心链路稳定。
  • 保证 JWT 鉴权、角色权限、Token 刷新/登出、限流、XSS 防护、统一异常响应可持续回归。
  • 保证前后端 API 路径、请求方法、请求参数、响应结构一致。
  • 保证 Flyway 迁移脚本、实体映射、MyBatis-Plus 逻辑删除与分页查询可靠。
  • 保证前端路由守卫、表单校验、Axios 拦截器和关键页面交互可回归。

2.2 推荐质量门禁

阶段 必跑项 通过标准
本地提交前 后端单元测试、前端构建、前端单元测试 全部通过,无新增严重告警
合并请求 后端集成测试、API 契约测试、前端组件测试、E2E 冒烟 全部通过,核心模块覆盖率达标
发布前 全量 E2E、迁移脚本验证、安全回归、性能冒烟 P0/P1 缺陷为 0,P2 有明确处理计划
上线后 健康检查、核心链路巡检、日志错误扫描 首页/API/登录/发文/评论均可用

2.3 覆盖率目标

层级 建议目标
后端 Service 单元测试 行覆盖率 >= 80%,分支覆盖率 >= 70%
后端 Controller/API 测试 核心接口 100% 覆盖,错误路径至少覆盖主要业务错误码
安全与鉴权测试 所有公开、登录、普通用户、管理员接口权限矩阵 100% 覆盖
前端工具/API/Store 单元测试 行覆盖率 >= 70%
前端关键页面组件测试 登录、注册、首页、详情、编辑器、后台列表页面全覆盖
E2E 测试 核心用户旅程 100% 覆盖,非核心后台功能冒烟覆盖

3. 测试分层策略

3.1 后端单元测试

推荐工具:JUnit 5、Mockito、AssertJ、Spring Security Test。

重点覆盖:

  • AuthServiceImpl
    • 邮箱不存在、密码错误、账号锁定、登录成功。
    • 管理员登录的角色校验。
    • 注册邮箱唯一性、密码加密、默认用户状态。
    • Refresh Token 校验失败、用户不存在、刷新成功。
    • 登出时 Token 加入黑名单。
  • UserServiceImpl
    • 当前用户信息查询。
    • 用户列表分页、状态筛选。
    • 管理员重置密码、锁定/解锁用户。
  • ArticleServiceImpl
    • 创建草稿/发布文章、发布时间设置。
    • 更新文章、标签重建、作者权限校验。
    • 公开列表分页、分类/标签/关键词过滤。
    • 我的文章、后台文章列表。
    • 回收站、恢复、作者删除、管理员删除。
    • 浏览量递增、点赞/取消点赞、文章不存在。
  • CategoryServiceImpl
    • 分类创建、重名、更新、删除。
    • 启用分类列表排序。
  • CommentServiceImpl
    • 创建根评论和回复。
    • 父评论不存在、回复层级限制。
    • 评论列表根评论与回复排序。
    • 作者删除权限、管理员审核、点赞/取消点赞。
  • RateLimitAspectJwtTokenProviderTokenBlacklistServiceXssFilter
    • 限流 Key 与过期时间。
    • Token 生成、解析、过期、非法签名。
    • 黑名单命中。
    • 常见 XSS payload 过滤。

3.2 后端集成测试

推荐工具:Spring Boot Test、MockMvc、TestcontainersMySQL、Redis)、Flyway、spring-security-test。

重点覆盖:

  • 使用 Testcontainers 启动隔离 MySQL/Redis,运行 Flyway 迁移。
  • 验证 V1__init_schema.sqlV2__init_data.sql 可重复初始化干净环境。
  • 验证实体 @TableName 与实际表名一致,重点关注 sys_user/blog_article 等表与代码实体映射。
  • 验证 MyBatis-Plus 分页插件、逻辑删除字段、唯一索引冲突、事务回滚。
  • 使用 MockMvc 对 Controller 执行端到端接口测试,断言 HTTP 状态、统一响应结构、业务错误码和数据库副作用。

3.3 API 契约测试

推荐工具:SpringDoc OpenAPI 导出、Schemathesis 或 Dredd、Postman/Newman、或自定义 OpenAPI diff。

契约测试必须覆盖:

  • 后端 OpenAPI 与前端 src/api/*.js 中路径、方法、参数一致。
  • 统一响应结构 ApiResult 字段稳定:codemessagedata
  • 分页响应 PageResult 字段稳定:列表、总数、页码、页大小。
  • 401、403、429、业务异常响应格式一致。
  • Token 刷新接口路径一致。当前前端调用 /api/public/refresh-token,后端扫描到的是 /api/auth/refresh,需优先纳入失败用例。

3.4 前端单元与组件测试

推荐工具:Vitest、Vue Test Utils、jsdom、MSW、Testing Library。

重点覆盖:

  • utils/request.js
    • 请求自动附加 Authorization
    • 业务 code !== 200 的错误处理。
    • 401 清理本地 Token 并跳转登录。
    • 403、429、网络错误提示。
    • Token 刷新失败/成功后的重试逻辑。
  • router/index.js
    • 未登录访问 /app/**/admin/** 跳转登录。
    • 登录后路由放行。
    • 页面标题设置。
    • 管理员路由需要补充前端角色校验测试;当前代码只检查 token,未检查 requiresAdmin
  • 页面组件
    • Login.vueRegister.vue:表单校验、提交状态、错误提示、登录后跳转。
    • Home.vue:列表加载、分页、分类筛选、空状态。
    • ArticleDetail.vue:详情渲染、评论列表、点赞、评论提交。
    • ArticleEditor.vue:标题/内容校验、草稿/发布、分类标签选择、编辑回填。
    • 后台 Users.vueArticles.vueComments.vueCategories.vue:列表、筛选、分页、操作确认。

3.5 E2E 测试

推荐工具:Playwright。

建议用户旅程:

  1. 访客打开首页,查看公开文章列表,进入文章详情。
  2. 新用户注册、登录、进入个人控制台。
  3. 用户创建草稿、发布文章、编辑文章、移入回收站、恢复文章、删除文章。
  4. 另一用户浏览文章、点赞文章、发表评论、回复评论、取消点赞。
  5. 管理员登录后台,查看用户列表、重置密码、锁定用户。
  6. 管理员查看文章列表、删除违规文章。
  7. 管理员查看评论列表、审核评论、删除评论。
  8. 分类创建、编辑、删除后,前台筛选结果同步变化。
  9. 未登录用户访问编辑页会被重定向到登录页,并在登录后返回原目标页。
  10. 普通用户尝试访问后台应被拒绝。

3.6 安全自动化测试

重点用例:

  • JWT
    • 缺失 Token、伪造 Token、过期 Token、黑名单 Token。
    • 用户 Token 访问管理员接口返回 403。
    • 管理员 Token 访问后台接口成功。
  • 限流
    • 登录 60 秒内超过 5 次被限制。
    • 注册 1 小时内超过 3 次被限制。
    • 限流 Key 应区分 IP/用户/接口,避免全局误伤。
  • XSS
    • 文章和评论中提交 <script>、事件属性、javascript: 链接。
    • 富文本合法标签不应被过度清洗。
  • CORS/CSRF
    • CORS 允许策略在生产环境应收敛,自动化检查不允许 * 与凭证同时进入生产配置。
    • CSRF 已关闭,需确认仅用于 JWT 无状态 API。
  • 敏感信息
    • 扫描配置文件中数据库密码、Redis 密码、JWT 密钥、邮箱密码。
    • 自动化测试禁止连接 application.yml 中公网数据库和 Redis。

3.7 性能与可靠性测试

推荐工具:k6、JMeter 或 Gatling。

冒烟指标:

  • 首页文章列表 P95 < 500ms。
  • 文章详情 P95 < 500ms。
  • 登录接口 P95 < 800ms。
  • 创建文章 P95 < 1000ms。
  • 评论列表 P95 < 500ms。
  • 50 并发用户下错误率 < 1%。

专项场景:

  • 高频浏览文章详情时浏览量更新是否产生锁竞争或丢失更新。
  • 点赞/取消点赞并发操作是否出现负数计数或唯一索引冲突。
  • 评论列表在大量回复下的 N+1 查询问题。
  • 后台文章/评论/用户分页在万级数据下的响应时间。

4. 测试环境规划

4.1 环境分层

环境 用途 数据策略
Local 开发者快速回归 H2 或 Testcontainers,测试结束自动销毁
CI 合并请求质量门禁 Testcontainers MySQL/Redis,固定种子数据
Staging 发布前全量验证 与生产拓扑接近,脱敏数据
Prod Smoke 上线后巡检 只执行只读或专用测试账号的轻量用例

4.2 测试配置要求

  • 新增 application-test.yml,数据库和 Redis 全部来自 Testcontainers 或本地隔离实例。
  • Flyway 在测试环境启用,保证迁移脚本真实可用。
  • 禁止测试代码读取公网数据库地址、真实 Redis 密码、真实 SMTP。
  • 测试账号和测试文章使用固定前缀,例如 auto_test_,便于清理。
  • 前端 E2E 使用独立 .env.test,指向测试后端。

5. 测试数据设计

5.1 基础数据

类型 数据
管理员 admin@example.com,角色 ADMIN
普通用户 A user_a@example.com,角色 USER
普通用户 B user_b@example.com,角色 USER
锁定用户 locked@example.com,状态 LOCKED
分类 技术、生活、公告
标签 Java、Vue、测试、随笔
文章 草稿、公开已发布、私密、回收站、已删除
评论 根评论、一级回复、待审核、已屏蔽、已删除

5.2 边界数据

  • 标题空、标题 200 字、标题 201 字。
  • 密码长度 5、6、20、21。
  • 评论内容空、1000 字、超过 1000 字。
  • 分页 page=0page=1pageSize=1pageSize=100pageSize=101
  • 不存在的用户 ID、文章 ID、评论 ID、分类 ID。
  • 重复邮箱、重复分类名、重复点赞。
  • 富文本中包含合法 HTML、XSS payload、超长内容。

6. 自动化用例清单

6.1 认证与用户

编号 类型 场景 预期
AUTH-001 单元/API 正确邮箱密码登录 返回 accessToken、refreshToken、用户信息
AUTH-002 单元/API 邮箱不存在 返回用户不存在错误,记录失败日志
AUTH-003 单元/API 密码错误 返回密码错误,记录失败日志
AUTH-004 单元/API 锁定用户登录 返回账号锁定
AUTH-005 单元/API 普通用户调用管理员登录 返回权限不足
AUTH-006 API 注册新邮箱 用户入库,密码为 BCrypt
AUTH-007 API 重复邮箱注册 返回邮箱已存在
AUTH-008 API 刷新 Token 返回新的 accessToken 和 refreshToken
AUTH-009 API 非法 refreshToken 返回 Token 无效
AUTH-010 API 登出后使用旧 Token 被拒绝或命中黑名单
USER-001 API 获取当前用户信息 返回登录用户资料
USER-002 API 管理员分页查询用户 返回分页结构
USER-003 API 管理员重置密码 新密码可登录,旧密码失效
USER-004 API 管理员锁定用户 被锁定用户无法登录

6.2 文章与分类标签

编号 类型 场景 预期
BLOG-001 单元/API 创建草稿 状态为草稿,无发布时间
BLOG-002 单元/API 发布文章 状态为已发布,生成发布时间
BLOG-003 单元/API 更新文章标签 旧关联删除,新关联创建
BLOG-004 API 非作者更新文章 返回权限不足
BLOG-005 API 公开列表仅显示公开已发布 草稿、私密、回收站不出现
BLOG-006 API 按分类筛选 只返回该分类文章
BLOG-007 API 按标签筛选 只返回该标签文章
BLOG-008 API 关键词搜索 标题或摘要匹配
BLOG-009 API 我的文章列表 只返回当前用户文章
BLOG-010 API 移入回收站 状态变为回收站
BLOG-011 API 恢复文章 状态变为草稿
BLOG-012 API 点赞文章 点赞记录创建,计数 +1
BLOG-013 API 取消点赞 点赞记录删除,计数 -1 且不为负
BLOG-014 API 后台文章列表 管理员可按状态/分类/关键词筛选
CAT-001 API 创建分类 分类入库,可在公开列表读取
CAT-002 API 重名分类 返回唯一性错误
CAT-003 API 更新分类 名称、描述、排序生效
CAT-004 API 删除分类 分类不可再查询或被逻辑处理

6.3 评论

编号 类型 场景 预期
CMT-001 单元/API 创建根评论 评论状态为通过,文章 ID 正确
CMT-002 单元/API 回复根评论 parentId 正确
CMT-003 单元/API 回复二级评论 返回层级限制错误
CMT-004 API 非作者删除评论 返回权限不足
CMT-005 API 作者删除评论 评论被删除
CMT-006 API 评论列表 根评论倒序,回复正序
CMT-007 API 点赞评论 点赞记录创建,计数 +1
CMT-008 API 取消点赞评论 点赞记录删除,计数 -1 且不为负
CMT-009 API 管理员分页查询评论 返回分页结构
CMT-010 API 管理员审核评论 评论状态更新
CMT-011 API 管理员删除评论 评论不可见

6.4 前端页面与交互

编号 类型 场景 预期
FE-001 单元 Axios 自动附加 Token 请求头包含 Bearer Token
FE-002 单元 业务响应 code 非 200 展示错误并 reject
FE-003 单元 401 响应 清理本地登录态并跳转登录
FE-004 单元 未登录访问 /app/dashboard 跳转登录并携带 redirect
FE-005 单元 未登录访问 /admin 跳转登录
FE-006 组件 登录表单提交成功 保存 Token 并跳转
FE-007 组件 注册表单校验失败 阻止提交并提示
FE-008 组件 首页列表加载 渲染文章卡片、分页和空状态
FE-009 组件 文章详情加载 渲染正文、点赞、评论
FE-010 组件 编辑器发布文章 调用创建/更新 API
FE-011 组件 后台列表操作 筛选、分页、删除/审核确认
FE-012 契约 前端 API 路径与后端 OpenAPI 对比 不允许出现未实现路径

6.5 安全与异常

编号 类型 场景 预期
SEC-001 API 无 Token 访问需登录接口 返回 401
SEC-002 API 普通用户访问 /api/admin/** 返回 403
SEC-003 API 管理员访问后台接口 成功
SEC-004 API 伪造 JWT 返回 401
SEC-005 API 黑名单 JWT 返回 401
SEC-006 API 登录限流 超限返回 429 或业务限流错误
SEC-007 API 注册限流 超限返回 429 或业务限流错误
SEC-008 API 文章提交 XSS 脚本被过滤或拒绝
SEC-009 API 评论提交 XSS 脚本被过滤或拒绝
SEC-010 静态扫描 配置文件敏感信息 CI 阻断硬编码密码和密钥

7. CI/CD 自动化建议

7.1 推荐脚本

后端建议新增:

mvn -B clean verify

前端建议新增:

npm ci
npm run test:unit
npm run test:component
npm run build
npm run test:e2e

7.2 推荐新增依赖与脚本

后端:

  • 在父 POM 统一管理测试依赖:JUnit 5、Mockito、AssertJ、Testcontainers MySQL/Redis、Spring Security Test、JaCoCo。
  • 将测试依赖下沉到需要测试的模块,避免只有启动模块能写测试。
  • 配置 Maven Surefire/Failsafe,区分单元测试和集成测试。

前端:

  • 新增 Vitest、Vue Test Utils、jsdom、MSW、Playwright。
  • package.json 中新增:
    • test:unit
    • test:component
    • test:e2e
    • test:e2e:ui
    • coverage

7.3 Pipeline 阶段

  1. 依赖安装与缓存。
  2. 后端编译与单元测试。
  3. 后端集成测试,启动 MySQL/Redis Testcontainers。
  4. 生成 OpenAPI 文档。
  5. 前端 API 封装与 OpenAPI 契约对比。
  6. 前端单元/组件测试。
  7. 前端生产构建。
  8. 启动完整应用,运行 Playwright E2E 冒烟。
  9. 上传测试报告、覆盖率报告和 E2E 截图/视频。

8. 缺陷分级与处理策略

等级 定义 示例 处理要求
P0 系统不可用或核心数据损坏 无法启动、登录全失败、发文数据丢失 立即阻断发布
P1 核心业务不可用或严重安全问题 普通用户可访问后台、Token 绕过、评论 XSS 阻断合并/发布
P2 重要功能异常但有规避方式 筛选错误、分页异常、后台单项操作失败 发布前修复或明确延期
P3 轻微体验或边界问题 文案不准、空状态异常、非核心兼容问题 排入迭代

9. 当前优先落地路线

第一阶段:补齐基础测试设施

  • 后端新增 src/test 目录、application-test.yml、JUnit/Mockito/Testcontainers/JaCoCo。
  • 前端新增 Vitest、Vue Test Utils、MSW、Playwright。
  • 建立 CI 基础命令:后端 mvn verify,前端 npm run build + 单元测试。

第二阶段:先保护最容易出事故的链路

  • 认证:登录、注册、刷新、登出、管理员权限。
  • 契约:前端 API 路径和后端 Controller/OpenAPI 对比。
  • 文章:创建、发布、列表、详情、更新、删除、点赞。
  • 评论:创建、列表、回复、删除、审核、点赞。

第三阶段:增强安全与发布信心

  • XSS、限流、JWT 黑名单、CORS、敏感信息扫描。
  • Flyway 迁移全量验证。
  • Playwright 覆盖访客、普通用户、管理员三类角色端到端流程。
  • k6/JMeter 做核心接口性能冒烟。

10. 风险清单

风险 影响 建议
前后端 API 路径不一致 前端页面调用失败 优先建立契约测试,并统一 /api/auth/api/article/api/comment/api/app/** 路由规范
生产/公网中间件配置在默认配置中 自动化测试可能误连真实服务 建立 application-test.ymlCI 强制覆盖数据源
自有测试目录缺失 回归依赖人工验证 先补 Service 单元测试和 Controller 集成测试
需求文档与代码实现差异 验收标准不清 将未实现需求标为 pending/xfail,并建立需求追踪
前端缺少测试脚本 UI 回归成本高 引入 Vitest 和 Playwright,先覆盖核心旅程
点赞计数并发更新 可能出现计数错乱或负数 加并发集成测试,必要时改为原子 SQL 更新
评论和文章富文本安全 XSS 风险 加 payload 回归测试,确认过滤链路覆盖请求体

11. 验收标准

自动化测试计划落地后,应满足:

  • 每次合并请求自动运行后端单元测试、集成测试、前端单元/组件测试和构建。
  • 每次发布前自动运行核心 E2E、数据库迁移验证和安全回归。
  • 测试报告可追溯到用例、模块、提交和失败截图/日志。
  • 新增核心业务功能必须同步新增或更新自动化用例。
  • P0/P1 自动化失败不得合并,不得发布。