微服务的自动化测试

已发行

本章内容概览:

  • 测试金字塔
  • Jest 单元测试
  • Playwright 端到端测试
  • 测试策略和最佳实践

9.1 测试金字塔

图 9.1 测试金字塔
图 9.1 测试金字塔

各层分布:

  • 单元测试(底层):测试单个函数和类,快速、数量多
  • 集成测试(中层):测试服务间交互,中等速度
  • 端到端测试(顶层):测试整个应用,慢速、数量少

理想比例:70% 单元测试,20% 集成测试,10% E2E 测试

9.2 Jest:单元测试框架

9.2.1 为什么选择 Jest?

  • 零配置,开箱即用
  • 内置覆盖率报告
  • 并行执行测试
  • 丰富的断言库

9.2.2 单元测试示例

// index.js
function sum(a, b) {
  return a + b;
}

// index.test.js
const { sum } = require('./index');

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});

9.2.3 测试异步代码

test('async fetch returns data', async () => {
  const data = await fetchData();
  expect(data).toBe('data');
});

9.2.4 集成测试

describe('Video API Tests', () => {
  test('GET /videos returns video list', async () => {
    const response = await request(app)
      .get('/videos')
      .expect(200);
    expect(Array.isArray(response.body)).toBe(true);
  });
});

9.3 Playwright:端到端测试

9.3.1 为什么选择 Playwright?

  • 跨浏览器支持(Chrome、Firefox、Safari、Edge)
  • 快速并行执行
  • 强大的选择器
  • 自动等待元素
  • 网络拦截
  • 失败时截图和录像

9.3.2 E2E 测试示例

const { test, expect } = require('@playwright/test');

test('video streaming page loads', async ({ page }) => {
  await page.goto('http://localhost:3000');
  await expect(page).toHaveTitle(/Video Streaming/);

  const video = page.locator('video');
  await expect(video).toBeVisible();
});

test('user can play video', async ({ page }) => {
  await page.goto('http://localhost:3000/video');
  await page.locator('button[aria-label="Play"]').click();

  const video = page.locator('video');
  await expect(video).toHaveJSProperty('paused', false);
});

9.4 测试组织结构

microservice/
  src/
    index.js
    index.test.js      # 单元测试
  tests/
    integration/
      api.test.js      # 集成测试
    e2e/
      flow.spec.js     # 端到端测试

Jest 配置:

module.exports = {
  testEnvironment: 'node',
  coverageDirectory: 'coverage',
  collectCoverageFrom: ['src/**/*.js', '!src/**/*.test.js']
};

Playwright 配置:

module.exports = {
  testDir: './tests/e2e',
  use: {
    baseURL: 'http://localhost:3000',
    screenshot: 'only-on-failure',
    video: 'retain-on-failure'
  }
};

9.5 运行测试

Jest 命令:

npm test                    # 运行所有测试
npm test -- --watch         # 监视模式
npm test -- --coverage      # 覆盖率报告

Playwright 命令:

npx playwright test         # 运行 E2E 测试
npx playwright test --debug # 调试模式

9.6 测试最佳实践

单元测试:

  • 一个测试一个断言
  • 描述性测试名称
  • 测试边界条件
  • 使用 Mock 隔离外部依赖

集成测试:

  • 测试真实交互
  • 使用真实数据库(Docker)
  • 清理测试数据
  • 测试故障场景

E2E 测试:

  • 测试用户流程
  • 使用可靠的选择器
  • 使用自动等待
  • 保持测试独立性

9.7 测试覆盖率

指标:

  • 语句覆盖率:执行的代码行数比例
  • 分支覆盖率:执行的分支比例
  • 函数覆盖率:调用的函数比例

目标:

  • 单元测试:80-90%
  • 集成测试:70-80%
  • 整体:70% 以上

总结

  • 测试金字塔指导测试的合理分布
  • Jest 是强大的单元测试框架
  • Playwright 是现代的 E2E 测试框架
  • 合理的测试组织提高可维护性
  • 测试应在 CI/CD 中自动运行
  • 良好的测试提供快速反馈和信心

下一章回顾整个应用并部署到生产环境。

创建于 2026/01/06 更新于 2026/01/06 852 字 阅读约 2 分钟

提交勘误/建议