docs: add comprehensive documentation for tiered testing
This commit is contained in:
@@ -0,0 +1,310 @@
|
||||
# 分层测试优化指南
|
||||
|
||||
## 概述
|
||||
|
||||
本文档介绍如何使用分层测试系统来优化测试执行效率,缩短测试时间,提高测试质量。
|
||||
|
||||
## 测试层级
|
||||
|
||||
### 快速层 (Fast Tier)
|
||||
|
||||
**特点:**
|
||||
- 执行时间:30秒内
|
||||
- 测试类型:冒烟测试、API测试、基础功能验证
|
||||
- 并行度:高(75% workers)
|
||||
- 失败策略:快速失败(failFast: true)
|
||||
- 重试次数:1次
|
||||
|
||||
**适用场景:**
|
||||
- 每次代码提交后的快速验证
|
||||
- 持续集成(CI)中的第一道防线
|
||||
- 关键路径的功能验证
|
||||
|
||||
**示例:**
|
||||
```typescript
|
||||
test.describe('API快速测试 @smoke @critical', () => {
|
||||
test('应该能够获取内容列表', async ({ request }) => {
|
||||
const response = await request.get('/api/admin/content');
|
||||
expect(response.status()).toBe(200);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 标准层 (Standard Tier)
|
||||
|
||||
**特点:**
|
||||
- 执行时间:60秒内
|
||||
- 测试类型:功能测试、响应式测试、移动端核心功能
|
||||
- 并行度:中(50% workers)
|
||||
- 失败策略:继续执行(failFast: false)
|
||||
- 重试次数:2次
|
||||
|
||||
**适用场景:**
|
||||
- 功能分支合并前的验证
|
||||
- 回归测试的主要部分
|
||||
- 跨浏览器/设备测试
|
||||
|
||||
**示例:**
|
||||
```typescript
|
||||
test.describe('管理后台功能测试 @admin @regression', () => {
|
||||
test('应该能够创建和编辑新闻', async ({ page }) => {
|
||||
await page.goto('/admin/news');
|
||||
await page.click('[data-testid="create-news-btn"]');
|
||||
// ... 测试逻辑
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 深度层 (Deep Tier)
|
||||
|
||||
**特点:**
|
||||
- 执行时间:120秒内
|
||||
- 测试类型:视觉回归、性能测试、完整回归测试
|
||||
- 并行度:低(25% workers)
|
||||
- 失败策略:继续执行(failFast: false)
|
||||
- 重试次数:3次
|
||||
|
||||
**适用场景:**
|
||||
- 发布前的完整验证
|
||||
- 夜间/周末的全面回归
|
||||
- 性能和视觉质量检查
|
||||
|
||||
**示例:**
|
||||
```typescript
|
||||
test.describe('首页视觉回归测试 @visual @regression', () => {
|
||||
test('首页应该与基准截图一致', async ({ page }) => {
|
||||
await page.goto('/');
|
||||
await expect(page).toHaveScreenshot('homepage.png');
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 本地开发
|
||||
|
||||
#### 运行快速层测试
|
||||
```bash
|
||||
npm run test:tier:fast
|
||||
```
|
||||
|
||||
#### 运行标准层测试
|
||||
```bash
|
||||
npm run test:tier:standard
|
||||
```
|
||||
|
||||
#### 运行深度层测试
|
||||
```bash
|
||||
npm run test:tier:deep
|
||||
```
|
||||
|
||||
#### 运行所有层级测试
|
||||
```bash
|
||||
npm run test:tier:all
|
||||
```
|
||||
|
||||
### CI/CD集成
|
||||
|
||||
#### Woodpecker CI配置
|
||||
|
||||
项目已配置Woodpecker CI工作流,支持分层测试自动化执行:
|
||||
|
||||
1. **完整工作流** (`.woodpecker/test-tiered.yml`)
|
||||
- 依次执行快速层、标准层、深度层
|
||||
- 前一层失败则停止后续执行
|
||||
- 生成测试报告并上传
|
||||
- 发送通知
|
||||
|
||||
2. **简化工作流** (`.woodpecker/test-tiered-simple.yml`)
|
||||
- 根据分支类型执行不同层级
|
||||
- main分支:执行所有层级
|
||||
- develop分支:执行快速层和标准层
|
||||
- 其他分支:仅执行快速层
|
||||
|
||||
### 测试标记
|
||||
|
||||
使用测试标记来分类和管理测试:
|
||||
|
||||
```typescript
|
||||
test.describe('测试套件 @smoke @critical', () => {
|
||||
test('测试用例 @api @regression', async ({ page }) => {
|
||||
// 测试逻辑
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
**可用标记:**
|
||||
- `@smoke` - 冒烟测试
|
||||
- `@critical` - 关键测试
|
||||
- `@regression` - 回归测试
|
||||
- `@visual` - 视觉测试
|
||||
- `@performance` - 性能测试
|
||||
- `@api` - API测试
|
||||
- `@mobile` - 移动端测试
|
||||
- `@responsive` - 响应式测试
|
||||
- `@admin` - 管理后台测试
|
||||
- `@a11y` - 可访问性测试
|
||||
- `@security` - 安全测试
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 识别慢速测试
|
||||
|
||||
使用性能优化工具分析测试执行时间:
|
||||
|
||||
```bash
|
||||
cd e2e && node test-optimizer-simple-test.js
|
||||
```
|
||||
|
||||
工具会生成优化报告,包含:
|
||||
- 慢速测试列表
|
||||
- 优化建议
|
||||
- 潜在时间节省
|
||||
|
||||
### 优化建议
|
||||
|
||||
#### 1. 减少等待时间
|
||||
```typescript
|
||||
// 不推荐
|
||||
await page.waitForTimeout(5000);
|
||||
|
||||
// 推荐
|
||||
await page.waitForSelector('[data-testid="result"]', { timeout: 5000 });
|
||||
```
|
||||
|
||||
#### 2. 优化选择器
|
||||
```typescript
|
||||
// 不推荐
|
||||
await page.click('div > div > button');
|
||||
|
||||
// 推荐
|
||||
await page.click('[data-testid="submit-btn"]');
|
||||
```
|
||||
|
||||
#### 3. 并行测试
|
||||
```typescript
|
||||
// playwright.config.tiered.ts
|
||||
{
|
||||
fullyParallel: true, // 启用并行执行
|
||||
workers: '75%', // 使用75%的CPU核心
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. 测试拆分
|
||||
```typescript
|
||||
// 不推荐:单个大测试
|
||||
test('完整的用户注册流程', async ({ page }) => {
|
||||
await page.goto('/register');
|
||||
await page.fill('[name="email"]', 'test@example.com');
|
||||
await page.fill('[name="password"]', 'password123');
|
||||
await page.fill('[name="confirm"]', 'password123');
|
||||
await page.click('[type="submit"]');
|
||||
await page.waitForURL('/dashboard');
|
||||
await page.click('[data-testid="profile"]');
|
||||
// ... 更多步骤
|
||||
});
|
||||
|
||||
// 推荐:拆分为多个小测试
|
||||
test.describe('用户注册流程', () => {
|
||||
test('应该能够填写注册表单', async ({ page }) => {
|
||||
await page.goto('/register');
|
||||
await page.fill('[name="email"]', 'test@example.com');
|
||||
await page.fill('[name="password"]', 'password123');
|
||||
await page.fill('[name="confirm"]', 'password123');
|
||||
});
|
||||
|
||||
test('应该能够提交注册', async ({ page }) => {
|
||||
await page.goto('/register');
|
||||
await page.fill('[name="email"]', 'test@example.com');
|
||||
await page.fill('[name="password"]', 'password123');
|
||||
await page.fill('[name="confirm"]', 'password123');
|
||||
await page.click('[type="submit"]');
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## 监控和告警
|
||||
|
||||
### 测试执行历史
|
||||
|
||||
系统会自动记录每次测试执行的历史数据,包括:
|
||||
- 执行时间
|
||||
- 成功/失败状态
|
||||
- 测试标记
|
||||
|
||||
历史数据存储在 `e2e/test-history.json`。
|
||||
|
||||
### 告警规则
|
||||
|
||||
系统会根据以下规则触发告警:
|
||||
|
||||
1. **测试通过率低于80%** (Critical)
|
||||
2. **测试通过率低于90%** (High)
|
||||
3. **测试执行时间超过30分钟** (Medium)
|
||||
4. **失败测试数量超过10个** (High)
|
||||
5. **深度层测试存在失败** (Critical)
|
||||
|
||||
### 查看告警
|
||||
|
||||
告警信息会输出到控制台,并保存在 `test-results/alerts.json`。
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 测试分层原则
|
||||
|
||||
- **快速层**:只包含最关键的测试,确保在5分钟内完成
|
||||
- **标准层**:包含大部分功能测试,确保在30分钟内完成
|
||||
- **深度层**:包含完整的回归测试,可以接受较长的执行时间
|
||||
|
||||
### 2. 测试标记使用
|
||||
|
||||
- 为每个测试套件添加合适的标记
|
||||
- 优先使用 `@smoke` 和 `@critical` 标记关键测试
|
||||
- 使用 `@regression` 标记需要定期运行的测试
|
||||
|
||||
### 3. 持续优化
|
||||
|
||||
- 定期运行性能优化工具
|
||||
- 关注慢速测试的优化
|
||||
- 根据历史数据调整测试分层
|
||||
|
||||
### 4. CI/CD集成
|
||||
|
||||
- 在每次提交时运行快速层测试
|
||||
- 在合并PR时运行标准层测试
|
||||
- 在发布前运行深度层测试
|
||||
|
||||
## 故障排查
|
||||
|
||||
### 测试超时
|
||||
|
||||
**问题:** 测试执行超时
|
||||
|
||||
**解决方案:**
|
||||
1. 检查是否有不必要的等待
|
||||
2. 增加测试超时时间
|
||||
3. 检查网络请求是否正常
|
||||
|
||||
### 测试不稳定
|
||||
|
||||
**问题:** 测试时好时坏
|
||||
|
||||
**解决方案:**
|
||||
1. 增加重试次数
|
||||
2. 使用更稳定的等待策略
|
||||
3. 检查是否有竞态条件
|
||||
|
||||
### 执行时间过长
|
||||
|
||||
**问题:** 测试执行时间超过预期
|
||||
|
||||
**解决方案:**
|
||||
1. 运行性能优化工具
|
||||
2. 检查是否有慢速测试
|
||||
3. 考虑调整测试分层
|
||||
|
||||
## 参考资源
|
||||
|
||||
- [Playwright文档](https://playwright.dev/)
|
||||
- [测试金字塔](https://martinfowler.com/articles/practical-test-pyramid.html)
|
||||
- [Woodpecker CI文档](https://woodpecker-ci.org/docs/)
|
||||
Reference in New Issue
Block a user