175 lines
3.2 KiB
Markdown
175 lines
3.2 KiB
Markdown
# 测试体系模块
|
||
|
||
## 概述
|
||
追光AI使用 Vitest 作为测试框架,已建立 5 个测试套件覆盖 132 个测试,目标覆盖率 80%+。测试文件位于 `src/__tests__/` 目录。
|
||
|
||
---
|
||
|
||
## 基础设施
|
||
|
||
### vitest.config.ts
|
||
```typescript
|
||
import { defineConfig } from "vitest/config";
|
||
import path from "path";
|
||
|
||
export default defineConfig({
|
||
test: {
|
||
globals: true,
|
||
environment: "node",
|
||
setupFiles: ["./vitest.setup.ts"],
|
||
include: ["src/__tests__/**/*.test.ts"],
|
||
coverage: {
|
||
provider: "v8",
|
||
reporter: ["text", "json", "html"],
|
||
thresholds: {
|
||
lines: 80,
|
||
branches: 80,
|
||
functions: 80,
|
||
statements: 80,
|
||
},
|
||
},
|
||
},
|
||
resolve: {
|
||
alias: { "@": path.resolve(__dirname, "./src") },
|
||
},
|
||
});
|
||
```
|
||
|
||
### vitest.setup.ts
|
||
- 全局 mock 配置
|
||
- Prisma mock 初始化
|
||
- 测试环境清理
|
||
|
||
### tsconfig 配置
|
||
```json
|
||
{
|
||
"compilerOptions": {
|
||
"types": ["vitest/globals"]
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 测试套件
|
||
|
||
### 1. level-config.test.ts
|
||
- **测试数量**: 28
|
||
- **覆盖**: `src/lib/level-config.ts`
|
||
- **测试内容**:
|
||
- 20个等级边界值检查
|
||
- 等级徽章映射
|
||
- 每日限额表
|
||
- 积分→等级转换
|
||
- 下一级积分计算
|
||
|
||
### 2. elo.test.ts
|
||
- **测试数量**: 24
|
||
- **覆盖**: ELO 评分计算逻辑
|
||
- **测试内容**:
|
||
- 基础 ELO 计算
|
||
- K因子变化
|
||
- 平局处理
|
||
- 极端分差
|
||
|
||
### 3. forum-hot.test.ts
|
||
- **测试数量**: 30
|
||
- **覆盖**: 论坛热度排序算法
|
||
- **测试内容**:
|
||
- 热度公式计算
|
||
- 时间衰减
|
||
- 回复加权
|
||
- 点赞加权
|
||
- 置顶优先
|
||
|
||
### 4. achievements.test.ts
|
||
- **测试数量**: 26
|
||
- **覆盖**: 成就系统逻辑
|
||
- **测试内容**:
|
||
- 成就解锁条件
|
||
- 进度计算
|
||
- 徽章授予
|
||
- 边界条件
|
||
|
||
### 5. points-reward.test.ts
|
||
- **测试数量**: 24
|
||
- **覆盖**: `src/lib/points-reward.ts`
|
||
- **测试内容**:
|
||
- 各操作积分奖励
|
||
- 每日上限检查
|
||
- Streak freeze 逻辑
|
||
- 商店购买消耗
|
||
- 等级升级触发
|
||
|
||
---
|
||
|
||
## 运行命令
|
||
|
||
```bash
|
||
# 运行所有测试
|
||
npx vitest run
|
||
|
||
# 监听模式
|
||
npx vitest
|
||
|
||
# 生成覆盖率报告
|
||
npx vitest run --coverage
|
||
|
||
# 运行特定测试文件
|
||
npx vitest run src/__tests__/level-config.test.ts
|
||
|
||
# UI 模式
|
||
npx vitest --ui
|
||
```
|
||
|
||
---
|
||
|
||
## 测试规范
|
||
|
||
### 文件命名
|
||
- 测试文件: `*.test.ts`
|
||
- 目录: `src/__tests__/`
|
||
|
||
### 测试结构
|
||
```typescript
|
||
import { describe, it, expect, beforeEach, vi } from "vitest";
|
||
|
||
describe("模块名", () => {
|
||
beforeEach(() => {
|
||
// setup
|
||
});
|
||
|
||
describe("功能点", () => {
|
||
it("应该满足某条件", () => {
|
||
// arrange
|
||
// act
|
||
// assert
|
||
});
|
||
|
||
it("应该处理边界情况", () => {
|
||
// ...
|
||
});
|
||
|
||
it("应该优雅处理错误", () => {
|
||
// ...
|
||
});
|
||
});
|
||
});
|
||
```
|
||
|
||
### 测试原则
|
||
- 每个 `it` 测试单一行为
|
||
- 使用 `describe` 组织相关测试
|
||
- Arrange → Act → Assert 三段式
|
||
- 覆盖正常路径 + 边界条件 + 错误路径
|
||
- 禁止 `.skip` 除非有明确 TODO 注释
|
||
- Mock 外部依赖(Prisma、外部 API)
|
||
|
||
### 覆盖率目标
|
||
| 指标 | 目标 |
|
||
|------|------|
|
||
| 行覆盖率 | ≥ 80% |
|
||
| 分支覆盖率 | ≥ 80% |
|
||
| 函数覆盖率 | ≥ 80% |
|
||
| 语句覆盖率 | ≥ 80% |
|