测试策略构建器
概览
这个技能提供了构建有效测试策略的全面指导,以确保软件质量、可靠性和可维护性。无论是从头开始规划测试策略,还是在现有代码库中提高测试覆盖率,这个框架都可以帮助团队设计出健壮的测试方法。
何时使用这个技能:
- 为新项目或功能规划测试策略
- 在现有代码库中提高测试覆盖率
- 建立质量门和覆盖率目标
- 设计测试自动化架构
- 创建测试计划和测试用例
- 选择合适的测试工具和框架
- 在CI/CD管道中实施持续测试
捆绑资源:
references/code-examples.md- 详细的测试代码示例templates/test-plan-template.md- 综合测试计划模板templates/test-case-template.md- 测试用例文档模板checklists/test-coverage-checklist.md- 覆盖率验证清单
所需工具
这个技能提到了以下测试工具。并非所有工具都是必需的 - 技能会根据你的项目推荐合适的工具。
JavaScript/TypeScript 测试
-
Jest: 最流行的测试框架
- 安装:
npm install --save-dev jest @types/jest - 配置:
npx jest --init
- 安装:
-
Vitest: Vite原生测试框架
- 安装:
npm install --save-dev vitest - 配置: 添加到 vite.config.ts
- 安装:
-
Playwright: 端到端测试
- 安装:
npm install --save-dev @playwright/test - 设置:
npx playwright install
- 安装:
-
k6: 性能测试
- 安装 (macOS):
brew install k6 - 安装 (Linux): 从 k6.io 下载
- 命令:
k6 run script.js
- 安装 (macOS):
Python 测试
-
pytest: 标准 Python 测试框架
- 安装:
pip install pytest - 命令:
pytest
- 安装:
-
pytest-cov: 覆盖率报告
- 安装:
pip install pytest-cov - 命令:
pytest --cov=.
- 安装:
-
Locust: 性能测试
- 安装:
pip install locust - 命令:
locust -f locustfile.py
- 安装:
覆盖率工具
-
c8: JavaScript/TypeScript 覆盖率
- 安装:
npm install --save-dev c8 - 命令:
c8 npm test
- 安装:
-
Istanbul/nyc: 替代 JS 覆盖率
- 安装:
npm install --save-dev nyc - 命令:
nyc npm test
- 安装:
安装验证
# JavaScript/TypeScript
jest --version
vitest --version
playwright --version
k6 version
# Python
pytest --version
locust --version
# 覆盖率
c8 --version
nyc --version
注意: 技能会指导你根据项目框架(React, Vue, FastAPI, Django 等)和测试需求选择合适的工具。
测试理念
测试奖杯 🏆
现代测试遵循“测试奖杯”模型(从测试金字塔演变而来):
🏆
/ \
/ E2E \ ← 少数(关键用户旅程)
/----------\
/ 集成 \ ← 多数(组件交互)
/--------------\
/ 单元 \ ← 最多(业务逻辑)
/------------------\
/ 静态分析 \ ← 基础(代码检查,类型检查)
原则:
- 静态分析:在运行时之前捕获语法错误、类型问题和常见错误
- 单元测试:测试隔离的业务逻辑
- 集成测试:测试组件如何协同工作
- E2E 测试:验证关键用户工作流程端到端
平衡: 70% 集成,20% 单元,10% E2E(根据上下文调整)
测试策略框架
1. 覆盖率目标
推荐目标:
- 总体代码覆盖率:最低 80%
- 关键路径:95-100%(支付,认证,数据变更)
- 新功能:100% 覆盖率要求
- 业务逻辑:90%+ 覆盖率
- UI 组件:70%+ 覆盖率
覆盖率类型:
- 行覆盖率:执行代码行的百分比
- 分支覆盖率:采取决策分支的百分比
- 函数覆盖率:被调用函数的百分比
- 语句覆盖率:执行语句的百分比
重要: 覆盖率是一个指标,不是目标。100% 覆盖率 ≠ 无缺陷代码。
2. 测试分类
静态分析
目的:在运行时之前捕获错误 工具:ESLint, Prettier, TypeScript, Pylint, mypy, Ruff 何时运行: 提交前钩子,CI 管道
单元测试
目的:测试隔离的业务逻辑 工具:Jest, Vitest, pytest, JUnit 特点:
- 快速执行(每个测试 < 100ms)
- 无外部依赖(数据库,API,文件系统)
- 确定性(相同输入 = 相同输出)
- 测试单一责任
覆盖率目标: 业务逻辑 90%+
查看 references/code-examples.md 获取详细的单元测试示例。
集成测试
目的:测试组件交互 工具: 测试库,Supertest, pytest 与 fixtures 特点:
- 测试多个单元一起工作
- 可以使用测试数据库或模拟外部服务
- 适度执行时间(每个测试 < 1s)
- 专注于接口和契约
覆盖率目标: API 端点和组件交互 70%+
查看 references/code-examples.md 获取 API 集成测试示例。
端到端 (E2E) 测试
目的:验证关键用户旅程 工具: Playwright, Cypress, Selenium 特点:
- 测试整个应用程序流程(前端 + 后端 + 数据库)
- 慢速执行(每个测试 5-30s)
- 在类似生产的环境中运行
- 专注于业务关键路径
覆盖率目标: 5-10 关键用户旅程
查看 references/code-examples.md 获取完整的 E2E 测试示例。
性能测试
目的:在负载下验证系统性能 工具: k6, Artillery, JMeter, Locust 类型:
- 负载测试:系统在预期负载下的行为
- 压力测试:识别故障点
- 尖峰测试:处理突然流量激增
- 浸泡测试:长时间持续负载(内存泄漏)
覆盖率目标: 测试所有性能关键端点
查看 references/code-examples.md 获取 k6 负载测试示例。
测试计划
1. 基于风险的测试
根据风险评估优先测试:
高风险(100% 覆盖率要求):
- 支付处理
- 认证和授权
- 数据变更(创建,更新,删除)
- 安全关键操作
- 合规相关功能
中风险(80% 覆盖率):
- 业务逻辑
- 数据转换
- API 集成
- 电子邮件/通知系统
低风险(50% 覆盖率):
- UI 样式
- 静态内容
- 只读操作
- 非关键功能
2. 测试用例设计
给定-当-则模式:
给定 [初始上下文]
当 [动作发生]
则 [预期结果]
这种模式使测试保持清晰和专注。查看 references/code-examples.md 获取实现示例。
3. 测试数据管理
策略:
- 固定装置:预定义的 JSON/YAML 文件中的测试数据
- 工厂:程序性生成测试数据
- 播种机:用已知数据填充测试数据库
- Faker 库:生成逼真的随机数据
查看 references/code-examples.md 获取测试工厂和固定装置示例。
测试模式和最佳实践
1. AAA 模式(安排-行动-断言)
将测试结构化为三个清晰的阶段:
- 安排:设置测试数据和上下文
- 行动:执行被测试的动作
- 断言:验证预期结果
查看 references/code-examples.md 获取详细的 AAA 模式示例。
2. 测试隔离
每个测试应该是独立的:
- 对每个测试使用新的测试数据库
- 在每个测试后清理资源
- 测试不依赖于执行顺序
查看 references/code-examples.md 获取测试隔离模式。
3. 模拟与真实依赖
何时模拟:
- 外部 API(支付网关,第三方服务)
- 慢速操作(文件 I/O,网络调用)
- 非确定性行为(当前时间,随机值)
- 难以测试的场景(错误条件,边缘情况)
何时使用真实依赖:
- 快速,确定性操作
- 关键业务逻辑
- 数据库操作(使用测试数据库)
- 内部服务交互
查看 references/code-examples.md 获取模拟示例。
4. 快照测试
用途: UI 组件,API 响应,生成的代码
警告: 快照可能变得脆弱。用于稳定的组件,而不是快速变化的 UI。
5. 参数化测试
使用数据表测试多种场景。
查看 references/code-examples.md 获取参数化测试模式。
持续测试
1. CI/CD 集成
管道阶段:
# 示例:GitHub Actions
name: 测试管道
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: 安装依赖
run: npm ci
- name: 代码检查
run: npm run lint
- name: 类型检查
run: npm run typecheck
- name: 单元和集成测试
run: npm test -- --coverage
- name: 上传覆盖率
uses: codecov/codecov-action@v3
- name: E2E 测试
run: npm run test:e2e
- name: 性能测试(在主分支上)
if: github.ref == 'refs/heads/main'
run: npm run test:performance
2. 质量门
阻止合并/部署如果:
- 代码覆盖率低于阈值(例如,80%)
- 任何测试失败
- 存在代码检查错误
- 性能回归检测到(慢于 10%)
- 发现安全漏洞
3. 测试执行策略
每次提交时:
- 静态分析(代码检查,类型检查)
- 单元测试
- 快速集成测试(总计 < 5 分钟)
每次拉取请求时:
- 所有测试(单元 + 集成 + E2E)
- 覆盖率报告
- 性能基准测试
部署到暂存环境时:
- 完整的 E2E 套件
- 负载测试
- 安全扫描
部署到生产环境时:
- 烟雾测试(仅关键路径)
- 健康检查
- 带监控的金丝雀部署
测试工具推荐
JavaScript/TypeScript
| 类别 | 工具 | 用例 |
|---|---|---|
| 单元/集成 | Vitest | 快速,Vite 原生,现代 |
| 单元/集成 | Jest | 成熟,广泛的生态系统 |
| E2E | Playwright | 跨浏览器,可靠,快速 |
| E2E | Cypress | 开发者友好,可视化调试 |
| 组件测试 | 测试库 | 用户中心,框架无关 |
| API 测试 | Supertest | HTTP 断言,Express 集成 |
| 性能 | k6 | 负载测试,可脚本化 |
Python
| 类别 | 工具 | 用例 |
|---|---|---|
| 单元/集成 | pytest | 功能强大,可扩展,fixtures |
| API 测试 | httpx + pytest | 异步支持,现代 |
| E2E | Playwright (Python) | 浏览器自动化 |
| 性能 | Locust | 负载测试,基于 Python |
| 模拟 | unittest.mock | 标准库,可靠 |
常见测试反模式
❌ 测试实现细节
// 坏:测试内部状态
expect(component.state.isLoading).toBe(false);
// 好:测试用户可见行为
expect(screen.queryByText('Loading...')).not.toBeInTheDocument();
❌ 测试与代码过于耦合
// 坏:测试在实现变化时中断
expect(userService.save).toHaveBeenCalledTimes(1);
// 好:测试行为,而不是实现
const user = await db.users.findOne({ email: 'test@example.com' });
expect(user).toBeTruthy();
❌ 不稳定的测试
// 坏:非确定性超时
await waitFor(() => {
expect(screen.getByText('Success')).toBeInTheDocument();
}, { timeout: 1000 }); // 在慢速 CI 上可能失败
// 好:使用显式等待,更长的超时
await screen.findByText('Success', {}, { timeout: 5000 });
❌ 大型测试案例
// 坏:一个测试做太多
test('user workflow', async () => {
// 100 行测试注册,登录,个人资料更新,注销...
});
// 好:专注的测试
test('user can sign up', async () => { /* ... */ });
test('user can login', async () => { /* ... */ });
test('user can update profile', async () => { /* ... */ });
与代理集成
代码质量审查员
- 审查测试覆盖率报告
- 建议缺失的测试用例
- 验证测试质量和结构
- 确保测试遵循此技能中的模式
后端系统架构师
- 在设计服务时使用测试策略模板
- 确保 API 可测试(依赖注入,清晰的接口)
- 规划集成测试架构
前端 UI 开发人员
- 应用组件测试模式
- 使用测试库最佳实践
- 实施 E2E 测试用户流程
AI/ML 工程师
- 适应 ML 模型的测试模式(数据验证,模型性能测试)
- 使用性能测试推理端点
快速开始清单
当开始一个新项目或功能时:
- [ ] 定义覆盖率目标(总体,关键路径,新代码)
- [ ] 选择测试框架(Jest/Vitest, Playwright 等)
- [ ] 设置测试基础设施(测试数据库,固定装置,工厂)
- [ ] 创建测试计划(见
templates/test-plan-template.md) - [ ] 实施静态分析(ESLint, TypeScript)
- [ ] 编写业务逻辑单元测试(80%+ 覆盖率)
- [ ] 编写 API 端点集成测试(70%+ 覆盖率)
- [ ] 编写关键用户旅程 E2E 测试(5-10 流程)
- [ ] 配置 CI/CD 管道与质量门
- [ ] 设置覆盖率报告(Codecov, Coveralls)
- [ ] 在项目 README 中记录测试约定
查看详细的代码示例:references/code-examples.md
技能版本:1.0.0 最后更新:2025-10-31 维护者:AI Agent Hub 团队