名称: 测试自动化策略 描述: “设计和实施有效的测试自动化,包括适当的金字塔、模式和CI/CD集成。在构建自动化框架或提高测试效率时使用。” 类别: 测试方法论 优先级: 高 令牌估计: 1000 代理: [qe-测试生成器, qe-测试执行器, qe-覆盖分析器, qe-不稳定测试追踪器, qe-回归风险分析器] 实施状态: 优化 优化版本: 1.0 最后优化: 2025-12-02 依赖项: [] 快速参考卡: true 标签: [自动化, 测试金字塔, 页面对象, 第一原则, ci-cd, 不稳定测试] 信任层级: 3 验证: 模式路径: 模式/输出.json 验证器路径: 脚本/验证配置.json 评估路径: 评估/测试自动化策略.yaml
测试自动化策略
<默认到行动> 当设计或改进测试自动化时:
- 遵循测试金字塔:70%单元测试,20%集成测试,10%端到端测试
- 应用F.I.R.S.T.原则:快速、独立、可重复、自我验证、及时
- 使用模式:页面对象模型、构建器模式、工厂模式
- 集成到CI/CD:每次提交运行测试,快速失败,清晰反馈
- 管理不稳定测试:隔离、修复或删除 - 永不忽略
快速反模式检测:
- 冰淇淋锥形(许多端到端测试,少数单元测试)→ 反转为金字塔
- 缓慢测试(> 10分钟套件)→ 并行化,模拟外部依赖
- 不稳定测试→ 修复时序,隔离数据,或隔离
- 测试重复→ 共享夹具,使用页面对象
- 脆弱选择器→ 使用data-testid,语义定位器
关键成功因素:
- 快速反馈是目标(< 10分钟完整套件)
- 自动化支持测试,不取代判断
- 像生产代码一样投资测试基础设施 </默认到行动>
快速参考卡
何时使用
- 构建新的自动化框架
- 提高现有测试效率
- 减少不稳定测试负担
- 优化CI/CD管道速度
测试金字塔
| 层级 | % | 速度 | 隔离 | 示例 |
|---|---|---|---|---|
| 单元测试 | 70% | < 1毫秒 | 完全 | 纯函数,逻辑 |
| 集成测试 | 20% | < 1秒 | 部分 | API,数据库 |
| 端到端测试 | 10% | < 30秒 | 无 | 用户旅程 |
F.I.R.S.T.原则
| 原则 | 含义 | 如何实现 |
|---|---|---|
| 快速 | 快速执行 | 模拟外部依赖 |
| 独立 | 无共享状态 | 每个测试使用新鲜夹具 |
| 可重复 | 每次结果相同 | 无随机数据 |
| 自我验证 | 清晰通过/失败 | 断言,不打印 |
| 及时 | 与代码一起编写 | TDD,不是之后 |
反模式
| 问题 | 症状 | 修复 |
|---|---|---|
| 冰淇淋锥形 | 80%端到端测试,10%单元测试 | 反转为金字塔 |
| 缓慢套件 | 30+分钟CI | 并行化,修剪 |
| 不稳定测试 | 随机失败 | 隔离,修复时序 |
| 耦合测试 | 顺序依赖 | 隔离数据 |
| 脆弱选择器 | CSS更改时中断 | 使用data-testid |
页面对象模型
// 页面/登录页面.js
class 登录页面 {
constructor(page) {
this.page = page;
this.邮箱输入 = '[data-testid="email"]';
this.密码输入 = '[data-testid="password"]';
this.提交按钮 = '[data-testid="submit"]';
this.错误消息 = '[data-testid="error"]';
}
async 登录(email, password) {
await this.page.fill(this.邮箱输入, email);
await this.page.fill(this.密码输入, password);
await this.page.click(this.提交按钮);
}
async 获取错误() {
return this.page.textContent(this.错误消息);
}
}
// 测试使用页面对象
test('显示无效凭据的错误', async ({ page }) => {
const 登录页面 = new 登录页面(page);
await 登录页面.登录('bad@email.com', 'wrong');
expect(await 登录页面.获取错误()).toBe('无效凭据');
});
CI/CD集成
名称: 测试管道
当: [推送, 拉取请求]
任务:
单元测试:
运行在: ubuntu-latest
步骤:
- 使用: actions/checkout@v4
- 运行: npm ci
- 运行: npm run test:unit -- --coverage
超时-分钟: 5
- 使用: codecov/codecov-action@v3
集成测试:
需要: 单元测试
运行在: ubuntu-latest
服务:
postgres:
镜像: postgres:15
步骤:
- 运行: npm run test:integration
超时-分钟: 10
端到端测试:
需要: 集成测试
运行在: ubuntu-latest
步骤:
- 运行: npx playwright test
超时-分钟: 15
不稳定测试管理
// 隔离不稳定测试
describe.skip('隔离 - INC-123', () => {
test('不稳定测试等待修复', () => { /* ... */ });
});
// 代理辅助稳定化
await Task("修复不稳定测试", {
测试: 隔离测试,
分析: ['时序问题', '数据隔离', '竞态条件'],
策略: ['添加等待', '隔离夹具', '模拟外部']
}, "qe-不稳定测试追踪器");
代理辅助自动化
// 生成遵循金字塔的测试
await Task("生成测试套件", {
源代码: 'src/',
金字塔: { 单元: 70, 集成: 20, 端到端: 10 },
模式: ['页面对象', '构建器', '工厂'],
框架: 'jest'
}, "qe-测试生成器");
// 优化测试执行
await Task("优化套件", {
算法: 'johnson-lindenstrauss',
目标减少: 0.3,
保持覆盖: 0.95
}, "qe-回归风险分析器");
// 分析不稳定模式
await Task("不稳定分析", {
测试历史: '最近30天',
检测模式: ['时序', '数据', '环境'],
推荐: '稳定化策略'
}, "qe-不稳定测试追踪器");
代理协调提示
内存命名空间
aqe/自动化/
├── 测试金字塔/* - 按层级覆盖
├── 页面对象/* - 共享页面对象
├── 不稳定注册表/* - 隔离测试
└── 执行指标/* - 套件性能数据
车队协调
const 自动化车队 = await 车队管理器.协调({
策略: '测试自动化',
代理: [
'qe-测试生成器', // 生成金字塔兼容的测试
'qe-测试执行器', // 并行执行
'qe-覆盖分析器', // 覆盖缺口
'qe-不稳定测试追踪器', // 不稳定检测
'qe-回归风险分析器' // 智能选择
],
拓扑: '分层'
});
相关技能
- tdd-伦敦-芝加哥 - 单元测试的TDD
- api-测试-模式 - 集成模式
- cicd-管道-qe-编排器 - 管道集成
- 左移测试 - 早期自动化
记住
金字塔:70%单元测试,20%集成测试,10%端到端测试。 F.I.R.S.T.原则用于每个测试。页面对象模型用于端到端测试。并行化以提速。隔离不稳定测试 - 永不忽略它们。像对待生产代码一样对待测试代码。
使用代理: 代理生成金字塔兼容的测试,检测不稳定模式,优化执行时间,并维护测试基础设施。使用代理扩展自动化质量。