微服务的自动化测试
已发行
本章内容概览:
- 测试金字塔
- Jest 单元测试
- Playwright 端到端测试
- 测试策略和最佳实践
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 中自动运行
- 良好的测试提供快速反馈和信心
下一章回顾整个应用并部署到生产环境。