# 测试效率与稳定性优化指南 ## 概述 本文档提供了测试套件的优化策略和最佳实践,以提高测试执行效率和稳定性。 ## 测试执行优化 ### 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 org.apache.maven.plugins maven-surefire-plugin 3.5.5 methods 4 false **/*Test.java ``` ### 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% 以上 - **维护性**: 测试代码更易于理解和维护 持续监控和改进测试套件是确保代码质量的关键。