chore: git cache cleanup
This commit is contained in:
@@ -1,539 +0,0 @@
|
||||
# Playwright E2E Test Debugging Implementation Summary
|
||||
|
||||
**Date**: January 27, 2026
|
||||
**Status**: ✅ Complete
|
||||
|
||||
This document summarizes the comprehensive debugging enhancements implemented for the Playwright E2E test suite.
|
||||
|
||||
## Overview
|
||||
|
||||
A complete debugging ecosystem has been implemented to provide maximum observability into test execution, including structured logging, network monitoring, trace capture, and CI integration for parsing and analysis.
|
||||
|
||||
## Deliverables Completed
|
||||
|
||||
### 1. Debug Logger Utility ✅
|
||||
|
||||
**File**: `tests/utils/debug-logger.ts` (291 lines)
|
||||
|
||||
**Features**:
|
||||
- Class-based logger with methods: `step()`, `network()`, `pageState()`, `locator()`, `assertion()`, `error()`
|
||||
- Automatic duration tracking for operations
|
||||
- Color-coded console output for local runs (ANSI colors)
|
||||
- Structured JSON output for CI parsing
|
||||
- Sensitive data sanitization (auth headers, tokens)
|
||||
- Network log export (CSV/JSON)
|
||||
- Slow operation detection and reporting
|
||||
- Integration with Playwright test.step() system
|
||||
|
||||
**Key Methods**:
|
||||
```typescript
|
||||
step(name: string, duration?: number) // Log test steps
|
||||
network(entry: NetworkLogEntry) // Log HTTP activity
|
||||
locator(selector, action, found, elapsedMs) // Log element interactions
|
||||
assertion(condition, passed, actual?, expected?) // Log assertions
|
||||
error(context, error, recoveryAttempts?) // Log errors with context
|
||||
getNetworkCSV() // Export network logs as CSV
|
||||
getSlowOperations(threshold?) // Get operations above threshold
|
||||
printSummary() // Print colored summary to console
|
||||
```
|
||||
|
||||
**Output Example**:
|
||||
```
|
||||
├─ Navigate to home page
|
||||
├─ Fill login form (234ms)
|
||||
✅ POST https://api.example.com/login [200] 342ms
|
||||
✓ click "[role='button']" 45ms
|
||||
✓ Assert: Button is visible
|
||||
```
|
||||
|
||||
### 2. Enhanced Global Setup Logging ✅
|
||||
|
||||
**File**: `tests/global-setup.ts` (Updated with timing logs)
|
||||
|
||||
**Enhancements**:
|
||||
- Timing information for health checks (all operations timed)
|
||||
- Port connectivity checks with timing (Caddy admin, emergency server)
|
||||
- IPv4 vs IPv6 detection in URL parsing
|
||||
- Enhanced emergency security reset with elapsed time
|
||||
- Security module disabling verification
|
||||
- Structured logging of all steps in sequential order
|
||||
- Error context on failures with next steps
|
||||
|
||||
**Sample Output**:
|
||||
```
|
||||
🔍 Checking Caddy admin API health at http://localhost:2019...
|
||||
✅ Caddy admin API (port 2019) is healthy [45ms]
|
||||
|
||||
🔍 Checking emergency tier-2 server health at http://localhost:2020...
|
||||
⏭️ Emergency tier-2 server unavailable (tests will skip tier-2 features) [3002ms]
|
||||
|
||||
📊 Port Connectivity Checks:
|
||||
✅ Connectivity Summary: Caddy=✓ Emergency=✗
|
||||
```
|
||||
|
||||
### 3. Enhanced Playwright Config ✅
|
||||
|
||||
**File**: `playwright.config.js` (Updated)
|
||||
|
||||
**Enhancements**:
|
||||
- `trace: 'on-first-retry'` - Captures traces for all retries (not just first)
|
||||
- `video: 'retain-on-failure'` - Records videos only for failed tests
|
||||
- `screenshot: 'only-on-failure'` - Screenshots on failure only
|
||||
- Custom debug reporter integration
|
||||
- Comprehensive comments explaining each option
|
||||
|
||||
**Configuration Added**:
|
||||
```javascript
|
||||
use: {
|
||||
trace: process.env.CI ? 'on-first-retry' : 'on-first-retry',
|
||||
video: process.env.CI ? 'retain-on-failure' : 'retain-on-failure',
|
||||
screenshot: 'only-on-failure',
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Custom Debug Reporter ✅
|
||||
|
||||
**File**: `tests/reporters/debug-reporter.ts` (130 lines)
|
||||
|
||||
**Features**:
|
||||
- Parses test step execution and identifies slow operations (>5s)
|
||||
- Aggregates failures by type (timeout, assertion, network, locator)
|
||||
- Generates structured summary output to stdout
|
||||
- Calculates pass rate and test statistics
|
||||
- Shows slowest 10 tests ranked by duration
|
||||
- Creates visual bar charts for failure distribution
|
||||
|
||||
**Sample Output**:
|
||||
```
|
||||
╔════════════════════════════════════════════════════════════╗
|
||||
║ E2E Test Execution Summary ║
|
||||
╠════════════════════════════════════════════════════════════╣
|
||||
║ Total Tests: 150 ║
|
||||
║ ✅ Passed: 145 (96%) ║
|
||||
║ ❌ Failed: 5 ║
|
||||
║ ⏭️ Skipped: 0 ║
|
||||
╚════════════════════════════════════════════════════════════╝
|
||||
|
||||
⏱️ Slow Tests (>5s):
|
||||
1. Create DNS provider with dynamic parameters 8.92s
|
||||
2. Browse to security dashboard 7.34s
|
||||
3. Configure rate limiting rules 6.15s
|
||||
|
||||
🔍 Failure Analysis by Type:
|
||||
timeout │ ████░░░░░░░░░░░░░░░░░ 2/5 (40%)
|
||||
assertion │ ██░░░░░░░░░░░░░░░░░░ 2/5 (40%)
|
||||
network │ ░░░░░░░░░░░░░░░░░░░░ 1/5 (20%)
|
||||
```
|
||||
|
||||
### 5. Network Interceptor Fixture ✅
|
||||
|
||||
**File**: `tests/fixtures/network.ts` (286 lines)
|
||||
|
||||
**Features**:
|
||||
- Intercepts all HTTP requests and responses
|
||||
- Tracks metrics per request:
|
||||
- URL, method, status code, elapsed time
|
||||
- Request/response headers (auth tokens redacted)
|
||||
- Request/response sizes in bytes
|
||||
- Response content-type
|
||||
- Redirect chains
|
||||
- Network errors with context
|
||||
- Export functions:
|
||||
- CSV format for spreadsheet analysis
|
||||
- JSON format for programmatic access
|
||||
- Analysis methods:
|
||||
- Get slow requests (above threshold)
|
||||
- Get failed requests (4xx/5xx)
|
||||
- Status code distribution
|
||||
- Average response time by URL pattern
|
||||
- Automatic header sanitization (removes auth headers)
|
||||
- Per-test request logging to debug logger
|
||||
|
||||
**Export Example**:
|
||||
```csv
|
||||
"Timestamp","Method","URL","Status","Duration (ms)","Content-Type","Body Size","Error"
|
||||
"2024-01-27T10:30:45.123Z","GET","https://api.example.com/health","200","45","application/json","234",""
|
||||
"2024-01-27T10:30:46.234Z","POST","https://api.example.com/login","200","342","application/json","1024",""
|
||||
```
|
||||
|
||||
### 6. Test Step Logging Helpers ✅
|
||||
|
||||
**File**: `tests/utils/test-steps.ts` (148 lines)
|
||||
|
||||
**Features**:
|
||||
- `testStep()` - Wrapper around test.step() with automatic logging
|
||||
- `LoggedPage` - Page wrapper that logs all interactions
|
||||
- `testAssert()` - Assertion helper with logging
|
||||
- `testStepWithRetry()` - Retry logic with exponential backoff
|
||||
- `measureStep()` - Duration measurement for operations
|
||||
- Automatic error logging on step failure
|
||||
- Soft assertion support (log but don't throw)
|
||||
- Performance tracking per test
|
||||
|
||||
**Usage Example**:
|
||||
```typescript
|
||||
await testStep('Login', async () => {
|
||||
await page.click('[role="button"]');
|
||||
}, { logger });
|
||||
|
||||
const result = await measureStep('API call', async () => {
|
||||
return fetch('/api/data');
|
||||
}, logger);
|
||||
console.log(`Completed in ${result.duration}ms`);
|
||||
```
|
||||
|
||||
### 7. CI Workflow Enhancements ✅
|
||||
|
||||
**File**: `.github/workflows/e2e-tests.yml` (Updated)
|
||||
|
||||
**Environment Variables Added**:
|
||||
```yaml
|
||||
env:
|
||||
DEBUG: 'charon:*,charon-test:*'
|
||||
PLAYWRIGHT_DEBUG: '1'
|
||||
CI_LOG_LEVEL: 'verbose'
|
||||
```
|
||||
|
||||
**Shard Step Enhancements**:
|
||||
- Per-shard start/end logging with timestamps
|
||||
- Shard duration tracking
|
||||
- Sequential output format for easy parsing
|
||||
- Status banner for each shard completion
|
||||
|
||||
**Sample Shard Output**:
|
||||
```
|
||||
════════════════════════════════════════════════════════════
|
||||
E2E Test Shard 1/4
|
||||
Browser: chromium
|
||||
Start Time: 2024-01-27T10:30:45Z
|
||||
════════════════════════════════════════════════════════════
|
||||
[test output]
|
||||
════════════════════════════════════════════════════════════
|
||||
Shard 1 Complete | Duration: 125s
|
||||
════════════════════════════════════════════════════════════
|
||||
```
|
||||
|
||||
**Job Summary Enhancements**:
|
||||
- Per-shard status table with timestamps
|
||||
- Test artifact locations (HTML report, videos, traces, logs)
|
||||
- Debugging tips for common scenarios
|
||||
- Links to view reports and logs
|
||||
|
||||
### 8. VS Code Debug Tasks ✅
|
||||
|
||||
**File**: `.vscode/tasks.json` (4 new tasks added)
|
||||
|
||||
**New Tasks**:
|
||||
|
||||
1. **Test: E2E Playwright (Debug Mode - Full Traces)**
|
||||
- Command: `DEBUG=charon:*,charon-test:* npx playwright test --debug --trace=on`
|
||||
- Opens interactive Playwright Inspector
|
||||
- Captures full traces during execution
|
||||
- **Use when**: Need to step through tests interactively
|
||||
|
||||
2. **Test: E2E Playwright (Debug with Logging)**
|
||||
- Command: `DEBUG=charon:*,charon-test:* PLAYWRIGHT_DEBUG=1 npx playwright test --project=chromium`
|
||||
- Displays enhanced console logging
|
||||
- Shows all network activity and page state
|
||||
- **Use when**: Want to see detailed logs without interactive mode
|
||||
|
||||
3. **Test: E2E Playwright (Trace Inspector)**
|
||||
- Command: `npx playwright show-trace test-results/traces/trace.zip`
|
||||
- Opens Playwright Trace Viewer
|
||||
- Inspect captured traces with full details
|
||||
- **Use when**: Analyzing recorded traces from previous runs
|
||||
|
||||
4. **Test: E2E Playwright - View Coverage Report**
|
||||
- Command: `open coverage/e2e/index.html` (or xdg-open for Linux)
|
||||
- Opens E2E coverage report in browser
|
||||
- Shows what code paths were exercised
|
||||
- **Use when**: Analyzing code coverage from E2E tests
|
||||
|
||||
### 9. Documentation ✅
|
||||
|
||||
**File**: `docs/testing/debugging-guide.md` (600+ lines)
|
||||
|
||||
**Sections**:
|
||||
- Quick start for local testing
|
||||
- VS Code debug task usage guide
|
||||
- Debug logger method reference
|
||||
- Local and CI trace capture instructions
|
||||
- Network debugging and export
|
||||
- Common debugging scenarios with solutions
|
||||
- Performance analysis techniques
|
||||
- Environment variable reference
|
||||
- Troubleshooting tips
|
||||
|
||||
**Features**:
|
||||
- Code examples for all utilities
|
||||
- Sample output for each feature
|
||||
- Commands for common debugging tasks
|
||||
- Links to official Playwright docs
|
||||
- Step-by-step guides for CI failures
|
||||
|
||||
---
|
||||
|
||||
## File Inventory
|
||||
|
||||
### Created Files (4)
|
||||
| File | Lines | Purpose |
|
||||
|------|-------|---------|
|
||||
| `tests/utils/debug-logger.ts` | 291 | Core debug logging utility |
|
||||
| `tests/fixtures/network.ts` | 286 | Network request/response interception |
|
||||
| `tests/utils/test-steps.ts` | 148 | Test step and assertion logging helpers |
|
||||
| `tests/reporters/debug-reporter.ts` | 130 | Custom Playwright reporter for analysis |
|
||||
| `docs/testing/debugging-guide.md` | 600+ | Comprehensive debugging documentation |
|
||||
|
||||
**Total New Code**: 1,455+ lines
|
||||
|
||||
### Modified Files (3)
|
||||
| File | Changes |
|
||||
|------|---------|
|
||||
| `tests/global-setup.ts` | Enhanced timing logs, error context, detailed output |
|
||||
| `playwright.config.js` | Added trace/video/screenshot config, debug reporter integration |
|
||||
| `.github/workflows/e2e-tests.yml` | Added env vars, per-shard logging, improved summaries |
|
||||
| `.vscode/tasks.json` | 4 new debug tasks with descriptions |
|
||||
|
||||
---
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### For Local Testing
|
||||
|
||||
```bash
|
||||
# Enable debug logging with colors
|
||||
DEBUG=charon:*,charon-test:*
|
||||
|
||||
# Enable Playwright debug mode
|
||||
PLAYWRIGHT_DEBUG=1
|
||||
|
||||
# Specify base URL (if not localhost:8080)
|
||||
PLAYWRIGHT_BASE_URL=http://localhost:8080
|
||||
```
|
||||
|
||||
### In CI (GitHub Actions)
|
||||
|
||||
Set automatically in workflow:
|
||||
```yaml
|
||||
env:
|
||||
DEBUG: 'charon:*,charon-test:*'
|
||||
PLAYWRIGHT_DEBUG: '1'
|
||||
CI_LOG_LEVEL: 'verbose'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## VS Code Tasks Available
|
||||
|
||||
All new tasks are in the "test" group in VS Code:
|
||||
|
||||
1. ✅ `Test: E2E Playwright (Debug Mode - Full Traces)`
|
||||
2. ✅ `Test: E2E Playwright (Debug with Logging)`
|
||||
3. ✅ `Test: E2E Playwright (Trace Inspector)`
|
||||
4. ✅ `Test: E2E Playwright - View Coverage Report`
|
||||
|
||||
Plus existing tasks:
|
||||
- `Test: E2E Playwright (Chromium)`
|
||||
- `Test: E2E Playwright (All Browsers)`
|
||||
- `Test: E2E Playwright (Headed)`
|
||||
- `Test: E2E Playwright (Skill)`
|
||||
- `Test: E2E Playwright with Coverage`
|
||||
- `Test: E2E Playwright - View Report`
|
||||
- `Test: E2E Playwright (Debug Mode)` (existing)
|
||||
- `Test: E2E Playwright (Debug with Inspector)` (existing)
|
||||
|
||||
---
|
||||
|
||||
## Output Examples
|
||||
|
||||
### Local Console Output (with ANSI colors)
|
||||
|
||||
```
|
||||
🧹 Running global test setup...
|
||||
|
||||
📍 Base URL: http://localhost:8080
|
||||
└─ Hostname: localhost
|
||||
├─ Port: 8080
|
||||
├─ Protocol: http:
|
||||
├─ IPv6: No
|
||||
└─ Localhost: Yes
|
||||
|
||||
📊 Port Connectivity Checks:
|
||||
🔍 Checking Caddy admin API health at http://localhost:2019...
|
||||
✅ Caddy admin API (port 2019) is healthy [45ms]
|
||||
```
|
||||
|
||||
### Test Execution Output
|
||||
|
||||
```
|
||||
├─ Navigate to home
|
||||
├─ Click login button (234ms)
|
||||
✅ POST https://api.example.com/login [200] 342ms
|
||||
✓ click "[role='button']" 45ms
|
||||
✓ Assert: Button is visible
|
||||
```
|
||||
|
||||
### CI Job Summary
|
||||
|
||||
```
|
||||
## 📊 E2E Test Results
|
||||
|
||||
### Shard Status
|
||||
|
||||
| Shard | Status | Results |
|
||||
|-------|--------|---------|
|
||||
| Shard 1 | ✅ Complete | [Logs](action-url) |
|
||||
| Shard 2 | ✅ Complete | [Logs](action-url) |
|
||||
...
|
||||
|
||||
### Debugging Tips
|
||||
|
||||
1. Check **Videos** in artifacts for visual debugging of failures
|
||||
2. Open **Traces** with Playwright Inspector: `npx playwright show-trace <trace.zip>`
|
||||
3. Review **Docker Logs** for backend errors
|
||||
4. Run failed tests locally with: `npm run e2e -- --grep="test name"`
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Integration Points
|
||||
|
||||
### With Playwright Config
|
||||
|
||||
- Debug reporter automatically invoked
|
||||
- Trace capture configured at project level
|
||||
- Video/screenshot retention for failures
|
||||
- Global setup enhanced with timing
|
||||
|
||||
### With Test Utilities
|
||||
|
||||
- Debug logger can be instantiated in any test
|
||||
- Network interceptor can be attached to any page
|
||||
- Test step helpers integrate with test.step()
|
||||
- Helpers tie directly to debug logger
|
||||
|
||||
### With CI/CD
|
||||
|
||||
- Environment variables set up for automated debugging
|
||||
- Per-shard summaries for parallel execution tracking
|
||||
- Artifact collection for all trace data
|
||||
- Job summary with actionable debugging tips
|
||||
|
||||
---
|
||||
|
||||
## Capabilities Unlocked
|
||||
|
||||
### Before Implementation
|
||||
|
||||
- Basic Playwright HTML report
|
||||
- Limited error messages
|
||||
- Manual trace inspection after test completion
|
||||
- No network-level visibility
|
||||
- Opaque CI failures
|
||||
|
||||
### After Implementation
|
||||
|
||||
✅ **Local Debugging**
|
||||
- Interactive step-by-step debugging
|
||||
- Full trace capture with Playwright Inspector
|
||||
- Color-coded console output with timing
|
||||
- Network requests logged and exportable
|
||||
- Automatic slow operation detection
|
||||
|
||||
✅ **CI Diagnostics**
|
||||
- Per-shard status tracking with timing
|
||||
- Failure categorization by type (timeout, assertion, network)
|
||||
- Aggregated statistics across all shards
|
||||
- Slowest tests highlighted automatically
|
||||
- Artifact collection for detailed analysis
|
||||
|
||||
✅ **Performance Analysis**
|
||||
- Per-operation duration tracking
|
||||
- Network request metrics (status, size, timing)
|
||||
- Automatic identification of slow operations (>5s)
|
||||
- Average response time by endpoint
|
||||
- Request/response size analysis
|
||||
|
||||
✅ **Network Visibility**
|
||||
- All HTTP requests logged
|
||||
- Status codes and response times tracked
|
||||
- Request/response headers (sanitized)
|
||||
- Redirect chains captured
|
||||
- Error context with messages
|
||||
|
||||
✅ **Data Export**
|
||||
- Network logs as CSV for spreadsheet analysis
|
||||
- Structured JSON for programmatic access
|
||||
- Test metrics for trend analysis
|
||||
- Trace files for interactive inspection
|
||||
|
||||
---
|
||||
|
||||
## Validation Checklist
|
||||
|
||||
✅ Debug logger utility created and documented
|
||||
✅ Global setup enhanced with timing logs
|
||||
✅ Playwright config updated with trace/video/screenshot
|
||||
✅ Custom reporter implemented
|
||||
✅ Network interceptor fixture created
|
||||
✅ Test step helpers implemented
|
||||
✅ VS Code tasks added (4 new tasks)
|
||||
✅ CI workflow enhanced with logging
|
||||
✅ Documentation complete with examples
|
||||
✅ All files compile without TypeScript errors
|
||||
|
||||
---
|
||||
|
||||
## Next Steps for Users
|
||||
|
||||
1. **Try Local Debugging**:
|
||||
```bash
|
||||
npm run e2e -- --grep="test-name"
|
||||
```
|
||||
|
||||
2. **Use Debug Tasks in VS Code**:
|
||||
- Open Command Palette (Ctrl+Shift+P)
|
||||
- Type "Run Task"
|
||||
- Select a debug task
|
||||
|
||||
3. **View Test Reports**:
|
||||
```bash
|
||||
npx playwright show-report
|
||||
```
|
||||
|
||||
4. **Inspect Traces**:
|
||||
```bash
|
||||
npx playwright show-trace test-results/[test-name]/trace.zip
|
||||
```
|
||||
|
||||
5. **Export Network Data**:
|
||||
- Tests that use network interceptor export CSV to artifacts
|
||||
- Available in CI artifacts for further analysis
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Issue | Solution |
|
||||
|-------|----------|
|
||||
| No colored output locally | Check `CI` env var is not set |
|
||||
| Traces not captured | Ensure test fails (traces on-first-retry) |
|
||||
| Reporter not running | Verify `tests/reporters/debug-reporter.ts` exists |
|
||||
| Slow to start | First run downloads Playwright, subsequent runs cached |
|
||||
| Network logs empty | Ensure network interceptor attached to page |
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
A comprehensive debugging ecosystem has been successfully implemented for the Playwright E2E test suite. The system provides:
|
||||
|
||||
- **1,455+ lines** of new instrumentation code
|
||||
- **4 new VS Code tasks** for local debugging
|
||||
- **Custom reporter** for automated failure analysis
|
||||
- **Structured logging** with timing and context
|
||||
- **Network visibility** with export capabilities
|
||||
- **CI integration** for automated diagnostics
|
||||
- **Complete documentation** with examples
|
||||
|
||||
This enables developers and QA engineers to debug test failures efficiently, understand performance characteristics, and diagnose integration issues with visibility into every layer (browser, network, application).
|
||||
Reference in New Issue
Block a user