每位开发者每次修改 / 提交 / 发布前必读。 不按规范执行导致的核心业务回归事故,由当事人承担。
修改 → 跑核心业务测试 → 通过 → 提交 → 跑一次完整核心业务测试 → 通过 → 推送/发布
本项目的产品核心链路 = "书籍 大纲 → 内容 → 音频" 端到端流程。
| 步骤 | 涉及 API | 涉及前端 |
|---|---|---|
| 创建书 | POST /api/book-generator/langgraph/books |
pages/book-generator/create.vue |
| 生成大纲 | POST /api/book-generator/langgraph/books/:id/outline |
pages/book-generator/detail.vue |
| 生成内容 | POST /api/book-generator/langgraph/books/:id/chapters |
pages/book-generator/detail.vue |
| 生成音频 | POST /api/book-generator/langgraph/books/:id/audio |
pages/book-generator/detail.vue |
| 播放/查看 | GET /api/book-generator/langgraph/books/:id 等 |
pages/book-generator/{index,detail,chapter-detail}.vue |
任何用户能感知到的功能缺陷,几乎全部会落在这条链路上。
| 场景 | 必跑? | 命令 |
|---|---|---|
改了 server/src/modules/book-generator/** 任何文件 |
✅ 必须 | ./scripts/run-core-business-test.sh |
改了 my-uniapp-vue3/src/pages/book-generator/** 任何文件 |
✅ 必须 | ./scripts/run-core-business-test.sh |
改了 my-uniapp-vue3/src/utils/book-generator-api.ts |
✅ 必须 | ./scripts/run-core-business-test.sh |
改了 server/prisma/schema.prisma(Book / BookChapter 表) |
✅ 必须 | ./scripts/run-core-business-test.sh |
| 提交前(commit) | ✅ 必须(hook 已强制) | git commit 自动跑 |
| 推送前(push) | ✅ 必须(hook 已强制) | git push 自动跑 |
| 部署/发布前 | ✅ 必须 | ./scripts/run-core-business-test.sh 或 cd server && npm run test:core |
| 改了无关文件 | ⚪ 可选,但建议跑 | 同上 |
识别"改动是否触发必跑"的方法:
git diff --name-only HEAD~5 | grep -E "(book-generator|book-generator-api|schema.prisma)"
# 有输出 = 触发必跑
# 自动起后端+前端再跑测试
./scripts/run-core-business-test.sh
# 服务已起好(快)
SKIP_SERVER=1 ./scripts/run-core-business-test.sh
# Windows
scripts\run-core-business-test.bat
npx playwright test --project=core-business --config=tests/playwright.config.ts
cd server && npm run test:core
位置: tests/e2e/core-business/book-core-flow.spec.ts
用例清单:
| # | 名称 | 类型 | 验证点 |
|---|---|---|---|
| CORE-1 | 预估字数与时长 | API | /api/book-generator/langgraph/estimate 返回 audioMinutes.avg > 0 |
| CORE-2 | 创建书籍(fast-path) | API | POST /books 立即返回 outlining + bookId |
| CORE-3 | 大纲+内容:轮询直到 chapters 有真实内容 | API | 轮询直到 chapters[*].genStage === 'content_completed' |
| CORE-4 | 触发音频生成(best-effort) | API | POST /audio + 轮询 audio-status 全部完成 |
| CORE-5 | 书籍至少完成内容阶段 | API | 校验 genStage >= content_completed |
| CORE-6~9 | 列表/创建/详情/章节详情页能加载 | UI | hash 路由 + #app 根可见 |
参考时长: 健康环境 3 ~ 5 分钟(含真实 LLM + TTS 调用)。
完整说明: tests/e2e/core-business/README.md
测试失败
│
├─ 看 tests/test-results/report/index.html (HTML 报告)
├─ 看 tests/test-results/results.json (结构化结果)
│
├─ 失败的是 CORE-1~3, 5~9(API / UI)
│ └─ 大概率是后端接口契约或前端渲染问题 → 修代码,重新跑
│
├─ 失败的是 CORE-4(音频)
│ ├─ 真实环境(生产 / 健康 staging):必查 TTS Provider
│ │ ├─ 阿里的 CosyVoice / 百炼 TTS 配额?
│ │ ├─ OSS bucket 写权限?
│ │ └─ 详见 server/logs/tts.log
│ └─ 本地开发环境(mock TTS):可能是环境问题,可跳过
│ └─ test.skip() 已写入,warn 即可
│
└─ 一直超时(> 10 分钟都没过)
└─ 检查:
├─ 后端 tsx watch 是否在反复重启?
├─ 数据库是否可达?(tests/global-setup.ts 会验)
├─ LLM API 配额 / 网络?
└─ 看 server/logs/server.log [LangGraph] 段
强制: 失败立即定位并修复,不允许"应该没问题"放行。修复后重跑测试直到通过。
仓库提供 git hooks,提交 / 推送前自动检查。
# 安装(一次)
./scripts/install-hooks.sh
# 卸载(如果你需要绕过)
./scripts/install-hooks.sh --uninstall
装好后:
⚠️ 如果你必须紧急绕过(hotfix / 撤回到旧版本):
git commit --no-verify # 跳过 pre-commit
git push --no-verify # 跳过 pre-push
绕过等于背着责任提交,请在 PR 描述里写明原因。
| # | 检查项 | 通过标准 |
|---|---|---|
| 1 | ./scripts/run-core-business-test.sh |
8 passed, 0 failed |
| 2 | cd server && npm run test:unit |
全部 pass |
| 3 | cd server && npm run build && npm start 烟测 |
/health 返回 200 |
| 4 | 部署后 curl <线上>/api/book-generator/langgraph/books/{任意bookId} |
返回 code:0 或 code:404(不是 500) |
| 5 | 部署后 curl <线上>/<某个 audioUrl> |
200 + content-length > 1024 |
详细步骤见 AUTO_DEPLOY.md。
./scripts/run-core-business-test.sh 看绿色 8 pass./scripts/install-hooks.shtests/e2e/core-business/README.md 了解每个 CORE-* 用例.plans/audiobook-v2-ux/docs/invariants.md 了解业务不变量如果本文档与 AUTO_DEPLOY.md / CLAUDE.md 冲突,以本文档为准。