docs: 设计文档补充自动化测试框架节(Vitest+jsdom+CI 测试 workflow)

This commit is contained in:
jacobxu666
2026-08-20 13:45:10 +08:00
parent 8de35e85c2
commit 611b493c84
@@ -82,11 +82,22 @@ export function answersMatch(expected: string[], given: string): boolean; // 任
- DB schema(quiz JSON 存储不变)、ai-grade.ts、错题本 WrongRow、积分/达标规则、周测组卷。
- 孩子端之外:seed、overview、记录管理全不动。
## 测试清单(手工,项目无自动化测试框架)
### 6. 自动化测试框架(用户追加要求:没有就搭建)
1. 编辑页:JSON 文本域消失,题目卡片流可新增/编辑/删除/上下移/保存。
2. 四种题型表单字段联动正确;应用题的 rubric/answer 开关切换字段正确。
3. 新建 answer 应用题(答案 0.5 与 1/2 都填):孩子端拍照 + 填 `1/2` → 判对满分;填 `2/3` → 判错 0 分,错题本含照片与判定。
4. 存量 rubric 题:孩子照旧拍照 AI 逐点评分,进错题本逐点判定。
5. 服务端校验:answer 模式缺 answers / rubric 模式缺 reference → 对应报错不保存。
6. 部署 jump.hn12301.net 后线上复验。
- 框架:**Vitest**(TS 原生、零配置成本),+ jsdom + @testing-library/react 用于组件测试(QuestionForm/QuestionList 题型联动)。
- 关键可测逻辑**沉淀为纯函数**进 lib,不做 DB/网络依赖:
- 新增 `src/lib/answer-match.ts`(归一化/等价,已设计于 §2)
- 现 `validateQuestionsJson`(parent/actions.ts 私有)→ 迁到新 `src/lib/question-validation.ts` 导出,`saveExamPaper` 引用之(行为不变)
- 测试覆盖:answer-match 全分支(数值/文本/单位/边界);question-validation 全题型 + judgeMode 新分支(accept/reject 用例);QuestionForm 题型联动渲染与非法输入提示。
- 脚本:`"test": "vitest run"`;vitest.config.ts 配 `@` alias。
- CI:Gitea Actions 新增 `.gitea/workflows/test.yaml`,push 即跑 `npm ci && npm run test`(runner 为 node:24-slim,已可用)。
## 测试清单(手工 + 自动化)
- 自动化:上述 Vitest 用例全绿;`npm run test` 通过。
- 手工:编辑页 JSON 文本域消失,题目卡片流可新增/编辑/删除/上下移/保存。
- 手工:四种题型表单字段联动正确;应用题的 rubric/answer 开关切换字段正确。
- 手工:新建 answer 应用题(答案 0.5 与 1/2 都填):孩子端拍照 + 填 `1/2` → 判对满分;填 `2/3` → 判错 0 分,错题本含照片与判定。
- 手工:存量 rubric 题:孩子照旧拍照 AI 逐点评分,进错题本逐点判定。
- 手工:服务端校验:answer 模式缺 answers / rubric 模式缺 reference → 对应报错不保存。
- 部署 jump.hn12301.net 后线上复验。