testing-strategy.md 13 KB

测试策略

版本信息

版本 日期 描述 作者
4.0 2025-10-31 基于实际测试结构更新Taro小程序测试策略,添加最新测试模式 Winston
3.2 2025-10-20 修正Taro测试工具引用,更新为实际使用的测试框架 Winston
3.1 2025-10-16 修正测试路径描述,更新Taro测试说明 Winston
3.0 2025-10-15 更新为出行服务项目测试策略 Winston
2.6 2025-10-15 完成遗留测试文件迁移到统一的tests目录结构 Winston
2.5 2025-10-14 更新测试文件位置到统一的tests目录结构 Claude
2.4 2025-09-20 更新测试策略与主架构文档版本一致 Winston

概述

本文档定义了出行服务项目的完整测试策略,基于现有的测试基础设施和最佳实践。测试策略遵循测试金字塔模型,确保代码质量、功能稳定性和系统可靠性。

注意: 本测试策略主要针对主项目(后端API + React管理后台),Taro小程序项目有独立的测试体系,详见 Taro测试规范文档

测试金字塔策略

主项目测试体系 (后端API + React管理后台)

单元测试 (Unit Tests)

  • 范围: 单个函数、类或组件
  • 目标: 验证独立单元的correctness
  • 位置:
    • 前端: web/tests/unit/client/**/*.test.{ts,tsx}
    • 后端: web/tests/unit/server/**/*.test.{ts,tsx}
  • 框架: Vitest
  • 覆盖率目标: ≥ 80%
  • 执行频率: 每次代码变更

集成测试 (Integration Tests)

  • 范围: 多个组件/服务协作
  • 目标: 验证模块间集成和交互
  • 位置:
    • 前端: web/tests/integration/client/**/*.test.{ts,tsx}
    • 后端: web/tests/integration/server/**/*.test.{ts,tsx}
  • 框架: Vitest + Testing Library + hono/testing
  • 覆盖率目标: ≥ 60%
  • 执行频率: 每次API变更

E2E测试 (End-to-End Tests)

  • 范围: 完整用户流程
  • 目标: 验证端到端业务流程
  • 位置: web/tests/e2e/**/*.test.{ts,tsx}
  • 框架: Playwright
  • 覆盖率目标: 关键用户流程100%
  • 执行频率: 每日或每次重大变更

Taro小程序测试体系 (独立项目)

注意: Taro小程序项目位于 mini/ 目录,是独立的项目结构,拥有自己的测试配置和运行方式。基于实际测试结构分析,当前测试体系如下:

组件测试 (Component Tests)

  • 范围: Taro小程序组件
  • 目标: 验证组件渲染和交互行为
  • 位置: mini/tests/components/**/*.test.{ts,tsx}
  • 框架: Jest + @testing-library/react + 自定义Taro组件mock
  • 覆盖率目标: ≥ 70%
  • 执行频率: 每次组件变更
  • 示例文件: Button.test.tsx

页面测试 (Page Tests)

  • 范围: 小程序页面级测试,包含完整业务逻辑
  • 目标: 验证页面生命周期、路由、状态管理和API集成
  • 位置: mini/tests/pages/**/*.test.{ts,tsx}
  • 框架: Jest + @testing-library/react + React Query + Taro API mock
  • 覆盖率目标: ≥ 60%
  • 执行频率: 每次页面变更
  • 最新示例:

单元测试 (Unit Tests)

  • 范围: 工具函数、业务逻辑、状态管理
  • 目标: 验证独立业务逻辑单元的正确性
  • 位置: mini/tests/unit/**/*.test.{ts,tsx}
  • 框架: Jest + 自定义测试工具
  • 覆盖率目标: ≥ 80%
  • 执行频率: 每次业务逻辑变更
  • 示例文件: payment.test.ts

测试基础设施

  • 测试配置: mini/tests/setup.ts - 完整的Taro组件和API mock
  • 测试工具: mini/tests/utils.ts - 测试辅助函数和mock数据生成器
  • Mock文件: mini/tests/__mocks__/ - Taro API和组件mock
    • taroMock.ts - 统一的Taro API mock,包含所有常用API
    • taroMock.ts - 通过jest.config.js的moduleNameMapper重定向@tarojs/taro
  • 快照: mini/tests/__snapshots__/ - UI快照测试

测试环境配置

开发环境

