Files
张翔 08ea5fbe98 feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
2026-03-28 14:37:29 +08:00

155 lines
2.6 KiB
Markdown

# 测试最佳实践
## 测试设计原则
### 1. 测试金字塔
- 70% 单元测试
- 20% 集成测试
- 10% E2E测试
### 2. 测试独立性
每个测试用例应该独立运行,不依赖其他测试。
### 3. 测试可重复性
测试结果应该稳定可重复,不受环境影响。
### 4. 测试快速反馈
优先测试核心业务流程,提供快速反馈。
## 编写测试的最佳实践
### 1. 使用描述性的测试名称
```typescript
test('TC-USER-001: 用户登录成功', async ({ page }) => {
// 测试代码
});
```
### 2. 使用测试夹具
```typescript
test('示例测试', async ({
page,
testConfig,
testLogger,
testDataManager
}) => {
testLogger.startTest('示例测试');
// 测试代码
testLogger.endTest('示例测试', 'passed');
});
```
### 3. 记录测试步骤
```typescript
testLogger.startStep('步骤1: 打开登录页面');
await page.goto('/login');
testLogger.endStep('步骤1: 打开登录页面', 'passed');
```
### 4. 使用辅助工具
```typescript
const formHelper = new FormHelper(page);
await formHelper.fillField('input[name="username"]', 'testuser');
await formHelper.submitForm();
```
### 5. 清理测试数据
```typescript
test.afterEach(async ({ testDataManager }) => {
await testDataManager.cleanup();
});
```
## 常见陷阱
### 1. 硬编码等待时间
❌ 不推荐:
```typescript
await page.waitForTimeout(5000);
```
✅ 推荐:
```typescript
await page.waitForSelector('.element', { state: 'visible' });
```
### 2. 测试数据冲突
❌ 不推荐:
```typescript
const username = 'testuser'; // 固定用户名
```
✅ 推荐:
```typescript
const username = `testuser_${Date.now()}`; // 唯一用户名
```
### 3. 测试用例依赖
❌ 不推荐:
```typescript
test('测试1', async () => {
// 创建数据
});
test('测试2', async () => {
// 依赖测试1的数据
});
```
✅ 推荐:
```typescript
test('测试1', async ({ testDataManager }) => {
const data = await testDataManager.createTestData();
// 使用数据
});
test('测试2', async ({ testDataManager }) => {
const data = await testDataManager.createTestData();
// 使用独立数据
});
```
## 性能优化
### 1. 并行执行
```typescript
// playwright.config.ts
export default defineConfig({
workers: 4, // 并行执行
});
```
### 2. 跳过慢速测试
```typescript
test.skip('慢速测试', async () => {
// 测试代码
});
```
### 3. 使用项目分组
```typescript
// playwright.config.ts
export default defineConfig({
projects: [
{ name: 'fast', testMatch: '**/*.fast.spec.ts' },
{ name: 'slow', testMatch: '**/*.slow.spec.ts' }
]
});
```