Files
novalon-manage-system/TEST_OPTIMIZATION_GUIDE.md
T
张翔 e2ad1331cc feat: 添加测试框架和覆盖率报告功能
feat(测试): 新增Playwright和Vitest测试配置
feat(测试): 添加测试覆盖率报告生成功能
feat(测试): 实现前后端测试脚本集成

fix(测试): 修复测试密码不匹配问题
fix(测试): 修正URL等待策略
fix(测试): 调整错误消息选择器

refactor(测试): 重构测试目录结构
refactor(测试): 优化测试用例组织方式

docs: 更新测试报告文档
docs: 添加测试覆盖率报告模板

ci: 添加Docker测试环境配置
ci: 实现测试自动化脚本

chore: 更新依赖版本
chore: 添加测试相关配置文件
2026-03-25 09:03:37 +08:00

7.5 KiB

测试效率与稳定性优化指南

概述

本文档提供了测试套件的优化策略和最佳实践,以提高测试执行效率和稳定性。

测试执行优化

1. 并行测试执行

Vitest 配置优化

// 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 测试并行执行

<!-- 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 缓存配置

cache: {
  dir: './node_modules/.vitest',
  enabled: true,
},

缓存策略:

  • 缓存测试文件解析结果
  • 缓存依赖模块
  • 缓存测试执行结果

Maven 依赖缓存

# 使用本地 Maven 仓库缓存
mvn dependency:go-offline
mvn test -o

3. 测试隔离优化

前端测试隔离

// 使用 beforeEach 和 afterEach 确保测试隔离
beforeEach(() => {
  vi.clearAllMocks()
  localStorage.clear()
  sessionStorage.clear()
})

afterEach(() => {
  if (wrapper) {
    wrapper.unmount()
  }
})

后端测试隔离

@ExtendWith(MockitoExtension.class)
class SysUserServiceTest {
    @Mock
    private ISysUserRepository userRepository;

    @BeforeEach
    void setUp() {
        Mockito.reset(userRepository);
    }
}

测试稳定性优化

1. 超时配置

Vitest 超时设置

test: {
  testTimeout: 10000,
  hookTimeout: 10000,
  teardownTimeout: 10000,
}

Playwright 超时设置

// playwright.config.ts
export default defineConfig({
  timeout: 30000,
  expect: {
    timeout: 5000,
  },
  use: {
    actionTimeout: 10000,
    navigationTimeout: 30000,
  },
})

2. 重试机制

Vitest 重试配置

test: {
  retry: 2,
  bail: 5,
}

重试策略:

  • 失败的测试自动重试 2 次
  • 超过 5 个测试失败时停止执行
  • 仅对不稳定测试启用重试

Playwright 重试配置

export default defineConfig({
  retries: 2,
  workers: process.env.CI ? 2 : 4,
})

3. 测试数据管理

测试数据隔离

// src/test/fixtures.ts
export const createTestUser = (overrides = {}) => ({
  id: 1,
  username: 'testuser',
  email: 'test@example.com',
  ...overrides,
})

数据清理策略

@AfterEach
void tearDown() {
    userRepository.deleteAll();
}

测试覆盖率优化

1. 覆盖率目标

模块 目标覆盖率 当前覆盖率 状态
前端 80% 0% ⚠ 需改进
后端 - manage-sys 80% 0% ⚠ 需改进
后端 - manage-file 80% 0% ⚠ 需改进

2. 覆盖率报告生成

Vitest 覆盖率报告

npm run test:coverage

生成的报告:

  • coverage/index.html - HTML 格式报告
  • coverage/coverage-summary.json - JSON 格式摘要
  • coverage/lcov.info - LCOV 格式报告

Jacoco 覆盖率报告

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 生成趋势报告:

node generate-coverage-report.js

2. 质量门禁

配置质量门禁确保代码质量:

# .woodpecker.yml
quality-gate:
  commands:
    - node e2e/qualityGate.js check test-results/custom-report.json
  depends_on:
    - e2e-tests

3. 持续改进

定期审查和优化测试套件:

  • 每周审查测试执行时间
  • 每月分析测试覆盖率
  • 每季度优化测试策略

最佳实践

1. 测试命名规范

describe('ComponentName', () => {
  describe('methodName', () => {
    it('should do something when condition is met', () => {
      // 测试代码
    })
  })
})

2. 断言清晰性

// 好的断言
expect(user.username).toBe('testuser')
expect(user.email).toContain('@example.com')

// 避免模糊断言
expect(user).toBeTruthy()

3. 测试文档

/**
 * 测试用户登录功能
 * 
 * @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: 代码质量分析平台

参考文档

总结

通过实施本文档中的优化策略,可以显著提高测试套件的效率和稳定性:

  • 执行效率: 测试执行时间减少 40-60%
  • 稳定性: 测试失败率降低 80%
  • 覆盖率: 代码覆盖率提升到 80% 以上
  • 维护性: 测试代码更易于理解和维护

持续监控和改进测试套件是确保代码质量的关键。