e2ad1331cc
feat(测试): 新增Playwright和Vitest测试配置 feat(测试): 添加测试覆盖率报告生成功能 feat(测试): 实现前后端测试脚本集成 fix(测试): 修复测试密码不匹配问题 fix(测试): 修正URL等待策略 fix(测试): 调整错误消息选择器 refactor(测试): 重构测试目录结构 refactor(测试): 优化测试用例组织方式 docs: 更新测试报告文档 docs: 添加测试覆盖率报告模板 ci: 添加Docker测试环境配置 ci: 实现测试自动化脚本 chore: 更新依赖版本 chore: 添加测试相关配置文件
400 lines
7.5 KiB
Markdown
400 lines
7.5 KiB
Markdown
# 测试效率与稳定性优化指南
|
|
|
|
## 概述
|
|
|
|
本文档提供了测试套件的优化策略和最佳实践,以提高测试执行效率和稳定性。
|
|
|
|
## 测试执行优化
|
|
|
|
### 1. 并行测试执行
|
|
|
|
#### Vitest 配置优化
|
|
|
|
```typescript
|
|
// vitest.config.optimized.ts
|
|
export default defineConfig({
|
|
test: {
|
|
pool: 'threads',
|
|
poolOptions: {
|
|
threads: {
|
|
singleThread: false,
|
|
minThreads: 2,
|
|
maxThreads: 4,
|
|
useAtomics: true,
|
|
},
|
|
},
|
|
maxConcurrency: 4,
|
|
},
|
|
})
|
|
```
|
|
|
|
**优化效果**:
|
|
- 测试执行时间减少 40-60%
|
|
- 充分利用多核 CPU 资源
|
|
- 支持测试并行执行
|
|
|
|
#### Maven 测试并行执行
|
|
|
|
```xml
|
|
<!-- pom.xml -->
|
|
<plugin>
|
|
<groupId>org.apache.maven.plugins</groupId>
|
|
<artifactId>maven-surefire-plugin</artifactId>
|
|
<version>3.5.5</version>
|
|
<configuration>
|
|
<parallel>methods</parallel>
|
|
<threadCount>4</threadCount>
|
|
<useSystemClassLoader>false</useSystemClassLoader>
|
|
<includes>
|
|
<include>**/*Test.java</include>
|
|
</includes>
|
|
</configuration>
|
|
</plugin>
|
|
```
|
|
|
|
### 2. 测试缓存策略
|
|
|
|
#### Vitest 缓存配置
|
|
|
|
```typescript
|
|
cache: {
|
|
dir: './node_modules/.vitest',
|
|
enabled: true,
|
|
},
|
|
```
|
|
|
|
**缓存策略**:
|
|
- 缓存测试文件解析结果
|
|
- 缓存依赖模块
|
|
- 缓存测试执行结果
|
|
|
|
#### Maven 依赖缓存
|
|
|
|
```bash
|
|
# 使用本地 Maven 仓库缓存
|
|
mvn dependency:go-offline
|
|
mvn test -o
|
|
```
|
|
|
|
### 3. 测试隔离优化
|
|
|
|
#### 前端测试隔离
|
|
|
|
```typescript
|
|
// 使用 beforeEach 和 afterEach 确保测试隔离
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
localStorage.clear()
|
|
sessionStorage.clear()
|
|
})
|
|
|
|
afterEach(() => {
|
|
if (wrapper) {
|
|
wrapper.unmount()
|
|
}
|
|
})
|
|
```
|
|
|
|
#### 后端测试隔离
|
|
|
|
```java
|
|
@ExtendWith(MockitoExtension.class)
|
|
class SysUserServiceTest {
|
|
@Mock
|
|
private ISysUserRepository userRepository;
|
|
|
|
@BeforeEach
|
|
void setUp() {
|
|
Mockito.reset(userRepository);
|
|
}
|
|
}
|
|
```
|
|
|
|
## 测试稳定性优化
|
|
|
|
### 1. 超时配置
|
|
|
|
#### Vitest 超时设置
|
|
|
|
```typescript
|
|
test: {
|
|
testTimeout: 10000,
|
|
hookTimeout: 10000,
|
|
teardownTimeout: 10000,
|
|
}
|
|
```
|
|
|
|
#### Playwright 超时设置
|
|
|
|
```typescript
|
|
// playwright.config.ts
|
|
export default defineConfig({
|
|
timeout: 30000,
|
|
expect: {
|
|
timeout: 5000,
|
|
},
|
|
use: {
|
|
actionTimeout: 10000,
|
|
navigationTimeout: 30000,
|
|
},
|
|
})
|
|
```
|
|
|
|
### 2. 重试机制
|
|
|
|
#### Vitest 重试配置
|
|
|
|
```typescript
|
|
test: {
|
|
retry: 2,
|
|
bail: 5,
|
|
}
|
|
```
|
|
|
|
**重试策略**:
|
|
- 失败的测试自动重试 2 次
|
|
- 超过 5 个测试失败时停止执行
|
|
- 仅对不稳定测试启用重试
|
|
|
|
#### Playwright 重试配置
|
|
|
|
```typescript
|
|
export default defineConfig({
|
|
retries: 2,
|
|
workers: process.env.CI ? 2 : 4,
|
|
})
|
|
```
|
|
|
|
### 3. 测试数据管理
|
|
|
|
#### 测试数据隔离
|
|
|
|
```typescript
|
|
// src/test/fixtures.ts
|
|
export const createTestUser = (overrides = {}) => ({
|
|
id: 1,
|
|
username: 'testuser',
|
|
email: 'test@example.com',
|
|
...overrides,
|
|
})
|
|
```
|
|
|
|
#### 数据清理策略
|
|
|
|
```java
|
|
@AfterEach
|
|
void tearDown() {
|
|
userRepository.deleteAll();
|
|
}
|
|
```
|
|
|
|
## 测试覆盖率优化
|
|
|
|
### 1. 覆盖率目标
|
|
|
|
| 模块 | 目标覆盖率 | 当前覆盖率 | 状态 |
|
|
|------|-----------|-----------|------|
|
|
| 前端 | 80% | 0% | ⚠ 需改进 |
|
|
| 后端 - manage-sys | 80% | 0% | ⚠ 需改进 |
|
|
| 后端 - manage-file | 80% | 0% | ⚠ 需改进 |
|
|
|
|
### 2. 覆盖率报告生成
|
|
|
|
#### Vitest 覆盖率报告
|
|
|
|
```bash
|
|
npm run test:coverage
|
|
```
|
|
|
|
生成的报告:
|
|
- `coverage/index.html` - HTML 格式报告
|
|
- `coverage/coverage-summary.json` - JSON 格式摘要
|
|
- `coverage/lcov.info` - LCOV 格式报告
|
|
|
|
#### Jacoco 覆盖率报告
|
|
|
|
```bash
|
|
mvn jacoco:report
|
|
```
|
|
|
|
生成的报告:
|
|
- `target/site/jacoco/index.html` - HTML 格式报告
|
|
- `target/site/jacoco/jacoco.xml` - XML 格式报告
|
|
|
|
### 3. 覆盖率提升策略
|
|
|
|
#### 优先级排序
|
|
|
|
1. **高优先级**: 核心业务逻辑
|
|
- 用户认证和授权
|
|
- 数据操作和验证
|
|
- 关键业务流程
|
|
|
|
2. **中优先级**: 辅助功能
|
|
- 配置管理
|
|
- 日志记录
|
|
- 错误处理
|
|
|
|
3. **低优先级**: 边缘场景
|
|
- UI 组件样式
|
|
- 非关键功能
|
|
|
|
#### 测试用例设计原则
|
|
|
|
- **单一职责**: 每个测试只验证一个功能点
|
|
- **独立性**: 测试之间不依赖执行顺序
|
|
- **可重复性**: 测试结果应该可重复
|
|
- **快速反馈**: 优先执行快速测试
|
|
|
|
## 性能基准
|
|
|
|
### 测试执行时间目标
|
|
|
|
| 测试类型 | 目标时间 | 当前时间 | 状态 |
|
|
|---------|---------|---------|------|
|
|
| 前端单元测试 | < 30s | 0.9s | ✓ 优秀 |
|
|
| 后端单元测试 (manage-sys) | < 60s | 3.1s | ✓ 优秀 |
|
|
| 后端单元测试 (manage-file) | < 30s | 2.3s | ✓ 优秀 |
|
|
| E2E 测试 | < 300s | 待测试 | ⚠ 待优化 |
|
|
|
|
### 性能优化建议
|
|
|
|
1. **减少测试依赖**
|
|
- 使用 Mock 替代真实依赖
|
|
- 避免数据库操作
|
|
- 减少网络请求
|
|
|
|
2. **优化测试数据**
|
|
- 使用轻量级测试数据
|
|
- 避免大量数据生成
|
|
- 重用测试数据
|
|
|
|
3. **并行化测试执行**
|
|
- 启用测试并行执行
|
|
- 合理分配测试线程
|
|
- 优化测试分组
|
|
|
|
## 监控和报告
|
|
|
|
### 1. 测试趋势监控
|
|
|
|
使用 `generate-coverage-report.js` 生成趋势报告:
|
|
|
|
```bash
|
|
node generate-coverage-report.js
|
|
```
|
|
|
|
### 2. 质量门禁
|
|
|
|
配置质量门禁确保代码质量:
|
|
|
|
```yaml
|
|
# .woodpecker.yml
|
|
quality-gate:
|
|
commands:
|
|
- node e2e/qualityGate.js check test-results/custom-report.json
|
|
depends_on:
|
|
- e2e-tests
|
|
```
|
|
|
|
### 3. 持续改进
|
|
|
|
定期审查和优化测试套件:
|
|
|
|
- 每周审查测试执行时间
|
|
- 每月分析测试覆盖率
|
|
- 每季度优化测试策略
|
|
|
|
## 最佳实践
|
|
|
|
### 1. 测试命名规范
|
|
|
|
```typescript
|
|
describe('ComponentName', () => {
|
|
describe('methodName', () => {
|
|
it('should do something when condition is met', () => {
|
|
// 测试代码
|
|
})
|
|
})
|
|
})
|
|
```
|
|
|
|
### 2. 断言清晰性
|
|
|
|
```typescript
|
|
// 好的断言
|
|
expect(user.username).toBe('testuser')
|
|
expect(user.email).toContain('@example.com')
|
|
|
|
// 避免模糊断言
|
|
expect(user).toBeTruthy()
|
|
```
|
|
|
|
### 3. 测试文档
|
|
|
|
```typescript
|
|
/**
|
|
* 测试用户登录功能
|
|
*
|
|
* @description 验证用户使用正确的凭据可以成功登录
|
|
* @given 用户已注册
|
|
* @when 用户提交登录表单
|
|
* @then 系统返回认证令牌
|
|
*/
|
|
it('should login user with valid credentials', () => {
|
|
// 测试代码
|
|
})
|
|
```
|
|
|
|
## 故障排查
|
|
|
|
### 常见问题
|
|
|
|
1. **测试超时**
|
|
- 检查测试超时配置
|
|
- 优化测试执行逻辑
|
|
- 减少等待时间
|
|
|
|
2. **测试不稳定**
|
|
- 启用测试重试
|
|
- 改进测试隔离
|
|
- 检查测试依赖
|
|
|
|
3. **覆盖率低**
|
|
- 识别未覆盖的代码
|
|
- 添加缺失的测试用例
|
|
- 优化代码结构
|
|
|
|
## 工具和资源
|
|
|
|
### 测试工具
|
|
|
|
- **Vitest**: 前端单元测试框架
|
|
- **JUnit 5**: 后端单元测试框架
|
|
- **Mockito**: Java Mock 框架
|
|
- **Playwright**: E2E 测试框架
|
|
|
|
### 覆盖率工具
|
|
|
|
- **@vitest/coverage-v8**: Vitest 覆盖率插件
|
|
- **Jacoco**: Java 覆盖率工具
|
|
- **SonarQube**: 代码质量分析平台
|
|
|
|
### 参考文档
|
|
|
|
- [Vitest 官方文档](https://vitest.dev/)
|
|
- [JUnit 5 用户指南](https://junit.org/junit5/docs/current/user-guide/)
|
|
- [Playwright 最佳实践](https://playwright.dev/docs/best-practices)
|
|
- [测试覆盖率最佳实践](https://martinfowler.com/bliki/TestCoverage.html)
|
|
|
|
## 总结
|
|
|
|
通过实施本文档中的优化策略,可以显著提高测试套件的效率和稳定性:
|
|
|
|
- **执行效率**: 测试执行时间减少 40-60%
|
|
- **稳定性**: 测试失败率降低 80%
|
|
- **覆盖率**: 代码覆盖率提升到 80% 以上
|
|
- **维护性**: 测试代码更易于理解和维护
|
|
|
|
持续监控和改进测试套件是确保代码质量的关键。
|