Complete Claude Code plugin with: - 9 skills (/pw:init, generate, review, fix, migrate, coverage, testrail, browserstack, report) - 3 specialized agents (test-architect, test-debugger, migration-planner) - 55 test case templates across 11 categories (auth, CRUD, checkout, search, forms, dashboard, settings, onboarding, notifications, API, accessibility) - TestRail MCP server (TypeScript) — 8 tools for bidirectional sync - BrowserStack MCP server (TypeScript) — 7 tools for cross-browser testing - Smart hooks (auto-validate tests, auto-detect Playwright projects) - 6 curated reference docs (golden rules, locators, assertions, fixtures, pitfalls, flaky tests) - Leverages Claude Code built-ins (/batch, /debug, Explore subagent) - Zero-config for core features; TestRail/BrowserStack via env vars - Both TypeScript and JavaScript support throughout Co-authored-by: Leo <leo@openclaw.ai>
57 lines
1.5 KiB
Markdown
57 lines
1.5 KiB
Markdown
# Flaky Test Quick Reference
|
|
|
|
## Diagnosis Commands
|
|
|
|
```bash
|
|
# Burn-in: expose timing issues
|
|
npx playwright test tests/checkout.spec.ts --repeat-each=10
|
|
|
|
# Isolation: expose state leaks
|
|
npx playwright test tests/checkout.spec.ts --grep "adds item" --workers=1
|
|
|
|
# Full trace: capture everything
|
|
npx playwright test tests/checkout.spec.ts --trace=on --retries=0
|
|
|
|
# Parallel stress: expose race conditions
|
|
npx playwright test --fully-parallel --workers=4 --repeat-each=5
|
|
```
|
|
|
|
## Four Categories
|
|
|
|
| Category | Symptom | Fix |
|
|
|---|---|---|
|
|
| **Timing** | Fails intermittently | Replace waits with assertions |
|
|
| **Isolation** | Fails in suite, passes alone | Remove shared state |
|
|
| **Environment** | Fails in CI only | Match viewport, fonts, timezone |
|
|
| **Infrastructure** | Random crashes | Reduce workers, increase memory |
|
|
|
|
## Quick Fixes
|
|
|
|
**Timing → Add proper waits:**
|
|
```typescript
|
|
// Wait for specific response
|
|
const response = page.waitForResponse('**/api/data');
|
|
await page.getByRole('button', { name: 'Load' }).click();
|
|
await response;
|
|
await expect(page.getByTestId('results')).toBeVisible();
|
|
```
|
|
|
|
**Isolation → Unique test data:**
|
|
```typescript
|
|
const uniqueEmail = `test-${Date.now()}@example.com`;
|
|
```
|
|
|
|
**Environment → Explicit viewport:**
|
|
```typescript
|
|
test.use({ viewport: { width: 1280, height: 720 } });
|
|
```
|
|
|
|
**Infrastructure → CI-safe config:**
|
|
```typescript
|
|
export default defineConfig({
|
|
retries: process.env.CI ? 2 : 0,
|
|
workers: process.env.CI ? 2 : undefined,
|
|
timeout: process.env.CI ? 60_000 : 30_000,
|
|
});
|
|
```
|