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,
|
|
});
|
|
```
|