26 KiB
Jog System · Cursor 自动化测试输入规范(全量需求展开)
文档版本 · V1.0(Cursor) · 生成日期 · 2026-05-18
| 属性 | 内容 |
|---|---|
| 定位 | AI(含 Cursor Agent)生成自动化测试代码时的唯一输入;不依赖其他 doc 文件即可推导 JUnit / MockMvc / Testcontainers / Vitest / Playwright / k6 等用例 |
| 需求溯源 | 全文展开自 doc/jog-system-requirements.md(V1.0,2026-05-17)中的 FR、AC、§3 非功能、§4 权限矩阵、§5 界面、§6 测试验收 |
| 实现校准 | HTTP 路径与 Controller 以 附录 A 为准(当前 jog-* 仓库);与需求文字中的示例路径不一致时,以代码为准,并在用例 notes 中标注「需求差异」 |
| 并存说明 | 若与 jog-system-automated-test-plan.md 同时存在,以本 cursor 文档为 AI 唯一输入 |
0. 使用方式(写给 AI / Cursor)
- 仅依据本文档生成测试:从「第 6 章」起按
TC-*编号实现;接口路径查附录 A。 - 每条用例必须使用 第 5 章 JSON 模板 输出设计(可先批量生成 YAML/JSON fixture,再写代码)。
trace字段必须含 FR- / AC- / NF-* / PM-* / UI-* / API-*` 之一,便于覆盖率报告。- 标注
implementation_gap的用例:实现未达需求时,实现@Disabled+ 原因 或xfail,不得静默改预期。 - 优先级:
P0阻塞发布;P1阻塞合并;P2迭代补齐。
1. 仓库与已有验证事实(非需求,仅供上下文)
| 代号 | 说明 |
|---|---|
| T-01 | mvn -B test 可通过,但各模块 No tests to run,无自有 Java 测试 |
| T-02 | 前端 npm run build 需 Node ≥ 20;v16 下 Vite 可能失败 |
| T-03 | jog-frontend/package.json 无 test:unit / test:e2e |
| N-01 | 契约、Flyway、权限等曾依赖人工静态对比(见 jog-system-bug-list.md) |
2. 测试环境与数据
| 项 | 约定 |
|---|---|
| JDK | 21 |
| Node | ≥ 20(推荐与 CI 锁定一致) |
| 集成测试 DB/Redis | Testcontainers 或隔离实例;禁止默认连开发者 application.yml 中公网地址 |
| Profile | application-test.yml,Flyway 开启,JWT 密钥固定 |
| 数据前缀 | auto_test_*,用例结束清理或回滚 |
| 角色 | anonymous · user(ROLE_USER)· admin(ROLE_ADMIN) |
已知实现注记(编写断言时参考)
- 验证码接口可能为占位(见历史 BUG-010):只断言结构存在,不按生产级验证码验收。
- 限流 Key 可能缺 IP/用户维度(BUG-014):限流类用例标注
weak_isolation。 - 需求称访客可读评论;当前评论列表若在
/api/app/comment/**,访客可能 401:用例中保留 需求差异 断言分支。
3. 推荐工具与落地目录
| 分层 | 工具 | 目录建议 |
|---|---|---|
| 后端单元 | JUnit 5、Mockito、AssertJ | 各模块 src/test/java |
| 后端 API/集成 | Spring Boot Test、MockMvc、@SpringBootTest、Testcontainers |
jog-admin/src/test/java 为主 |
| 契约 | SpringDoc OpenAPI + 脚本对比 jog-frontend/src/api |
scripts/contract/ |
| 前端单元 | Vitest、Vue Test Utils、MSW | jog-frontend |
| E2E | Playwright | e2e/ 或 jog-frontend/e2e/ |
| 性能/并发 | k6、JMeter | perf/k6/ |
| 可访问性 | axe-core + Playwright | 挂接 E2E |
4. AI 生成单条用例的强制模板
每条逻辑用例输出为一个对象(可存 test-fixtures/*.json):
{
"id": "TC-AC-USER-REG-01",
"title": "中文短标题",
"priority": "P0|P1|P2",
"trace": ["AC-USER-REG-01", "FR-USER-REG-01", "API-AUTH-003"],
"layers": ["integration", "e2e"],
"roles": ["anonymous"],
"preconditions": ["干净库或已种子用户", "SMTP mock 或关闭发信断言"],
"steps": [
{ "action": "HTTP POST ...", "detail": "body 字段..." },
{ "action": "查库/查 Redis", "detail": "..." }
],
"expected": {
"http": 200,
"bodyJsonPath": { "code": 200, "data.id": "exists" },
"db": ["sys_user 新增一行 email=..."],
"ui": "可选:E2E 断言"
},
"negative_cases": [],
"implementation_gap": null,
"notes": null
}
5. 功能需求全量展开(对应需求 §2)
以下每节结构:FR 覆盖表(规则级必测点)+ AC 详规(验收级可执行展开)。
API 映射列指向附录 A 中最可能用到的路径(若尚无对应能力则写 N/A 并标 implementation_gap)。
5.1 管理员登录(需求 §2.1)
5.1.1 FR → 测试要点
| FR ID | 测试要点 | 建议分层 | 优先级 | API / 备注 |
|---|---|---|---|---|
| FR-ADM-LOGIN-01 | 支持手机号+密码、用户名+密码登录 | API / E2E | P0 | POST /api/public/admin/login |
| FR-ADM-LOGIN-02 | 仅 1 个内置超管,禁止第二管理员 | API / 集成 | P1 | 管理端用户创建接口若不存在则 implementation_gap |
| FR-ADM-LOGIN-03 | 连续 3 次错密后需验证码;5 次错密锁定 30 分钟 | API | P0 | 结合 GET /api/public/captcha(占位时注明) |
| FR-ADM-LOGIN-04 | 同 IP 5 分钟内失败 >10 次 → IP 封禁 15 分钟 | API / 集成 | P1 | 限流隔离弱时标 weak_isolation |
| FR-ADM-LOGIN-05 | 每次成功/失败写登录日志:时间、IP、设备指纹、结果 | 集成 | P0 | 查 sys_login_log 或等价表 |
| FR-ADM-LOGIN-06 | 会话 8h;记住我 7d | API / 集成 | P1 | JWT exp、refresh 配置 |
5.1.2 AC → 详规
TC-AC-ADM-LOGIN-01(P0,trace: AC-ADM-LOGIN-01, FR-ADM-LOGIN-01, FR-ADM-LOGIN-05)
- 目的:正确用户名或手机号 + 密码登录后台。
- 前置:Flyway 种子管理员存在;已知凭据。
- 步骤:
POST /api/public/admin/login,body:账号字段(与实现一致)、密码、可选deviceFingerprint。- 断言 200,
data含访问令牌与管理员信息。 - 数据库/日志:
result=成功、IP/时间非空。
- E2E:登录表单提交后 URL 进入
/admin或仪表盘路由。 - api_ref:附录 A
AuthController。
TC-AC-ADM-LOGIN-02(P0,trace: AC-ADM-LOGIN-02, FR-ADM-LOGIN-03)
- 目的:连续 3 次错误密码后第 4 次需验证码。
- 步骤:
- 同一账号连续 3 次错误密码。
- 第 4 次请求:不带验证码 → 期望 400/422 或业务码提示需验证码(与实现一致)。
GET /api/public/captcha取captchaKey;带正确/错误验证码各测一轮。
- implementation_gap:若验证码为占位,则断言「接口返回结构」+ 业务仍返回需验证码 或 记录产品与实现对齐缺口。
TC-AC-ADM-LOGIN-03(P0,trace: AC-ADM-LOGIN-03, FR-ADM-LOGIN-03)
- 目的:连续 5 次错误锁定 30 分钟。
- 步骤:连续失败至阈值;第 6 次正确密码仍不可登录;期望文案含锁定与约 30 分钟。
- 集成:查用户
locked_until或等价字段。
TC-AC-ADM-LOGIN-04(P1,trace: AC-ADM-LOGIN-04, FR-ADM-LOGIN-02)
- 目的:禁止第二超级管理员。
- 步骤:若存在「创建管理员」API 则调用并期望拒绝;若无 API 则静态断言
user_type枚举与注册路径不通。
TC-AC-ADM-LOGIN-05(P0,trace: AC-ADM-LOGIN-05, FR-ADM-LOGIN-05)
- 目的:登录日志字段完整。
- 步骤:成功一次、失败一次;查日志表:
ip、device/ua、result、time。
5.2 用户注册(需求 §2.2)
5.2.1 FR → 测试要点
| FR ID | 测试要点 | 建议分层 | 优先级 |
|---|---|---|---|
| FR-USER-REG-01 | 邮箱+密码必填 | API / FE 单元 | P0 |
| FR-USER-REG-02 | 密码 8~32 且至少三类字符 | FE + API | P0 |
| FR-USER-REG-03 | 邮箱唯一;发验证邮件 | API / 集成 | P0 |
| FR-USER-REG-04 | 验证链接 24h | API | P1 |
| FR-USER-REG-05 | 同 IP 1h 最多 3 次注册 | API | P0 |
| FR-USER-REG-06 | 无自助找回;仅管理员重置 | API | P1 |
5.2.2 AC → 详规
TC-AC-USER-REG-01(P0,trace: AC-USER-REG-01, FR-USER-REG-01~03)
- 步骤:合法邮箱+合规密码
POST /api/public/user/register→ 200;DB 用户存在;邮件发送可 mock 断言「调用次数」。
TC-AC-USER-REG-02(P0,trace: AC-USER-REG-02, FR-USER-REG-03)
- 步骤:重复邮箱第二次注册 → 业务错误「该邮箱已被注册」或等价码。
TC-AC-USER-REG-03(P0,trace: AC-USER-REG-03, FR-USER-REG-02)
- 步骤:纯数字或少于 8 位 → 前端校验拦截;绕过前端直调 API → 400/业务错误。
TC-AC-USER-REG-04(P0,trace: AC-USER-REG-04, FR-USER-REG-05)
- 步骤:同 IP(或同测试标识)第 4 次注册 → 限流或「注册过于频繁」。
TC-AC-USER-REG-05(P0,trace: AC-USER-REG-05, FR-USER-REG-06)
- 步骤:管理员
PUT /api/admin/user/{id}/reset-password;旧密码失效、新密码可登录。
5.2.3 FR 补充用例(无独立 AC)
TC-FR-USER-REG-04(P1,trace: FR-USER-REG-04)
- 目的:邮箱验证 token 超过 24h 失效。
- 步骤:插入过期 token 或时钟模拟;请求验证接口期望失败。
5.3 用户登录(需求 §2.3)
5.3.1 FR → 测试要点
| FR ID | 测试要点 | 优先级 |
|---|---|---|
| FR-USER-LOGIN-01 | 邮箱+密码 | P0 |
| FR-USER-LOGIN-02 | 最多 3 活跃会话,驱逐最早 | P0 |
| FR-USER-LOGIN-03 | OAuth 扩展点可配置开关 | P2 |
| FR-USER-LOGIN-04 | 5 次错密锁定 15 分钟 | P0 |
| FR-USER-LOGIN-05 | 忘记密码引导联系管理员 | P1 |
| FR-USER-LOGIN-06 | 默认 24h;记住我 14d | P0 |
5.3.2 AC → 详规
TC-AC-USER-LOGIN-01(P0,trace: AC-USER-LOGIN-01)
POST /api/public/user/login成功;返回 Token 与用户信息。
TC-AC-USER-LOGIN-02(P0,trace: AC-USER-LOGIN-02, FR-USER-LOGIN-02)
- 模拟 4 个客户端(不同
deviceFingerprint或 User-Agent):第 4 次登录后,最早 Token 调受保护接口 401/失效。
TC-AC-USER-LOGIN-03(P0,trace: AC-USER-LOGIN-03, FR-USER-LOGIN-04)
- 连续 5 次错误密码 → 锁定 15 分钟;比对管理员锁定时长差异(需求管理员 30min / 用户 15min)。
TC-AC-USER-LOGIN-04(P1,trace: AC-USER-LOGIN-04, FR-USER-LOGIN-05)
- E2E:点击忘记密码 → 文案含联系管理员。
TC-AC-USER-LOGIN-05(P2,trace: AC-USER-LOGIN-05, FR-USER-LOGIN-03)
- 配置项 OAuth 开关存在;
/api/oauth/**或配置表中开关读取断言。
TC-AC-USER-LOGIN-06(P0,trace: AC-USER-LOGIN-06, FR-USER-LOGIN-06)
- 记住我勾选:
refresh/Cookie 过期时间接近 14d;未勾选接近 24h(按实现字段断言)。
5.4 博客发布(需求 §2.4)
5.4.1 FR → 测试要点
| FR ID | 测试要点 | 优先级 |
|---|---|---|
| FR-BLOG-PUB-01 | 未登录不可编辑 | P0 |
| FR-BLOG-PUB-02 | 富文本、图片格式与大小、视频嵌入 | P0/P1 |
| FR-BLOG-PUB-03 | 手动存草稿 + 30s 自动保存 | P1 |
| FR-BLOG-PUB-04 | 可见性:公开/私密/仅粉丝 | P0 |
| FR-BLOG-PUB-05 | 已发布可改可见性即时生效 | P0 |
| FR-BLOG-PUB-06 | 必选 1 分类、≤5 标签 | P0 |
| FR-BLOG-PUB-07 | XSS 过滤;禁止非图上传 | P0 |
5.4.2 AC → 详规
TC-AC-BLOG-PUB-01(P0,trace: AC-BLOG-PUB-01, FR-BLOG-PUB-01)
- E2E:直接打开编辑路由 → 重定向登录;
redirect回跳。
TC-AC-BLOG-PUB-02(P1,trace: AC-BLOG-PUB-02, FR-BLOG-PUB-02)
- E2E/API:插入图片 URL 或上传接口;超限文件失败。
TC-AC-BLOG-PUB-03(P1,trace: AC-BLOG-PUB-03, FR-BLOG-PUB-03)
- 保存草稿后再进入编辑;内容一致;若有自动保存接口则 mock 时钟测 30s(或文档说明降常为 P2)。
TC-AC-BLOG-PUB-04(P0,trace: AC-BLOG-PUB-04, FR-BLOG-PUB-04)
- 作者可见私密文;访客
GET /api/public/article/{id}→ 404 或无权。
TC-AC-BLOG-PUB-05(P0,trace: AC-BLOG-PUB-05, FR-BLOG-PUB-05)
PUT /api/app/article/{id}改可见性后,访客再看详情变化。
TC-AC-BLOG-PUB-06(P0,trace: AC-BLOG-PUB-06, FR-BLOG-PUB-06)
- 创建携带 6 个 tagId → 拒绝。
TC-AC-BLOG-PUB-07(P0,trace: AC-BLOG-PUB-07, FR-BLOG-PUB-07)
- 上传
.exe或使用文章正文带可执行链接策略;期望拒绝或清洗。
5.5 博客列表查看(需求 §2.5)
5.5.1 FR → 测试要点
| FR ID | 测试要点 | 优先级 |
|---|---|---|
| FR-BLOG-LIST-01 | 按发布时间升降序、浏览量降序 | P0 |
| FR-BLOG-LIST-02 | 分类 + 标签组合筛选 | P0 |
| FR-BLOG-LIST-03 | 标题+正文全文检索与高亮(UI) | P0 |
| FR-BLOG-LIST-04 | 每页 15 条 | P0 |
| FR-BLOG-LIST-05 | 私密只对作者列表可见 | P0 |
| FR-BLOG-LIST-06 | 仅粉丝可见:作者+粉丝 | P0 |
| FR-BLOG-LIST-07 | 浏览量:访客/用户去重;作者本人不看加 | P0 |
| FR-BLOG-LIST-08 | 卡片展示阅读量 | P1 |
5.5.2 AC → 详规
TC-AC-BLOG-LIST-01(P0,trace: AC-BLOG-LIST-01, FR-BLOG-LIST-01)
GET /api/public/article/list带sortBy/order(以代码参数名为准);断言顺序。
TC-AC-BLOG-LIST-02(P0,trace: AC-BLOG-LIST-02, FR-BLOG-LIST-02)
- 同时
categoryId+tagId;结果集同时满足。
TC-AC-BLOG-LIST-03(P0,trace: AC-BLOG-LIST-03, FR-BLOG-LIST-03)
- 关键字搜索;E2E 断言高亮 DOM 或 API 返回摘要含关键词。
TC-AC-BLOG-LIST-04(P0,trace: AC-BLOG-LIST-04, FR-BLOG-LIST-04)
- 说明:需求原文写「第 3 页」,按 第 2 页 语义理解为分页;请求
page=2,pageSize=15,本页最多 15 条,total与页码一致。
TC-AC-BLOG-LIST-05(P0,trace: AC-BLOG-LIST-05, FR-BLOG-LIST-05)
- 作者列表可见私密文;其他用户列表不可见。
TC-AC-BLOG-LIST-06(P0,trace: AC-BLOG-LIST-06, FR-BLOG-LIST-07)
- 作者访问本人详情:
view_count两次请求不变(或增量为 0)。
TC-AC-BLOG-LIST-07(P1,trace: AC-BLOG-LIST-07, FR-BLOG-LIST-08)
- E2E:列表卡片渲染
viewCount字段非空且与接口一致。
5.5.3 FR 补充
TC-FR-BLOG-LIST-06(P0,trace: FR-BLOG-LIST-06)
- 用户 B 关注作者 A 后可见「仅粉丝可见」文;未关注则不可见。
5.6 评论功能(需求 §2.6)
5.6.1 FR → 测试要点
| FR ID | 测试要点 | 优先级 |
|---|---|---|
| FR-COMMENT-01 | 登录才能评;访客可读 | P0 |
| FR-COMMENT-02 | 最多 3 级;更深变平级 | P0 |
| FR-COMMENT-03 | 审核开关 | P0 |
| FR-COMMENT-04 | 作者标识 | P1 |
| FR-COMMENT-05 | 管理员删/屏蔽 | P0 |
| FR-COMMENT-06 | 回复站内通知 | P1 |
| FR-COMMENT-07 | XSS + 敏感词 | P0 |
5.6.2 AC → 详规
TC-AC-COMMENT-01(P0,trace: AC-COMMENT-01, FR-COMMENT-01)
- E2E:未登录点发表 → 登录引导。
- API 差异:访客调评论列表若需登录,记
implementation_gap相对 FR-COMMENT-01「访客可读」。
TC-AC-COMMENT-02(P0,trace: AC-COMMENT-02, FR-COMMENT-02)
- 构造 A→B→C→D 四级;断言 D 与 C 平级
level/结构。
TC-AC-COMMENT-03(P0,trace: AC-COMMENT-03, FR-COMMENT-03)
- 开关开启:
POST评论后前台列表无;管理员PUT /api/admin/comment/{id}/audit后可见。
TC-AC-COMMENT-04(P1,trace: AC-COMMENT-04, FR-COMMENT-04)
- 作者账号评论:
isAuthor或 UI 徽章。
TC-AC-COMMENT-05(P0,trace: AC-COMMENT-05, FR-COMMENT-05)
- 屏蔽后:其它用户不可见;发表者可见(按实现 status)。
TC-AC-COMMENT-06(P1,trace: AC-COMMENT-06, FR-COMMENT-06)
- A 回复 B 后 B 的通知列表/未读数+1(若未实现则
implementation_gap)。
TC-AC-COMMENT-07(P0,trace: AC-COMMENT-07, FR-COMMENT-07)
- 评论含
<script>:持久化字段无执行;详情接口返回转义/清洗后串。
6. 非功能性需求展开(对应需求 §3)
6.1 性能与体验(§3.1)
| TC ID | 指标来源 | 测试方法 | 通过条件 | 优先级 |
|---|---|---|---|---|
| TC-NF-PERF-01 | §3.1.1 首屏 ≤2s | Lighthouse 4G 节流 | LCP/Performance 预算 | P1 |
| TC-NF-PERF-02 | §3.1.1 交互 ≤500ms | Playwright performance.now() 采样 |
关键点击-反馈延迟 | P2 |
| TC-NF-PERF-03 | §3.1.2 列表 P95 ≤500ms | k6 | p(95)<500ms |
P1 |
| TC-NF-PERF-04 | §3.1.2 详情 P95 ≤300ms | k6 | p(95)<300ms |
P1 |
| TC-NF-PERF-05 | §3.1.2 登录注册 P95 ≤800ms | k6 | p(95)<800ms |
P1 |
| TC-NF-PERF-06 | §3.1.3 ≥500 并发在线 | k6 scenario | 错误率 <1%,无 OOM | P2 |
| TC-NF-PERF-07 | §3.1.3 列表/详情 TPS ≥100 | k6 | 达标或出报告 | P2 |
6.2 安全性(§3.2)
| TC ID | 要求 | 测试方法 | 通过条件 | 优先级 |
|---|---|---|---|---|
| TC-NF-SEC-01 | bcrypt 存储 | JDBC 读 password |
以 $2a$ 等开头 |
P0 |
| TC-NF-SEC-02 | 生产 HTTPS | 部署/config 检查 | 301 到 HTTPS | P1 |
| TC-NF-SEC-03 | SQL 注入 | 参数化模糊测试 / OWASP | 无异常泄露 | P0 |
| TC-NF-SEC-04 | XSS | API 注入脚本 | 无执行,已转义 | P0 |
| TC-NF-SEC-05 | CSRF | 需求要求校验 Token | 若项目为纯 JWT 无 Cookie 则记差异并测 CORS | P1 |
| TC-NF-SEC-06 | 敏感接口限流 | 突增登录/注册 | 429 或业务限流 | P0 |
| TC-NF-SEC-07 | 日志无密码 Token | 扫日志输出 | 无明文 | P1 |
6.3 兼容性(§3.3)
| TC ID | 范围 | 测试方法 | 优先级 |
|---|---|---|---|
| TC-NF-COMP-01 | Chrome/Edge/Safari 近三版本 | Playwright projects | P1 |
| TC-NF-COMP-02 | 视口 320~1920 | Playwright viewport 矩阵 | P1 |
| TC-NF-COMP-03 | 触控可点区域 | E2E boundingBox ≥44px |
P2 |
6.4 可用性与运维(§3.4)
| TC ID | 要求 | 测试方法 | 优先级 |
|---|---|---|---|
| TC-NF-AVAIL-01 | 月 99.5% | 监控外置,本项标 manual/ops | P3 |
| TC-NF-AVAIL-02 | 日备份 7 天 | 检查备份任务 | P3 |
| TC-NF-AVAIL-03 | RTO/RPO | 灾备演练 | P3 |
7. 权限矩阵用例(对应需求 §4.2)
通则:对每个「管理员 / 注册用户 / 访客」×「操作」组合生成 允许成功 或 401/403 断言。使用附录 A 中真实路径。
| TC ID | 矩阵坐标(模块·操作) | 角色 | 预期 |
|---|---|---|---|
| TC-PM-001 | 管理员登录·登录后台 | Admin | 成功 |
| TC-PM-002 | 管理员登录·登录后台 | User/Guest | 拒绝(无此入口或 403) |
| TC-PM-003 | 用户注册·提交申请 | Guest | 成功 |
| TC-PM-004 | 博客发布·创建 | Guest | 401 |
| TC-PM-005 | 博客发布·创建 | User | 成功 |
| TC-PM-006 | 博客浏览·公开列表 | Guest | 200 |
| TC-PM-007 | 博客浏览·私密文详情 | Guest | 404/403 |
| TC-PM-008 | 博客浏览·私密文详情 | Author | 200 |
| TC-PM-009 | 评论·发表评论 | Guest | 401 |
| TC-PM-010 | 评论·发表评论 | User | 200 |
| TC-PM-011 | 评论·删除/屏蔽 | User | 403 |
| TC-PM-012 | 评论·删除/屏蔽 | Admin | 200 |
| TC-PM-013 | 后台·用户列表 | User | 403 |
| TC-PM-014 | 后台·用户列表 | Admin | 200 |
| TC-PM-015 | 后台·分类标签 CRUD | Admin | 200 |
(实现完整矩阵时可脚本化:读取 §4.2 表生成组合。)
8. 界面与交互(对应需求 §5)
| TC ID | 来源 | 场景 | 建议工具 |
|---|---|---|---|
| TC-UI-001 | §5.1 对比度 WCAG AA | 首页/文章页 axe | Playwright+axe |
| TC-UI-002 | §5.1 深色模式 | 切换 theme DOM | E2E |
| TC-UI-003 | §5.2.1 列表卡片字段 | 标题摘要封面时间阅读量分类 | E2E 快照或字段断言 |
| TC-UI-004 | §5.2.1 悬停 scale | hover transform |
E2E 可选 |
| TC-UI-005 | §5.2.1 骨架屏 | loading 状态 | E2E |
| TC-UI-006 | §5.2.2 详情排版/灯箱/分享 | 视项目是否存在按钮 | E2E |
| TC-UI-007 | §5.2.3 编辑页分栏/自动保存指示/二次确认 | E2E | |
| TC-UI-008 | §5.2.4 移动端汉堡/单列/工具栏 | viewport 矩阵 | |
| TC-UI-009 | §5.3 空/加载/错误/超时 UI | 网络 mock |
9. 测试验收与流程(对应需求 §6)
| 需求原文 | 转化为自动化门禁 |
|---|---|
| §6.1 功能全覆盖 | Jacoco/覆盖率报告 + TC 追溯矩阵 100% 可映射 |
| §6.2.1 性能 | k6 JOB 接 CI nightly |
| §6.2.2 安全 | OWASP ZAP 或依赖 sqlmap 仅 stag、密码 bcrypt 单测 |
| §6.2.3 兼容 | Playwright 多浏览器 project |
| §6.3 P0/P1 清零 | Issue 与 @Tag("p0") 对应 |
10. API 回归清单(与需求交叉的快捷索引)
详细路径与 HTTP 方法见附录 A;实现测试时
{id}用例内替换。
认证:POST /api/public/user/login,POST /api/public/admin/login,POST /api/public/user/register,POST /api/public/refresh-token,GET /api/public/captcha
用户:GET /api/app/user/me,POST/DELETE /api/app/user/{id}/follow,GET /api/admin/user/list,PUT /api/admin/user/{id}/reset-password,PUT /api/admin/user/{id}/status
文章:GET /api/public/article/list,GET /api/public/article/{id},POST /api/app/article,PUT /api/app/article/{id},GET /api/app/article/mine,PUT /api/app/article/{id}/recycle,PUT /api/app/article/{id}/restore,DELETE /api/app/article/{id},POST /api/app/article/{id}/like,GET/DELETE /api/admin/article/*
分类/标签:GET /api/public/category/list,GET /api/public/tag/list,POST/PUT/DELETE /api/admin/category/*,POST /api/admin/tag
评论:POST /api/app/comment,DELETE /api/app/comment/{id},GET /api/app/comment/article/{articleId},POST /api/app/comment/{id}/like,GET /api/admin/comment/list,PUT /api/admin/comment/{id}/audit,DELETE /api/admin/comment/{id}
附录 A:后端路由(当前代码,jog-*)
| Controller / 前缀 | 方法摘要 |
|---|---|
/api/public(Auth) |
POST /user/login,POST /admin/login,POST /user/register,GET /captcha,POST /refresh-token |
/api/app/user |
GET /me,GET /{id},POST/DELETE /{id}/follow,POST /logout |
/api/admin/user |
GET /list,PUT /{id}/reset-password,PUT /{id}/status |
/api/public/article |
GET /list,GET /{id} |
/api/app/article |
POST /,PUT /{id},GET /mine,PUT /{id}/recycle,PUT /{id}/restore,DELETE /{id},POST /{id}/like |
/api/admin/article |
GET /list,DELETE /{id} |
/api/public/category |
GET /list |
/api/admin/category |
POST /,PUT /{id},DELETE /{id} |
/api/public/tag |
GET /list |
/api/admin/tag |
POST /(name 参数) |
/api/app/comment |
POST /,DELETE /{id},GET /article/{articleId},POST /{id}/like |
/api/admin/comment |
GET /list,PUT /{id}/audit,DELETE /{id} |
契约:实现后须将上表与 jog-frontend/src/api/**/*.js 的 url+method 对齐。
附录 B:追溯索引(验收 ID → 用例 ID 前缀)
| 需求 AC | 本文 TC |
|---|---|
| AC-ADM-LOGIN-* | TC-AC-ADM-LOGIN-0* |
| AC-USER-REG-* | TC-AC-USER-REG-0* |
| AC-USER-LOGIN-* | TC-AC-USER-LOGIN-0* |
| AC-BLOG-PUB-* | TC-AC-BLOG-PUB-0* |
| AC-BLOG-LIST-* | TC-AC-BLOG-LIST-0* |
| AC-COMMENT-* | TC-AC-COMMENT-0* |
附录 C:jog-system-requirements.md 全部 AC 一行一用例(共 37 条)
| # | 需求 AC | 本文主用例 ID | 所在章节 |
|---|---|---|---|
| 1 | AC-ADM-LOGIN-01 | TC-AC-ADM-LOGIN-01 | §5.1.2 |
| 2 | AC-ADM-LOGIN-02 | TC-AC-ADM-LOGIN-02 | §5.1.2 |
| 3 | AC-ADM-LOGIN-03 | TC-AC-ADM-LOGIN-03 | §5.1.2 |
| 4 | AC-ADM-LOGIN-04 | TC-AC-ADM-LOGIN-04 | §5.1.2 |
| 5 | AC-ADM-LOGIN-05 | TC-AC-ADM-LOGIN-05 | §5.1.2 |
| 6 | AC-USER-REG-01 | TC-AC-USER-REG-01 | §5.2.2 |
| 7 | AC-USER-REG-02 | TC-AC-USER-REG-02 | §5.2.2 |
| 8 | AC-USER-REG-03 | TC-AC-USER-REG-03 | §5.2.2 |
| 9 | AC-USER-REG-04 | TC-AC-USER-REG-04 | §5.2.2 |
| 10 | AC-USER-REG-05 | TC-AC-USER-REG-05 | §5.2.2 |
| 11 | AC-USER-LOGIN-01 | TC-AC-USER-LOGIN-01 | §5.3.2 |
| 12 | AC-USER-LOGIN-02 | TC-AC-USER-LOGIN-02 | §5.3.2 |
| 13 | AC-USER-LOGIN-03 | TC-AC-USER-LOGIN-03 | §5.3.2 |
| 14 | AC-USER-LOGIN-04 | TC-AC-USER-LOGIN-04 | §5.3.2 |
| 15 | AC-USER-LOGIN-05 | TC-AC-USER-LOGIN-05 | §5.3.2 |
| 16 | AC-USER-LOGIN-06 | TC-AC-USER-LOGIN-06 | §5.3.2 |
| 17 | AC-BLOG-PUB-01 | TC-AC-BLOG-PUB-01 | §5.4.2 |
| 18 | AC-BLOG-PUB-02 | TC-AC-BLOG-PUB-02 | §5.4.2 |
| 19 | AC-BLOG-PUB-03 | TC-AC-BLOG-PUB-03 | §5.4.2 |
| 20 | AC-BLOG-PUB-04 | TC-AC-BLOG-PUB-04 | §5.4.2 |
| 21 | AC-BLOG-PUB-05 | TC-AC-BLOG-PUB-05 | §5.4.2 |
| 22 | AC-BLOG-PUB-06 | TC-AC-BLOG-PUB-06 | §5.4.2 |
| 23 | AC-BLOG-PUB-07 | TC-AC-BLOG-PUB-07 | §5.4.2 |
| 24 | AC-BLOG-LIST-01 | TC-AC-BLOG-LIST-01 | §5.5.2 |
| 25 | AC-BLOG-LIST-02 | TC-AC-BLOG-LIST-02 | §5.5.2 |
| 26 | AC-BLOG-LIST-03 | TC-AC-BLOG-LIST-03 | §5.5.2 |
| 27 | AC-BLOG-LIST-04 | TC-AC-BLOG-LIST-04 | §5.5.2 |
| 28 | AC-BLOG-LIST-05 | TC-AC-BLOG-LIST-05 | §5.5.2 |
| 29 | AC-BLOG-LIST-06 | TC-AC-BLOG-LIST-06 | §5.5.2 |
| 30 | AC-BLOG-LIST-07 | TC-AC-BLOG-LIST-07 | §5.5.2 |
| 31 | AC-COMMENT-01 | TC-AC-COMMENT-01 | §5.6.2 |
| 32 | AC-COMMENT-02 | TC-AC-COMMENT-02 | §5.6.2 |
| 33 | AC-COMMENT-03 | TC-AC-COMMENT-03 | §5.6.2 |
| 34 | AC-COMMENT-04 | TC-AC-COMMENT-04 | §5.6.2 |
| 35 | AC-COMMENT-05 | TC-AC-COMMENT-05 | §5.6.2 |
| 36 | AC-COMMENT-06 | TC-AC-COMMENT-06 | §5.6.2 |
| 37 | AC-COMMENT-07 | TC-AC-COMMENT-07 | §5.6.2 |
FR 补充用例(无单独 AC):TC-FR-USER-REG-04(§5.2.3)、TC-FR-BLOG-LIST-06(§5.5.3)。
文档结束 — 本文档为 Cursor / AI 生成自动化测试 的单一输入源;新增需求时只改本文档并升版本号。