docs: 更新测试分层规范与覆盖率要求

This commit is contained in:
2026-08-27 22:25:59 +08:00
parent 5569921df6
commit 1254e3d5d0
+25 -1
View File
@@ -122,12 +122,35 @@ lpt-fe/src/
- 页面新增功能域时先抽 composable(参考 `useSessionHistory` / `useSummaryReport` / `useSessionExpectation`),不要继续膨胀 StartTask 等大页面组件。 - 页面新增功能域时先抽 composable(参考 `useSessionHistory` / `useSummaryReport` / `useSessionExpectation`),不要继续膨胀 StartTask 等大页面组件。
- 通用解析器、格式化工具放 `src/utils/`,不埋在组件内(如大纲文本转树应放 utils)。 - 通用解析器、格式化工具放 `src/utils/`,不埋在组件内(如大纲文本转树应放 utils)。
### 测试规范 ### 测试规范(分层策略)
测试按「金字塔」分层组织,新增功能优先补中间层:
| 层 | 位置 | 职责 | 风格 |
|----|------|------|------|
| 逻辑单测 | `src/__tests__/{api,composables,utils,router}/` | 纯函数、composable、request 封装 | 直接调用,快、准 |
| **交互式集成测试** | `src/__tests__/integration/` | 页面关键用户路径 | 真实挂载 + 模拟点击 + DOM 断言 |
| E2E | `e2e/` | 真实浏览器回归 | Playwright + `page.route` 拦后端 |
### 交互式集成测试要求
- 必须真实挂载组件(不 `shallow`),通过 `trigger('click')``setValue()``find('…')` 模拟并断言用户可见行为;禁止 `wrapper.vm.xxx()` 直调内部方法作为主要测试手段(历史遗留的 vm 直调在改动到时迁移)。
- 页面关键路径必须有集成测试:登录、学习会话暂停/继续、任务创建/更新、回忆对比等新增关键流程同步补 `integration/*.spec.ts`
- 只断言应用自身行为(API 调用参数、提示、路由、状态文案),不要重复验证 Element Plus 内部行为;jsdom 下 EP 的 callback 式表单校验不可靠(空表单也可能判有效),「校验拦截」类断言由 e2e 在真实浏览器覆盖。
- 已知兼容问题:`el-tag` 在 jsdom + VTU 全量挂载时 vnode mounted 钩子崩溃(EP 2.8),集成测试统一 `stubs: { ElTag: true }`;依赖 mind-elixir 的 `MindMapViewer` 用可编程 stub(提供 `toOutline`)。
- E2E 定位优先使用角色与可访问名称(`getByRole('button', { name })``getByPlaceholder`),仅断言 EP 内部 UI(校验错误、消息弹层)时才用类选择器;改文案不应导致大面积碎测。
### 逻辑单测要求
- 单元测试必须直接测试真实代码:直接调用 composable、挂载真实组件、使用真实路由;禁止把组件或 composable 的逻辑复制到测试里再自测。 - 单元测试必须直接测试真实代码:直接调用 composable、挂载真实组件、使用真实路由;禁止把组件或 composable 的逻辑复制到测试里再自测。
- 测试中可以 mock 外部依赖(API、Element Plus 服务、Audio 等),但被测逻辑本身必须来自生产模块。 - 测试中可以 mock 外部依赖(API、Element Plus 服务、Audio 等),但被测逻辑本身必须来自生产模块。
- `script setup` 内部状态需要测试访问时,通过 `defineExpose` 暴露,而不是在测试里重写一份相同逻辑。 - `script setup` 内部状态需要测试访问时,通过 `defineExpose` 暴露,而不是在测试里重写一份相同逻辑。
### 覆盖率
- `npm run test:coverage` 输出 v8 覆盖率报告(`coverage/`),阈值配置在 `vite.config.ts`,作为棘轮只升不降:任何低于阈值的改动不允许提交。
- 提升覆盖率优先补集成测试与零覆盖模块(当前缺口:Review、ReviewDetail、fetchTitle、markdown 渲染分支),不为凑数写快照式断言。
### 提交前检查 ### 提交前检查
- 运行 `npx vue-tsc --noEmit``npm run lint`0 error 才可提交;`no-explicit-any` 允许存量警告,新代码避免 any)、`npm run test``npm run build` - 运行 `npx vue-tsc --noEmit``npm run lint`0 error 才可提交;`no-explicit-any` 允许存量警告,新代码避免 any)、`npm run test``npm run build`
@@ -149,6 +172,7 @@ npm run test
npm run test:e2e npm run test:e2e
npx vue-tsc --noEmit npx vue-tsc --noEmit
npm run lint npm run lint
npm run test:coverage
``` ```
编译检查也可以使用: 编译检查也可以使用: