docs: add test framework refactoring design document
This commit is contained in:
@@ -0,0 +1,465 @@
|
|||||||
|
# 测试框架重构设计文档
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
本文档描述了将现有的E2E测试框架和开发环境测试脚本整合为一个统一、可复用的测试框架的设计方案。
|
||||||
|
|
||||||
|
## 目标
|
||||||
|
|
||||||
|
1. **统一技术栈** - 所有测试使用Playwright + TypeScript
|
||||||
|
2. **代码复用** - 创建共享的页面对象、配置和工具类
|
||||||
|
3. **类型安全** - 利用TypeScript提供完整的类型检查
|
||||||
|
4. **渐进式迁移** - 保持现有测试稳定的同时逐步整合
|
||||||
|
5. **可维护性** - 提高测试代码的可维护性和可扩展性
|
||||||
|
|
||||||
|
## 当前状态分析
|
||||||
|
|
||||||
|
### 现有测试系统
|
||||||
|
|
||||||
|
#### 1. E2E测试框架 (e2e/)
|
||||||
|
- **技术栈**: Playwright + TypeScript
|
||||||
|
- **结构**:
|
||||||
|
- 页面对象模式 (BasePage, HomePage等)
|
||||||
|
- 测试分类 (smoke, regression, performance等)
|
||||||
|
- Fixtures和配置管理
|
||||||
|
- 完整的测试报告系统
|
||||||
|
- **优势**:
|
||||||
|
- 成熟的页面对象模式
|
||||||
|
- 丰富的测试覆盖
|
||||||
|
- 良好的类型安全
|
||||||
|
- **劣势**:
|
||||||
|
- 部分工具类功能重复
|
||||||
|
- 配置分散
|
||||||
|
|
||||||
|
#### 2. 开发环境测试脚本 (scripts/)
|
||||||
|
- **技术栈**: Node.js + JavaScript
|
||||||
|
- **结构**:
|
||||||
|
- 独立的脚本文件
|
||||||
|
- 工具类 (lighthouse-runner, axe-runner等)
|
||||||
|
- Shell脚本执行器
|
||||||
|
- **优势**:
|
||||||
|
- 快速执行
|
||||||
|
- 专注于性能、SEO、可访问性
|
||||||
|
- **劣势**:
|
||||||
|
- 缺乏类型安全
|
||||||
|
- 代码复用性低
|
||||||
|
- 与E2E测试隔离
|
||||||
|
|
||||||
|
## 重构架构设计
|
||||||
|
|
||||||
|
### 整体架构
|
||||||
|
|
||||||
|
```
|
||||||
|
test-framework/
|
||||||
|
├── shared/ # 共享层
|
||||||
|
│ ├── config/ # 配置管理
|
||||||
|
│ │ ├── base.config.ts # 基础配置
|
||||||
|
│ │ ├── environments.ts # 环境配置
|
||||||
|
│ │ ├── test-pages.ts # 测试页面配置
|
||||||
|
│ │ └── test-data.ts # 测试数据配置
|
||||||
|
│ ├── pages/ # 页面对象(统一)
|
||||||
|
│ │ ├── BasePage.ts # 基础页面对象
|
||||||
|
│ │ ├── HomePage.ts # 首页
|
||||||
|
│ │ ├── AboutPage.ts # 关于页面
|
||||||
|
│ │ ├── ContactPage.ts # 联系页面
|
||||||
|
│ │ ├── ProductsPage.ts # 产品页面
|
||||||
|
│ │ ├── ServicesPage.ts # 服务页面
|
||||||
|
│ │ ├── CasesPage.ts # 案例页面
|
||||||
|
│ │ └── NewsPage.ts # 新闻页面
|
||||||
|
│ ├── utils/ # 工具类
|
||||||
|
│ │ ├── performance/ # 性能测试工具
|
||||||
|
│ │ │ ├── PerformanceMonitor.ts
|
||||||
|
│ │ │ ├── LighthouseRunner.ts
|
||||||
|
│ │ │ └── CoreWebVitals.ts
|
||||||
|
│ │ ├── seo/ # SEO测试工具
|
||||||
|
│ │ │ ├── SEOValidator.ts
|
||||||
|
│ │ │ ├── MetaTagChecker.ts
|
||||||
|
│ │ │ └── LinkValidator.ts
|
||||||
|
│ │ ├── accessibility/ # 可访问性测试工具
|
||||||
|
│ │ │ ├── AccessibilityTester.ts
|
||||||
|
│ │ │ ├── AxeRunner.ts
|
||||||
|
│ │ │ └── WCAGCompliance.ts
|
||||||
|
│ │ ├── forms/ # 表单测试工具
|
||||||
|
│ │ │ ├── FormTester.ts
|
||||||
|
│ │ │ ├── FieldValidator.ts
|
||||||
|
│ │ │ └── FormSubmitter.ts
|
||||||
|
│ │ ├── mobile/ # 移动端测试工具
|
||||||
|
│ │ │ ├── GestureSimulator.ts
|
||||||
|
│ │ │ ├── MobilePerformanceMonitor.ts
|
||||||
|
│ │ │ └── NetworkSimulator.ts
|
||||||
|
│ │ ├── reporting/ # 报告生成工具
|
||||||
|
│ │ │ ├── TestReporter.ts
|
||||||
|
│ │ │ ├── HTMLReportGenerator.ts
|
||||||
|
│ │ │ └── JSONReportGenerator.ts
|
||||||
|
│ │ └── common/ # 通用工具
|
||||||
|
│ │ ├── TestDataGenerator.ts
|
||||||
|
│ │ ├── WaitHelper.ts
|
||||||
|
│ │ └── ScreenshotHelper.ts
|
||||||
|
│ ├── fixtures/ # 共享Fixtures
|
||||||
|
│ │ ├── base.fixture.ts # 基础fixture
|
||||||
|
│ │ ├── performance.fixture.ts # 性能测试fixture
|
||||||
|
│ │ ├── accessibility.fixture.ts # 可访问性测试fixture
|
||||||
|
│ │ └── mobile.fixture.ts # 移动端测试fixture
|
||||||
|
│ └── types/ # 类型定义
|
||||||
|
│ ├── page.types.ts # 页面对象类型
|
||||||
|
│ ├── test.types.ts # 测试类型
|
||||||
|
│ ├── performance.types.ts # 性能测试类型
|
||||||
|
│ └── accessibility.types.ts # 可访问性测试类型
|
||||||
|
│
|
||||||
|
├── e2e/ # E2E测试(保持不变)
|
||||||
|
│ ├── tests/
|
||||||
|
│ │ ├── smoke/ # 冒烟测试
|
||||||
|
│ │ ├── regression/ # 回归测试
|
||||||
|
│ │ ├── performance/ # 性能测试
|
||||||
|
│ │ ├── accessibility/ # 可访问性测试
|
||||||
|
│ │ ├── mobile/ # 移动端测试
|
||||||
|
│ │ ├── security/ # 安全测试
|
||||||
|
│ │ ├── visual/ # 视觉回归测试
|
||||||
|
│ │ └── responsive/ # 响应式测试
|
||||||
|
│ ├── fixtures/
|
||||||
|
│ └── playwright.config.ts
|
||||||
|
│
|
||||||
|
├── dev-audit/ # 开发环境测试(重构)
|
||||||
|
│ ├── performance/
|
||||||
|
│ │ ├── performance.spec.ts # 性能审计测试
|
||||||
|
│ │ ├── lighthouse.spec.ts # Lighthouse测试
|
||||||
|
│ │ └── core-web-vitals.spec.ts # Core Web Vitals测试
|
||||||
|
│ ├── seo/
|
||||||
|
│ │ ├── seo.spec.ts # SEO检查测试
|
||||||
|
│ │ ├── meta-tags.spec.ts # Meta标签测试
|
||||||
|
│ │ └── links.spec.ts # 链接检查测试
|
||||||
|
│ ├── accessibility/
|
||||||
|
│ │ ├── accessibility.spec.ts # 可访问性测试
|
||||||
|
│ │ └── wcag-compliance.spec.ts # WCAG合规测试
|
||||||
|
│ └── forms/
|
||||||
|
│ ├── forms.spec.ts # 表单验证测试
|
||||||
|
│ └── validation.spec.ts # 字段验证测试
|
||||||
|
│
|
||||||
|
└── reports/ # 测试报告
|
||||||
|
├── html/ # HTML报告
|
||||||
|
├── json/ # JSON报告
|
||||||
|
└── screenshots/ # 截图
|
||||||
|
```
|
||||||
|
|
||||||
|
### 核心设计原则
|
||||||
|
|
||||||
|
#### 1. 页面对象统一
|
||||||
|
所有测试使用相同的页面对象,确保测试的一致性和可维护性。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// shared/pages/BasePage.ts
|
||||||
|
export class BasePage {
|
||||||
|
readonly page: Page;
|
||||||
|
readonly config: TestConfig;
|
||||||
|
|
||||||
|
constructor(page: Page, config?: TestConfig) {
|
||||||
|
this.page = page;
|
||||||
|
this.config = config || defaultConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通用方法
|
||||||
|
async navigate(url: string): Promise<void> { }
|
||||||
|
async click(locator: Locator | string): Promise<void> { }
|
||||||
|
async fill(locator: Locator | string, value: string): Promise<void> { }
|
||||||
|
|
||||||
|
// 性能监控方法
|
||||||
|
async measurePerformance(): Promise<PerformanceMetrics> { }
|
||||||
|
async getCoreWebVitals(): Promise<CoreWebVitals> { }
|
||||||
|
|
||||||
|
// 可访问性方法
|
||||||
|
async runAccessibilityCheck(): Promise<AccessibilityResult> { }
|
||||||
|
|
||||||
|
// SEO方法
|
||||||
|
async validateSEO(): Promise<SEOResult> { }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. 配置集中管理
|
||||||
|
所有配置集中管理,便于维护和切换环境。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// shared/config/environments.ts
|
||||||
|
export const environments = {
|
||||||
|
development: {
|
||||||
|
baseURL: 'http://localhost:3000',
|
||||||
|
timeout: 5000,
|
||||||
|
retries: 3
|
||||||
|
},
|
||||||
|
staging: {
|
||||||
|
baseURL: 'https://staging.example.com',
|
||||||
|
timeout: 10000,
|
||||||
|
retries: 2
|
||||||
|
},
|
||||||
|
production: {
|
||||||
|
baseURL: 'https://www.example.com',
|
||||||
|
timeout: 10000,
|
||||||
|
retries: 1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// shared/config/test-pages.ts
|
||||||
|
export const testPages = {
|
||||||
|
home: { name: '首页', url: '/', selectors: { title: 'h1' } },
|
||||||
|
about: { name: '关于我们', url: '/about', selectors: { title: 'h1' } },
|
||||||
|
contact: { name: '联系我们', url: '/contact', selectors: { title: 'h1' } },
|
||||||
|
products: { name: '产品', url: '/products', selectors: { title: 'h1' } },
|
||||||
|
services: { name: '服务', url: '/services', selectors: { title: 'h1' } },
|
||||||
|
cases: { name: '案例', url: '/cases', selectors: { title: 'h1' } },
|
||||||
|
news: { name: '新闻', url: '/news', selectors: { title: 'h1' } }
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. 工具类复用
|
||||||
|
创建可复用的工具类,避免代码重复。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// shared/utils/performance/PerformanceMonitor.ts
|
||||||
|
export class PerformanceMonitor {
|
||||||
|
async measurePageLoad(page: Page): Promise<PageLoadMetrics> { }
|
||||||
|
async measureCoreWebVitals(page: Page): Promise<CoreWebVitals> { }
|
||||||
|
async measureResourceTiming(page: Page): Promise<ResourceTiming[]> { }
|
||||||
|
}
|
||||||
|
|
||||||
|
// shared/utils/accessibility/AccessibilityTester.ts
|
||||||
|
export class AccessibilityTester {
|
||||||
|
async runAxeScan(page: Page): Promise<AxeResults> { }
|
||||||
|
async checkWCAGCompliance(page: Page): Promise<WCAGResult> { }
|
||||||
|
async generateAccessibilityReport(results: AxeResults): Promise<string> { }
|
||||||
|
}
|
||||||
|
|
||||||
|
// shared/utils/seo/SEOValidator.ts
|
||||||
|
export class SEOValidator {
|
||||||
|
async validateMetaTags(page: Page): Promise<MetaTagResult> { }
|
||||||
|
async validateLinks(page: Page): Promise<LinkResult> { }
|
||||||
|
async validateHeadings(page: Page): Promise<HeadingResult> { }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4. 类型安全
|
||||||
|
使用TypeScript提供完整的类型定义。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// shared/types/performance.types.ts
|
||||||
|
export interface PerformanceMetrics {
|
||||||
|
loadTime: number;
|
||||||
|
domContentLoaded: number;
|
||||||
|
firstPaint: number;
|
||||||
|
firstContentfulPaint: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CoreWebVitals {
|
||||||
|
largestContentfulPaint: number;
|
||||||
|
firstInputDelay: number;
|
||||||
|
cumulativeLayoutShift: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// shared/types/accessibility.types.ts
|
||||||
|
export interface AccessibilityResult {
|
||||||
|
score: number;
|
||||||
|
violations: Violation[];
|
||||||
|
passes: number;
|
||||||
|
incomplete: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Violation {
|
||||||
|
id: string;
|
||||||
|
impact: string;
|
||||||
|
description: string;
|
||||||
|
help: string;
|
||||||
|
helpUrl: string;
|
||||||
|
nodes: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// shared/types/test.types.ts
|
||||||
|
export interface TestConfig {
|
||||||
|
baseURL: string;
|
||||||
|
timeout: number;
|
||||||
|
retries: number;
|
||||||
|
environment: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TestResult {
|
||||||
|
name: string;
|
||||||
|
status: 'passed' | 'failed' | 'skipped';
|
||||||
|
duration: number;
|
||||||
|
errors?: Error[];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 实施计划
|
||||||
|
|
||||||
|
### 阶段1:创建共享层(不破坏现有测试)
|
||||||
|
|
||||||
|
**目标**: 创建共享的基础层,为后续迁移做准备
|
||||||
|
|
||||||
|
**任务**:
|
||||||
|
1. 创建 `test-framework/shared/` 目录结构
|
||||||
|
2. 提取E2E测试中的页面对象到shared层
|
||||||
|
3. 创建统一的配置管理系统
|
||||||
|
4. 创建工具类框架
|
||||||
|
5. 创建类型定义
|
||||||
|
|
||||||
|
**时间估计**: 2-3天
|
||||||
|
|
||||||
|
**验收标准**:
|
||||||
|
- [ ] 共享层目录结构创建完成
|
||||||
|
- [ ] 页面对象迁移完成
|
||||||
|
- [ ] 配置管理系统创建完成
|
||||||
|
- [ ] 工具类框架创建完成
|
||||||
|
- [ ] 类型定义创建完成
|
||||||
|
- [ ] 现有E2E测试仍然正常运行
|
||||||
|
|
||||||
|
### 阶段2:迁移开发环境测试
|
||||||
|
|
||||||
|
**目标**: 将开发环境测试迁移到TypeScript和Playwright
|
||||||
|
|
||||||
|
**任务**:
|
||||||
|
1. 创建 `test-framework/dev-audit/` 目录结构
|
||||||
|
2. 将性能审计脚本迁移到TypeScript
|
||||||
|
3. 将SEO检查脚本迁移到TypeScript
|
||||||
|
4. 将可访问性测试迁移到TypeScript
|
||||||
|
5. 将表单验证迁移到TypeScript
|
||||||
|
6. 使用共享的页面对象和工具类
|
||||||
|
7. 保留scripts/作为向后兼容
|
||||||
|
|
||||||
|
**时间估计**: 3-4天
|
||||||
|
|
||||||
|
**验收标准**:
|
||||||
|
- [ ] 所有开发环境测试迁移完成
|
||||||
|
- [ ] 使用TypeScript重写
|
||||||
|
- [ ] 使用Playwright API
|
||||||
|
- [ ] 使用共享的页面对象
|
||||||
|
- [ ] 使用共享的工具类
|
||||||
|
- [ ] 测试结果与原有脚本一致
|
||||||
|
- [ ] 旧scripts/仍然可用
|
||||||
|
|
||||||
|
### 阶段3:优化和清理
|
||||||
|
|
||||||
|
**目标**: 优化测试框架,移除冗余代码
|
||||||
|
|
||||||
|
**任务**:
|
||||||
|
1. 移除旧的scripts/目录
|
||||||
|
2. 统一测试报告格式
|
||||||
|
3. 添加共享的测试数据生成器
|
||||||
|
4. 优化测试执行性能
|
||||||
|
5. 添加测试覆盖率统计
|
||||||
|
6. 更新文档
|
||||||
|
|
||||||
|
**时间估计**: 2-3天
|
||||||
|
|
||||||
|
**验收标准**:
|
||||||
|
- [ ] 旧scripts/目录移除
|
||||||
|
- [ ] 测试报告格式统一
|
||||||
|
- [ ] 测试数据生成器创建完成
|
||||||
|
- [ ] 测试执行性能优化
|
||||||
|
- [ ] 测试覆盖率统计添加
|
||||||
|
- [ ] 文档更新完成
|
||||||
|
|
||||||
|
### 阶段4:集成和验证
|
||||||
|
|
||||||
|
**目标**: 验证整个测试框架的集成和功能
|
||||||
|
|
||||||
|
**任务**:
|
||||||
|
1. 运行完整的测试套件
|
||||||
|
2. 验证所有测试结果
|
||||||
|
3. 性能基准测试
|
||||||
|
4. 创建CI/CD集成
|
||||||
|
5. 编写使用文档
|
||||||
|
|
||||||
|
**时间估计**: 2-3天
|
||||||
|
|
||||||
|
**验收标准**:
|
||||||
|
- [ ] 完整测试套件运行成功
|
||||||
|
- [ ] 所有测试结果验证通过
|
||||||
|
- [ ] 性能基准测试完成
|
||||||
|
- [ ] CI/CD集成完成
|
||||||
|
- [ ] 使用文档编写完成
|
||||||
|
|
||||||
|
## 测试执行流程
|
||||||
|
|
||||||
|
### E2E测试执行
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 运行所有E2E测试
|
||||||
|
npm run test:e2e
|
||||||
|
|
||||||
|
# 运行特定类型的E2E测试
|
||||||
|
npm run test:e2e:smoke
|
||||||
|
npm run test:e2e:regression
|
||||||
|
npm run test:e2e:performance
|
||||||
|
```
|
||||||
|
|
||||||
|
### 开发环境测试执行
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 运行所有开发环境测试
|
||||||
|
npm run test:dev-audit
|
||||||
|
|
||||||
|
# 运行特定类型的开发环境测试
|
||||||
|
npm run test:dev-audit:performance
|
||||||
|
npm run test:dev-audit:seo
|
||||||
|
npm run test:dev-audit:accessibility
|
||||||
|
npm run test:dev-audit:forms
|
||||||
|
```
|
||||||
|
|
||||||
|
### 综合测试执行
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 运行所有测试
|
||||||
|
npm run test:all
|
||||||
|
|
||||||
|
# 生成综合报告
|
||||||
|
npm run test:report
|
||||||
|
```
|
||||||
|
|
||||||
|
## 测试报告
|
||||||
|
|
||||||
|
### 报告格式
|
||||||
|
|
||||||
|
1. **HTML报告** - 可视化的测试报告,包含图表和详细信息
|
||||||
|
2. **JSON报告** - 机器可读的测试结果,便于CI/CD集成
|
||||||
|
3. **截图** - 测试失败时的截图,便于调试
|
||||||
|
|
||||||
|
### 报告内容
|
||||||
|
|
||||||
|
- 测试摘要(总数、通过数、失败数、跳过数)
|
||||||
|
- 测试详情(每个测试的执行时间、状态、错误信息)
|
||||||
|
- 性能指标(页面加载时间、Core Web Vitals等)
|
||||||
|
- 可访问性评分(WCAG合规性、违规项等)
|
||||||
|
- SEO评分(Meta标签、链接、标题等)
|
||||||
|
- 表单验证结果(必填字段、格式验证等)
|
||||||
|
|
||||||
|
## 风险和缓解措施
|
||||||
|
|
||||||
|
### 风险1:迁移过程中破坏现有测试
|
||||||
|
|
||||||
|
**缓解措施**:
|
||||||
|
- 采用渐进式迁移策略
|
||||||
|
- 每个阶段都进行完整的测试验证
|
||||||
|
- 保留原有测试作为备份
|
||||||
|
|
||||||
|
### 风险2:性能测试结果不一致
|
||||||
|
|
||||||
|
**缓解措施**:
|
||||||
|
- 建立性能基准
|
||||||
|
- 使用相同的测试环境
|
||||||
|
- 多次运行取平均值
|
||||||
|
|
||||||
|
### 风险3:学习曲线
|
||||||
|
|
||||||
|
**缓解措施**:
|
||||||
|
- 提供详细的文档
|
||||||
|
- 提供示例代码
|
||||||
|
- 进行团队培训
|
||||||
|
|
||||||
|
## 成功标准
|
||||||
|
|
||||||
|
1. **功能完整性** - 所有现有测试功能在新框架中都能正常工作
|
||||||
|
2. **性能提升** - 测试执行时间不超过原有框架的120%
|
||||||
|
3. **代码质量** - TypeScript编译无错误,测试覆盖率不低于80%
|
||||||
|
4. **可维护性** - 代码结构清晰,易于理解和维护
|
||||||
|
5. **文档完整性** - 提供完整的文档和示例
|
||||||
|
|
||||||
|
## 总结
|
||||||
|
|
||||||
|
本设计文档提供了一个渐进式的测试框架重构方案,通过创建共享层、统一技术栈、提高代码复用性,最终实现一个统一、可维护、可扩展的测试框架。该方案采用渐进式迁移策略,确保在重构过程中不破坏现有测试,同时为未来的测试开发提供良好的基础。
|
||||||
Reference in New Issue
Block a user