关于 e2e-testing-patterns
e2e-testing-patterns 是用于设计可维护端到端测试套件的技能,聚焦用户行为和关键流程。内容涵盖测试独立性、稳定选择器、可靠性、速度与调试。
主要功能
- 01关键用户流程测试
- 02跨浏览器测试考量
- 03稳定选择器实践
- 04独立且确定性测试
- 05性能优化与调试
适用场景
- 01自动化关键用户旅程
- 02排查不稳定的端到端测试
- 03设置 CI/CD 测试流程
- 04验证无障碍与响应式界面
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ wshobson/ agents --skill e2e-testing-patterns安装后在 Claude Code 中输入/e2e-testing-patterns确认已加载。
附带文件references/details.md
详细介绍
E2E 测试模式
构建可靠、快速且可维护的端到端测试套件,让团队有信心快速交付代码,并在用户之前发现回归问题。
何时使用本技能
- 实施端到端测试自动化
- 调试不稳定或不可靠的测试
- 测试关键用户工作流
- 搭建 CI/CD 测试流水线
- 跨多个浏览器进行测试
- 验证无障碍要求
- 测试响应式设计
- 建立 E2E 测试标准
核心概念
1. E2E 测试基础
适合用 E2E 测试的内容:
- 关键用户旅程(登录、结账、注册)
- 复杂交互(拖放、多步表单)
- 跨浏览器兼容性
- 真实 API 集成
- 认证流程
不适合用 E2E 测试的内容:
- 单元级逻辑(使用单元测试)
- API 契约(使用集成测试)
- 边缘情况(太慢)
- 内部实现细节
2. 测试理念
测试金字塔:
/\
/E2E\ ← Few, focused on critical paths
/─────\
/Integr\ ← More, test component interactions
/────────\
/Unit Tests\ ← Many, fast, isolated
/────────────\
最佳实践:
- 测试用户行为,而非实现
- 保持测试相互独立
- 让测试具备确定性
- 为速度而优化
- 使用 data-testid,而非 CSS 选择器
详细模式与完整示例
详细的模式文档位于 references/details.md。当上面的导航层级不够用时,请阅读该文件。
最佳实践
- 使用数据属性:使用
data-testid或data-cy作为稳定的选择器 - 避免脆弱的选择器:不要依赖 CSS 类或 DOM 结构
- 测试用户行为:点击、输入、查看——而非实现细节
- 保持测试相互独立:每个测试都应在隔离环境中运行
- 清理测试数据:在每个测试中创建并销毁测试数据
- 使用页面对象:封装页面逻辑
- 有意义的断言:检查用户实际可见的行为
- 为速度而优化:尽可能使用 Mock,并行执行
// ❌ Bad selectors
cy.get(".btn.btn-primary.submit-button").click();
cy.get("div > form > div:nth-child(2) > input").type("text");
// ✅ Good selectors (findBy* commands come from @testing-library/cypress;
// add `import "@testing-library/cypress/add-commands";` to your Cypress support file)
cy.findByRole("button", { name: "Submit" }).click();
cy.findByLabelText("Email address").type("[email protected]");
cy.get('[data-testid="email-input"]').type("[email protected]");
常见陷阱
- 不稳定的测试:使用恰当的等待,而非固定超时
- 缓慢的测试:Mock 外部 API,使用并行执行
- 过度测试:不要用 E2E 测试每一种边缘情况
- 耦合的测试:测试之间不应相互依赖
- 糟糕的选择器:避免 CSS 类和 nth-child
- 没有清理:在每个测试后清理测试数据
- 测试实现:测试用户行为,而非内部细节
调试失败的测试
// Playwright debugging
// 1. Run in headed mode
npx playwright test --headed
// 2. Run in debug mode
npx playwright test --debug
// 3. Use trace viewer (record with `use: { trace: 'on-first-retry' }` in the config)
npx playwright show-trace path/to/trace.zip
await page.screenshot({ path: 'screenshot.png' });
// 4. Add test.step for better reporting
test('checkout flow', async ({ page }) => {
await test.step('Add item to cart', async () => {
await page.goto('/products');
await page.getByRole('button', { name: 'Add to Cart' }).click();
});
await test.step('Proceed to checkout', async () => {
await page.goto('/cart');
await page.getByRole('button', { name: 'Checkout' }).click();
});
});
// 5. Inspect page state
await page.pause(); // Pauses execution, opens inspector
评论
支持 Markdown