// vitest.config.ts - 开发环境配置
export default defineConfig({
  test: {
    projects: [
      // Node.js 环境项目 - 后端测试
      {
        test: {
          include: [
            'tests/unit/server/**/*.test.{ts,js}',
            'tests/integration/server/**/*.test.{ts,js}'
          ],
          // ... 其他配置
        }
      },
      // Happy DOM 环境项目 - 前端组件测试
      {
        test: {
          include: [
            'tests/unit/client/**/*.test.{ts,js,tsx,jsx}',
            'tests/integration/client/**/*.test.{ts,js,tsx,jsx}'
          ],
          // ... 其他配置
        }
      }
    ]
  }
});

CI/CD环境

# GitHub Actions 测试配置
name: Test Pipeline

jobs:
  unit-tests:
    runs-on: ubuntu-latest
    steps:
      - run: npm run test:api
      - run: npm run test:components

  integration-tests:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:15
        env:
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: test_db
    steps:
      - run: npm run test:integration

  e2e-tests:
    runs-on: ubuntu-latest
    steps:
      - run: npm run test:e2e:chromium

测试覆盖率标准

各层覆盖率要求

测试类型 最低要求 目标要求 关键模块要求
单元测试 70% 80% 90%
集成测试 50% 60% 70%
E2E测试 关键流程100% 主要流程80% -

关键模块定义

  • 认证授权模块: 必须达到90%单元测试覆盖率
  • 数据库操作模块: 必须达到85%单元测试覆盖率
  • 核心业务逻辑: 必须达到80%集成测试覆盖率
  • 用户管理功能: 必须100% E2E测试覆盖

测试数据管理

测试数据策略

// 测试数据工厂模式
export function createTestUser(overrides = {}): User {
  return {
    id: 1,
    username: 'testuser',
    email: 'test@example.com',
    createdAt: new Date(),
    ...overrides
  };
}

// 使用示例
const adminUser = createTestUser({ role: 'admin' });
const inactiveUser = createTestUser({ active: false });

数据库测试策略

  • 单元测试: 使用内存数据库或完全mock
  • 集成测试: 使用专用测试数据库,事务回滚
  • E2E测试: 使用接近生产环境的数据库

数据清理策略

  1. 事务回滚 (推荐)
  2. 数据库清理 (每个测试后)
  3. 测试数据隔离 (使用唯一标识符)

测试执行流程

本地开发测试

主项目测试

# 运行所有测试
npm test

# 运行单元测试
npm run test:unit

# 运行集成测试
npm run test:integration

# 运行E2E测试
npm run test:e2e:chromium

# 生成覆盖率报告
npm run test:coverage

Taro小程序项目测试

# 进入mini目录
cd mini

# 运行所有Taro测试
pnpm test

# 运行H5环境测试
pnpm run test:h5

# 运行微信小程序环境测试
pnpm run test:weapp

# 生成覆盖率报告
pnpm run test:coverage

# 运行特定测试文件
pnpm test -- order-page.test.tsx
pnpm test -- profile.test.tsx

CI/CD流水线测试

  1. 代码推送 → 触发测试流水线
  2. 单元测试 → 快速反馈,必须通过
  3. 集成测试 → 验证模块集成,必须通过
  4. E2E测试 → 验证完整流程,建议通过
  5. 覆盖率检查 → 满足最低要求
  6. 测试报告 → 生成详细报告

质量门禁

测试通过标准

  • ✅ 所有单元测试通过
  • ✅ 所有集成测试通过
  • ✅ 关键E2E测试通过
  • ✅ 覆盖率满足最低要求
  • ✅ 无性能回归
  • ✅ 安全测试通过

失败处理流程

  1. 测试失败 → 立即通知开发团队
  2. 分析根本原因 → 确定是测试问题还是代码问题
  3. 优先修复 → 阻塞性问题必须立即修复
  4. 重新测试 → 修复后重新运行测试
  5. 文档更新 → 更新测试策略和案例

安全测试策略

安全测试要求

  • 输入验证测试: 所有API端点必须测试SQL注入、XSS等攻击
  • 认证测试: 测试令牌验证、权限控制
  • 数据保护: 测试敏感数据泄露风险
  • 错误处理: 测试错误信息是否泄露敏感数据

安全测试工具

  • OWASP ZAP: 自动化安全扫描
  • npm audit: 依赖漏洞检查
  • 自定义安全测试: 针对业务逻辑的安全测试

性能测试策略

性能测试要求

  • API响应时间: < 100ms (p95)
  • 数据库查询性能: < 50ms (p95)
  • 并发用户数: 支持100+并发用户
  • 资源使用: CPU < 70%, 内存 < 80%

性能测试工具

  • k6: 负载测试
  • autocannon: API性能测试
  • Playwright: E2E性能监控

最新测试模式和最佳实践

