# 测试策略
## 版本信息
| 版本 | 日期 | 描述 | 作者 |
|------|------|------|------|
| 4.0 | 2025-10-31 | 基于实际测试结构更新Taro小程序测试策略,添加最新测试模式 | Winston |
| 3.2 | 2025-10-20 | 修正Taro测试工具引用,更新为实际使用的测试框架 | Winston |
| 3.1 | 2025-10-16 | 修正测试路径描述,更新Taro测试说明 | Winston |
| 3.0 | 2025-10-15 | 更新为出行服务项目测试策略 | Winston |
| 2.6 | 2025-10-15 | 完成遗留测试文件迁移到统一的tests目录结构 | Winston |
| 2.5 | 2025-10-14 | 更新测试文件位置到统一的tests目录结构 | Claude |
| 2.4 | 2025-09-20 | 更新测试策略与主架构文档版本一致 | Winston |
## 概述
本文档定义了出行服务项目的完整测试策略,基于现有的测试基础设施和最佳实践。测试策略遵循测试金字塔模型,确保代码质量、功能稳定性和系统可靠性。
**注意**: 本测试策略主要针对主项目(后端API + React管理后台),Taro小程序项目有独立的测试体系,详见 [Taro测试规范文档](../taro-test.md)。
## 测试金字塔策略
### 主项目测试体系 (后端API + React管理后台)
#### 单元测试 (Unit Tests)
- **范围**: 单个函数、类或组件
- **目标**: 验证独立单元的correctness
- **位置**:
- 前端: `web/tests/unit/client/**/*.test.{ts,tsx}`
- 后端: `web/tests/unit/server/**/*.test.{ts,tsx}`
- **框架**: Vitest
- **覆盖率目标**: ≥ 80%
- **执行频率**: 每次代码变更
#### 集成测试 (Integration Tests)
- **范围**: 多个组件/服务协作
- **目标**: 验证模块间集成和交互
- **位置**:
- 前端: `web/tests/integration/client/**/*.test.{ts,tsx}`
- 后端: `web/tests/integration/server/**/*.test.{ts,tsx}`
- **框架**: Vitest + Testing Library + hono/testing
- **覆盖率目标**: ≥ 60%
- **执行频率**: 每次API变更
#### E2E测试 (End-to-End Tests)
- **范围**: 完整用户流程
- **目标**: 验证端到端业务流程
- **位置**: `web/tests/e2e/**/*.test.{ts,tsx}`
- **框架**: Playwright
- **覆盖率目标**: 关键用户流程100%
- **执行频率**: 每日或每次重大变更
### Taro小程序测试体系 (独立项目)
**注意**: Taro小程序项目位于 `mini/` 目录,是独立的项目结构,拥有自己的测试配置和运行方式。基于实际测试结构分析,当前测试体系如下:
#### 组件测试 (Component Tests)
- **范围**: Taro小程序组件
- **目标**: 验证组件渲染和交互行为
- **位置**: `mini/tests/components/**/*.test.{ts,tsx}`
- **框架**: Jest + @testing-library/react + 自定义Taro组件mock
- **覆盖率目标**: ≥ 70%
- **执行频率**: 每次组件变更
- **示例文件**: [Button.test.tsx](mini/tests/components/Button.test.tsx)
#### 页面测试 (Page Tests)
- **范围**: 小程序页面级测试,包含完整业务逻辑
- **目标**: 验证页面生命周期、路由、状态管理和API集成
- **位置**: `mini/tests/pages/**/*.test.{ts,tsx}`
- **框架**: Jest + @testing-library/react + React Query + Taro API mock
- **覆盖率目标**: ≥ 60%
- **执行频率**: 每次页面变更
- **最新示例**:
- [order-page.test.tsx](mini/tests/pages/order-page.test.tsx) - 订单页面完整测试
- [profile.test.tsx](mini/tests/pages/profile.test.tsx) - 个人中心页面测试
#### 单元测试 (Unit Tests)
- **范围**: 工具函数、业务逻辑、状态管理
- **目标**: 验证独立业务逻辑单元的正确性
- **位置**: `mini/tests/unit/**/*.test.{ts,tsx}`
- **框架**: Jest + 自定义测试工具
- **覆盖率目标**: ≥ 80%
- **执行频率**: 每次业务逻辑变更
- **示例文件**: [payment.test.ts](mini/tests/unit/payment.test.ts)
#### 测试基础设施
- **测试配置**: `mini/tests/setup.ts` - 完整的Taro组件和API mock
- **测试工具**: `mini/tests/utils.ts` - 测试辅助函数和mock数据生成器
- **Mock文件**: `mini/tests/__mocks__/` - Taro API和组件mock
- `taroMock.ts` - 统一的Taro API mock,包含所有常用API
- `taroMock.ts` - 通过jest.config.js的moduleNameMapper重定向@tarojs/taro
- **快照**: `mini/tests/__snapshots__/` - UI快照测试
## 测试环境配置
### 开发环境
```typescript
// vitest.config.ts - 开发环境配置
export default defineConfig({
test: {
projects: [
// Node.js 环境项目 - 后端测试
{
test: {
include: [
'tests/unit/server/**/*.test.{ts,js}',
'tests/integration/server/**/*.test.{ts,js}'
],
// ... 其他配置
}
},
// Happy DOM 环境项目 - 前端组件测试
{
test: {
include: [
'tests/unit/client/**/*.test.{ts,js,tsx,jsx}',
'tests/integration/client/**/*.test.{ts,js,tsx,jsx}'
],
// ... 其他配置
}
}
]
}
});
```
### CI/CD环境
```yaml
# GitHub Actions 测试配置
name: Test Pipeline
jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- run: npm run test:api
- run: npm run test:components
integration-tests:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:15
env:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: test_db
steps:
- run: npm run test:integration
e2e-tests:
runs-on: ubuntu-latest
steps:
- run: npm run test:e2e:chromium
```
## 测试覆盖率标准
### 各层覆盖率要求
| 测试类型 | 最低要求 | 目标要求 | 关键模块要求 |
|----------|----------|----------|--------------|
| 单元测试 | 70% | 80% | 90% |
| 集成测试 | 50% | 60% | 70% |
| E2E测试 | 关键流程100% | 主要流程80% | - |
### 关键模块定义
- **认证授权模块**: 必须达到90%单元测试覆盖率
- **数据库操作模块**: 必须达到85%单元测试覆盖率
- **核心业务逻辑**: 必须达到80%集成测试覆盖率
- **用户管理功能**: 必须100% E2E测试覆盖
## 测试数据管理
### 测试数据策略
```typescript
// 测试数据工厂模式
export function createTestUser(overrides = {}): User {
return {
id: 1,
username: 'testuser',
email: 'test@example.com',
createdAt: new Date(),
...overrides
};
}
// 使用示例
const adminUser = createTestUser({ role: 'admin' });
const inactiveUser = createTestUser({ active: false });
```
### 数据库测试策略
- **单元测试**: 使用内存数据库或完全mock
- **集成测试**: 使用专用测试数据库,事务回滚
- **E2E测试**: 使用接近生产环境的数据库
### 数据清理策略
1. **事务回滚** (推荐)
2. **数据库清理** (每个测试后)
3. **测试数据隔离** (使用唯一标识符)
## 测试执行流程
### 本地开发测试
#### 主项目测试
```bash
# 运行所有测试
npm test
# 运行单元测试
npm run test:unit
# 运行集成测试
npm run test:integration
# 运行E2E测试
npm run test:e2e:chromium
# 生成覆盖率报告
npm run test:coverage
```
#### Taro小程序项目测试
```bash
# 进入mini目录
cd mini
# 运行所有Taro测试
pnpm test
# 运行H5环境测试
pnpm run test:h5
# 运行微信小程序环境测试
pnpm run test:weapp
# 生成覆盖率报告
pnpm run test:coverage
# 运行特定测试文件
pnpm test -- order-page.test.tsx
pnpm test -- profile.test.tsx
```
### CI/CD流水线测试
1. **代码推送** → 触发测试流水线
2. **单元测试** → 快速反馈,必须通过
3. **集成测试** → 验证模块集成,必须通过
4. **E2E测试** → 验证完整流程,建议通过
5. **覆盖率检查** → 满足最低要求
6. **测试报告** → 生成详细报告
## 质量门禁
### 测试通过标准
- ✅ 所有单元测试通过
- ✅ 所有集成测试通过
- ✅ 关键E2E测试通过
- ✅ 覆盖率满足最低要求
- ✅ 无性能回归
- ✅ 安全测试通过
### 失败处理流程
1. **测试失败** → 立即通知开发团队
2. **分析根本原因** → 确定是测试问题还是代码问题
3. **优先修复** → 阻塞性问题必须立即修复
4. **重新测试** → 修复后重新运行测试
5. **文档更新** → 更新测试策略和案例
## 安全测试策略
### 安全测试要求
- **输入验证测试**: 所有API端点必须测试SQL注入、XSS等攻击
- **认证测试**: 测试令牌验证、权限控制
- **数据保护**: 测试敏感数据泄露风险
- **错误处理**: 测试错误信息是否泄露敏感数据
### 安全测试工具
- **OWASP ZAP**: 自动化安全扫描
- **npm audit**: 依赖漏洞检查
- **自定义安全测试**: 针对业务逻辑的安全测试
## 性能测试策略
### 性能测试要求
- **API响应时间**: < 100ms (p95)
- **数据库查询性能**: < 50ms (p95)
- **并发用户数**: 支持100+并发用户
- **资源使用**: CPU < 70%, 内存 < 80%
### 性能测试工具
- **k6**: 负载测试
- **autocannon**: API性能测试
- **Playwright**: E2E性能监控
## 最新测试模式和最佳实践
### Taro小程序测试模式
#### 页面级集成测试模式
基于最新的 [order-page.test.tsx](mini/tests/pages/order-page.test.tsx) 和 [profile.test.tsx](mini/tests/pages/profile.test.tsx) 测试文件,推荐以下测试模式:
```typescript
// 1. 完整的测试环境设置
const createTestQueryClient = () => new QueryClient({
defaultOptions: {
queries: { retry: false },
},
})
// 2. 组件包装器
const Wrapper = ({ children }: { children: React.ReactNode }) => (
{children}
)
// 3. 完整的Mock策略 - 使用统一的taroMock
import taroMock from '../../tests/__mocks__/taroMock'
// 在测试中直接使用导入的mock函数
taroMock.showToast.mockClear()
taroMock.navigateTo.mockClear()
// 4. 测试数据工厂
const mockRouteData = {
id: 1,
name: '测试路线',
price: 100,
vehicleType: '商务车'
}
```
#### 业务逻辑测试覆盖
- **订单流程**: 支付验证、乘客管理、价格计算
- **用户交互**: 按钮点击、表单验证、状态切换
- **API集成**: React Query hooks、错误处理、加载状态
- **多端兼容**: H5和小程序环境适配
#### Mock策略说明
- **统一Mock**: 使用 `taroMock.ts` 统一管理所有Taro API mock
- **模块重定向**: 通过jest.config.js的moduleNameMapper将@tarojs/taro重定向到taroMock
- **函数级控制**: 每个mock函数都可以独立控制和验证调用情况
### 测试代码规范
```typescript
// 良好的测试示例 - 基于最新测试文件
describe('OrderPage', () => {
beforeEach(() => {
jest.clearAllMocks()
// 设置测试数据
})
it('应该正确渲染订单页面', () => {
render(
)
expect(screen.getByTestId('order-navbar')).toBeInTheDocument()
expect(screen.getByTestId('activity-name')).toHaveTextContent('测试活动')
})
it('应该处理支付验证逻辑', async () => {
render(
)
const payButton = screen.getByTestId('pay-button')
fireEvent.click(payButton)
await waitFor(() => {
expect(taroMock.showToast).toHaveBeenCalledWith({
title: '请先获取手机号',
icon: 'none',
duration: 2000
})
})
})
it('应该处理不同出行模式', () => {
// 测试拼车和包车模式
mockUseRouter.mockReturnValue({
params: { type: 'carpool' }
})
render(
)
expect(screen.getByTestId('service-type')).toHaveTextContent('班次信息')
})
})
```
### 测试命名约定
- **文件名**: `[page/component].test.tsx` 或 `[feature].test.ts`
- **描述**: 使用「应该...」格式描述测试行为
- **用例**: 明确描述测试场景和预期结果
- **测试数据**: 使用工厂函数创建测试数据
- **Mock策略**: 完整的API和组件mock覆盖
## 监控和报告
### 测试监控指标
- **测试通过率**: > 95%
- **测试执行时间**: < 10分钟(单元+集成)
- **测试稳定性**: 无flaky tests
- **覆盖率趋势**: 持续改进或保持
### 测试报告要求
- **HTML报告**: 详细的覆盖率报告
- **JUnit报告**: CI/CD集成
- **自定义报告**: 业务指标测试报告
- **历史趋势**: 测试质量趋势分析
## 附录
### 相关文档
- [集成测试最佳实践](../integration-testing-best-practices.md)
- [编码标准](./coding-standards.md)
- [API设计规范](./api-design-integration.md)
### 工具版本
- **Vitest**: 3.2.4
- **Testing Library**: 16.3.0
- **Playwright**: 1.55.0
- **hono/testing**: 内置(Hono 4.8.5)
- **Jest**: 29.7.0 (Taro小程序)
- **React Testing Library**: 16.3.0 (Taro小程序)
- **React Query**: 5.8.4 (Taro小程序)
### 更新日志
| 日期 | 版本 | 描述 |
|------|------|------|
| 2025-10-31 | 4.0 | 基于实际测试结构更新Taro小程序测试策略,添加最新测试模式 |
| 2025-10-20 | 3.2 | 修正Taro测试工具引用,更新为实际使用的测试框架 |
| 2025-10-16 | 3.1 | 修正测试路径描述,更新Taro测试说明 |
| 2025-10-15 | 3.0 | 更新为出行服务项目测试策略 |
| 2025-10-15 | 2.6 | 完成遗留测试文件迁移到统一的tests目录结构 |
| 2025-10-14 | 2.5 | 重构测试文件结构,统一到tests目录 |
| 2025-09-20 | 2.4 | 更新版本与主架构文档一致 |
| 2025-09-19 | 1.0 | 初始版本,基于现有测试基础设施 |
---
**文档状态**: 正式版
**下次评审**: 2025-12-31