diff --git a/doc/jog-system-automated-test-plan.md b/doc/jog-system-automated-test-plan.md index b01c33b..094545a 100644 --- a/doc/jog-system-automated-test-plan.md +++ b/doc/jog-system-automated-test-plan.md @@ -1,478 +1,348 @@ -# Jog System 自动化测试计划 +# Jog System 自动化测试规范(AI 测试用例唯一输入) -| 项目 | 内容 | +> **更新**:需求级**全量展开**且文件名含 Cursor 的单一输入见 [`jog-system-cursor-automated-test-spec.md`](jog-system-cursor-automated-test-spec.md)。本文档保留为精简版路由与执行现状摘要。 + +| 属性 | 内容 | | :--- | :--- | -| 文档版本 | V1.0 | +| 文档版本 | V2.0 | | 生成日期 | 2026-05-18 | -| 适用范围 | Jog System 后端 Maven 多模块、Vue 3 前端、数据库迁移与部署验证 | -| 测试目标 | 建立可持续运行的自动化测试体系,覆盖核心业务、接口契约、安全控制、前端流程和发布质量门禁 | +| 用途 | **仅依赖本文档**即可推导可执行的自动化测试用例(单元 / 集成 / 契约 / E2E / 安全 / 性能冒烟);业务验收口径同时映射需求文档中的 AC 编号 | +| 仓库实际模块名 | `jog-common`、`jog-framework`、`jog-module-system`、`jog-module-blog`、`jog-module-comment`、`jog-admin`、`jog-frontend` | +| 技术栈摘要 | 后端 Spring Boot 3.4.x、Java 21、Spring Security + JWT、MyBatis-Plus、MySQL、Redis、Flyway、SpringDoc;前端 Vue 3、Vite 6、Element Plus、Pinia、Axios | + +> **说明**:历史文档 `jog-system-technical-design.md` 中的路径示例(如 `/api/app/blog/articles`)与当前代码不一致时,**以本文档「附录 A」为准**(来自当前 Controller 扫描)。需求规格中以 `AC-*` 编号的验收场景,在「第 7 节」逐条映射到可自动化用例骨架。 --- -## 1. 项目扫描结论 +## 1. 当前已执行的测试与验证(事实记录) -### 1.1 技术与模块 +以下内容来自对仓库的一次质量核验(详见 `doc/jog-system-bug-list.md`),代表**截至文档日期的真实执行状況**,而非目标态。 -本项目为前后端分离的博客系统: +### 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`:前台浏览、登录注册、个人中心、文章编辑、后台管理页面。 +| 序号 | 类别 | 命令或方式 | 结果摘要 | +| :---: | :--- | :--- | :--- | +| T-01 | 后端编译链路 | `mvn -B test` | Maven 生命周期通过;**各模块均无自有 `src/test`,Surefire 报告为 `No tests to run`**(无 JUnit 级自动化回归) | +| T-02 | 前端生产构建 | `jog-frontend` 下 `npm run build` | **Node v16.20.2**:Vite 报错 `crypto.getRandomValues is not a function`,构建失败。**Node v24.15.0**:构建通过,产物按项目配置输出到 `jog-admin/src/main/resources/static` | +| T-03 | 前端依赖与脚本 | `package.json` | 仅有 `dev` / `build` / `preview`;**无** `test:unit`、`test:e2e`、lint 脚本 | +| T-04 | API 契约(静态) | 人工对比 `jog-frontend/src/api/*.js` 与后端 Controller | 曾发现路径/方法不一致;经修复后应以附录 A 与 OpenAPI 重新做**双向校验**(当前未纳入 CI 自动化) | +| T-05 | 数据库映射(静态) | 对比实体 `@TableName` / `@TableField` 与 Flyway `V1__init_schema.sql` | 曾发现表名、字段不一致;修复记录见 BUG-003/BUG-004(**仍需带库集成测试**验证) | +| T-06 | 安全配置(静态) | 对比 `JwtTokenProvider`、JWT 过滤器、`SecurityConfig` 与 Controller 前缀 | 曾发现角色 Claims、未保护路径等问题;部分已修复(见 BUG-005/006/007),**需自动化权限矩阵回归** | -### 1.2 当前测试基础 +### 1.2 明确未执行 / 缺失项 -- 后端仅 `jog-admin` 显式引入 `spring-boot-starter-test`,其余业务模块未单独声明测试依赖。 -- 项目源码中未发现自有 `src/test` 测试目录。 -- 前端 `package.json` 当前仅包含 `dev`、`build`、`preview`,未配置单元测试、组件测试、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/**` 需要 `USER` 或 `ADMIN`,但部分业务 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% 覆盖,非核心后台功能冒烟覆盖 | +| N-01 | **无任何** `src/test/java` 下的单元测试或集成测试(仓库扫描为 0 个测试类) | +| N-02 | **无** Vitest / Playwright / Cypress 等前端或 E2E 套件 | +| N-03 | **无** CI 中可重复的契约 diff(OpenAPI vs `src/api`)流水线步骤 | --- -## 3. 测试分层策略 +## 2. 测试目标与质量门禁(目标态) -### 3.1 后端单元测试 +### 2.1 目标 -推荐工具:JUnit 5、Mockito、AssertJ、Spring Security Test。 +- 核心链路:认证、注册、Token 刷新、文章 CRUD 与列表、评论、分类/标签、后台用户管理与审核。 +- 横切能力:JWT 鉴权、角色(`ROLE_ADMIN` / `ROLE_USER`)、统一响应 `ApiResult`、分页 `PageResult`、限流、`XssFilter`、Flyway 迁移可重复执行。 +- **前后端契约**:HTTP 方法、路径、请求/响应 JSON 字段与前端封装一致。 +- **需求对齐**:凡本文档标记为 `(需求)` 的用例,应以 `doc/jog-system-requirements.md` 中同名 AC 为判定依据;标记为 `(实现差异)` 的,以当前代码为准并建议产品确认。 -重点覆盖: +### 2.2 建议门禁(落地后) -- `AuthServiceImpl` - - 邮箱不存在、密码错误、账号锁定、登录成功。 - - 管理员登录的角色校验。 - - 注册邮箱唯一性、密码加密、默认用户状态。 - - Refresh Token 校验失败、用户不存在、刷新成功。 - - 登出时 Token 加入黑名单。 -- `UserServiceImpl` - - 当前用户信息查询。 - - 用户列表分页、状态筛选。 - - 管理员重置密码、锁定/解锁用户。 -- `ArticleServiceImpl` - - 创建草稿/发布文章、发布时间设置。 - - 更新文章、标签重建、作者权限校验。 - - 公开列表分页、分类/标签/关键词过滤。 - - 我的文章、后台文章列表。 - - 回收站、恢复、作者删除、管理员删除。 - - 浏览量递增、点赞/取消点赞、文章不存在。 -- `CategoryServiceImpl` - - 分类创建、重名、更新、删除。 - - 启用分类列表排序。 -- `CommentServiceImpl` - - 创建根评论和回复。 - - 父评论不存在、回复层级限制。 - - 评论列表根评论与回复排序。 - - 作者删除权限、管理员审核、点赞/取消点赞。 -- `RateLimitAspect`、`JwtTokenProvider`、`TokenBlacklistService`、`XssFilter` - - 限流 Key 与过期时间。 - - Token 生成、解析、过期、非法签名。 - - 黑名单命中。 - - 常见 XSS payload 过滤。 - -### 3.2 后端集成测试 - -推荐工具:Spring Boot Test、MockMvc、Testcontainers(MySQL、Redis)、Flyway、spring-security-test。 - -重点覆盖: - -- 使用 Testcontainers 启动隔离 MySQL/Redis,运行 Flyway 迁移。 -- 验证 `V1__init_schema.sql` 与 `V2__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` 字段稳定:`code`、`message`、`data`。 -- 分页响应 `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.vue`、`Register.vue`:表单校验、提交状态、错误提示、登录后跳转。 - - `Home.vue`:列表加载、分页、分类筛选、空状态。 - - `ArticleDetail.vue`:详情渲染、评论列表、点赞、评论提交。 - - `ArticleEditor.vue`:标题/内容校验、草稿/发布、分类标签选择、编辑回填。 - - 后台 `Users.vue`、`Articles.vue`、`Comments.vue`、`Categories.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 - - 文章和评论中提交 `