Taro小程序测试模式

页面级集成测试模式

基于最新的 order-page.test.tsxprofile.test.tsx 测试文件,推荐以下测试模式:

// 1. 完整的测试环境设置
const createTestQueryClient = () => new QueryClient({
  defaultOptions: {
    queries: { retry: false },
  },
})

// 2. 组件包装器
const Wrapper = ({ children }: { children: React.ReactNode }) => (
  <QueryClientProvider client={createTestQueryClient()}>
    {children}
  </QueryClientProvider>
)

// 3. 完整的Mock策略 - 使用统一的taroMock
import taroMock from '../../tests/__mocks__/taroMock'

// 在测试中直接使用导入的mock函数
taroMock.showToast.mockClear()
taroMock.navigateTo.mockClear()

// 4. 测试数据工厂
const mockRouteData = {
  id: 1,
  name: '测试路线',
  price: 100,
  vehicleType: '商务车'
}

业务逻辑测试覆盖

  • 订单流程: 支付验证、乘客管理、价格计算
  • 用户交互: 按钮点击、表单验证、状态切换
  • API集成: React Query hooks、错误处理、加载状态
  • 多端兼容: H5和小程序环境适配

Mock策略说明

  • 统一Mock: 使用 taroMock.ts 统一管理所有Taro API mock
  • 模块重定向: 通过jest.config.js的moduleNameMapper将@tarojs/taro重定向到taroMock
  • 函数级控制: 每个mock函数都可以独立控制和验证调用情况

测试代码规范

// 良好的测试示例 - 基于最新测试文件
describe('OrderPage', () => {
  beforeEach(() => {
    jest.clearAllMocks()
    // 设置测试数据
  })

  it('应该正确渲染订单页面', () => {
    render(
      <Wrapper>
        <OrderPage />
      </Wrapper>
    )

    expect(screen.getByTestId('order-navbar')).toBeInTheDocument()
    expect(screen.getByTestId('activity-name')).toHaveTextContent('测试活动')
  })

  it('应该处理支付验证逻辑', async () => {
    render(
      <Wrapper>
        <OrderPage />
      </Wrapper>
    )

    const payButton = screen.getByTestId('pay-button')
    fireEvent.click(payButton)

    await waitFor(() => {
      expect(taroMock.showToast).toHaveBeenCalledWith({
        title: '请先获取手机号',
        icon: 'none',
        duration: 2000
      })
    })
  })

  it('应该处理不同出行模式', () => {
    // 测试拼车和包车模式
    mockUseRouter.mockReturnValue({
      params: { type: 'carpool' }
    })

    render(
      <Wrapper>
        <OrderPage />
      </Wrapper>
    )

    expect(screen.getByTestId('service-type')).toHaveTextContent('班次信息')
  })
})

测试命名约定

  • 文件名: [page/component].test.tsx[feature].test.ts
  • 描述: 使用「应该...」格式描述测试行为
  • 用例: 明确描述测试场景和预期结果
  • 测试数据: 使用工厂函数创建测试数据
  • Mock策略: 完整的API和组件mock覆盖

监控和报告

测试监控指标

  • 测试通过率: > 95%
  • 测试执行时间: < 10分钟(单元+集成)
  • 测试稳定性: 无flaky tests
  • 覆盖率趋势: 持续改进或保持

测试报告要求

  • HTML报告: 详细的覆盖率报告
  • JUnit报告: CI/CD集成
  • 自定义报告: 业务指标测试报告
  • 历史趋势: 测试质量趋势分析

附录

相关文档

工具版本

  • Vitest: 3.2.4
  • Testing Library: 16.3.0
  • Playwright: 1.55.0
  • hono/testing: 内置(Hono 4.8.5)
  • Jest: 29.7.0 (Taro小程序)
  • React Testing Library: 16.3.0 (Taro小程序)
  • React Query: 5.8.4 (Taro小程序)

更新日志

日期 版本 描述
2025-10-31 4.0 基于实际测试结构更新Taro小程序测试策略,添加最新测试模式
2025-10-20 3.2 修正Taro测试工具引用,更新为实际使用的测试框架
2025-10-16 3.1 修正测试路径描述,更新Taro测试说明
2025-10-15 3.0 更新为出行服务项目测试策略
2025-10-15 2.6 完成遗留测试文件迁移到统一的tests目录结构
2025-10-14 2.5 重构测试文件结构,统一到tests目录
2025-09-20 2.4 更新版本与主架构文档一致
2025-09-19 1.0 初始版本,基于现有测试基础设施

文档状态: 正式版 下次评审: 2025-12-31