# 测试策略与质量门禁

本文档用于收敛当前仓库在 `M6 / issue-20` 阶段的最小测试基建，目标不是追求覆盖率数字，而是先保证后续重构、教程迭代与回归验证有稳定入口。

## 当前测试分层

### `apps/server`

- 单元测试：`vitest --config ./vitest.config.mts`
- E2E：`vitest --config ./vitest.e2e.config.mts`
- 类型检查：`tsc --noEmit -p tsconfig.build.json`
- 当前重点覆盖：
  - 鉴权与角色
  - 简历草稿 / 发布流
  - AI provider / 文件提取 / 缓存报告
  - Markdown / PDF 导出

### `apps/web`

- 组件 / API 测试：`vitest`
- 当前重点覆盖：
  - 公开简历读取
  - 语言切换
  - 主题切换
  - 导出下载链接

### `apps/admin`

- 组件 / API / 本地会话测试：`vitest`
- 当前重点覆盖：
  - 登录表单
  - 鉴权 API
  - 角色动作面板
  - 下载入口
  - `localStorage` 会话读写

## 根级统一入口

在仓库根目录统一保留以下命令：

- `pnpm test`
  - 运行 workspace 中的测试任务
- `pnpm test:unit`
  - 运行 `server / web / admin` 的单元与组件测试
- `pnpm test:e2e`
  - 运行 `apps/server` 的 E2E
- `pnpm test:ci`
  - 运行单测与 E2E，作为 CI 主入口
- `pnpm typecheck:all`
  - 运行 workspace 类型检查
- `pnpm build:all`
  - 运行 workspace 构建

## 当前质量门禁

在进入 `dev` 前，至少应满足：

- `pnpm test:unit` 通过
- `pnpm test:e2e` 通过
- `pnpm typecheck:all` 通过
- `pnpm build:all` 通过

## 当前不追求的内容

- 不追求覆盖率门槛
- 不引入复杂测试矩阵
- 不强制所有前端都补 E2E
- 不在当前阶段引入视觉回归测试

## 后续可扩展方向

- 为 `web / admin` 增加更系统的页面级测试
- 把关键 smoke case 纳入 CI 分层执行
- 在部署前补充最小上线验收清单

## 当前统一说明

- 当前三端单测 / 组件测试统一使用 `Vitest`
- `apps/server` 因为使用 `NestJS`，额外采用“显式依赖注入”来避免运行时依赖 TypeScript 装饰器元数据
- 这样做的目的，是让测试框架统一后仍保持教学上的可解释性与运行稳定性
