Files
mockupAWS/frontend/e2e/README.md
Luca Sacchi Ricciardi a5fc85897b
Some checks failed
E2E Tests / Run E2E Tests (push) Has been cancelled
E2E Tests / Visual Regression Tests (push) Has been cancelled
E2E Tests / Smoke Tests (push) Has been cancelled
feat: implement v0.4.0 - Reports, Charts, Comparison, Dark Mode, E2E Testing
Backend (@backend-dev):
- Add ReportService with PDF/CSV generation (reportlab, pandas)
- Implement Report API endpoints (POST, GET, DELETE, download)
- Add ReportRepository and schemas
- Configure storage with auto-cleanup (30 days)
- Rate limiting: 10 downloads/minute
- Professional PDF templates with charts support

Frontend (@frontend-dev):
- Integrate Recharts for data visualization
- Add CostBreakdown, TimeSeries, ComparisonBar charts
- Implement scenario comparison page with multi-select
- Add dark/light mode toggle with ThemeProvider
- Create Reports page with generation form and list
- Add new UI components: checkbox, dialog, tabs, label, skeleton
- Implement useComparison and useReports hooks

QA (@qa-engineer):
- Setup Playwright E2E testing framework
- Create 7 test spec files with 94 test cases
- Add visual regression testing with baselines
- Configure multi-browser testing (Chrome, Firefox, WebKit)
- Add mobile responsive tests
- Create test fixtures and helpers
- Setup GitHub Actions CI workflow

Documentation (@spec-architect):
- Create detailed kanban-v0.4.0.md with 27 tasks
- Update progress.md with v0.4.0 tracking
- Create v0.4.0 planning prompt

Features:
 PDF/CSV Report Generation
 Interactive Charts (Pie, Area, Bar)
 Scenario Comparison (2-4 scenarios)
 Dark/Light Mode Toggle
 E2E Test Suite (94 tests)

Dependencies added:
- Backend: reportlab, pandas, slowapi
- Frontend: recharts, date-fns, @radix-ui/react-checkbox/dialog/tabs
- Testing: @playwright/test

27 tasks completed, 100% v0.4.0 implementation
2026-04-07 16:11:47 +02:00

392 lines
8.9 KiB
Markdown

# End-to-End Testing with Playwright
This directory contains the End-to-End (E2E) test suite for mockupAWS using Playwright.
## Table of Contents
- [Overview](#overview)
- [Setup](#setup)
- [Running Tests](#running-tests)
- [Test Structure](#test-structure)
- [Test Data & Fixtures](#test-data--fixtures)
- [Visual Regression Testing](#visual-regression-testing)
- [Best Practices](#best-practices)
- [Troubleshooting](#troubleshooting)
## Overview
The E2E test suite provides comprehensive testing of the mockupAWS application, covering:
- **Scenario CRUD Operations**: Creating, reading, updating, and deleting scenarios
- **Log Ingestion**: Sending test logs and verifying metrics updates
- **Report Generation**: Generating and downloading PDF and CSV reports
- **Scenario Comparison**: Comparing multiple scenarios side-by-side
- **Navigation**: Testing all routes and responsive design
- **Visual Regression**: Ensuring UI consistency across browsers and viewports
## Setup
### Prerequisites
- Node.js 18+ installed
- Backend API running on `http://localhost:8000`
- Frontend development server
### Installation
Playwright and its dependencies are already configured in the project. To install browsers:
```bash
# Install Playwright browsers
npx playwright install
# Install additional dependencies for browser testing
npx playwright install-deps
```
### Environment Variables
Create a `.env` file in the `frontend` directory if needed:
```env
# Optional: Override the API URL for tests
VITE_API_URL=http://localhost:8000/api/v1
# Optional: Set CI mode
CI=true
```
## Running Tests
### NPM Scripts
The following npm scripts are available:
```bash
# Run all E2E tests in headless mode
npm run test:e2e
# Run tests with UI mode (interactive)
npm run test:e2e:ui
# Run tests in debug mode
npm run test:e2e:debug
# Run tests in headed mode (visible browser)
npm run test:e2e:headed
# Run tests in CI mode
npm run test:e2e:ci
```
### Running Specific Tests
```bash
# Run a specific test file
npx playwright test scenario-crud.spec.ts
# Run tests matching a pattern
npx playwright test --grep "should create"
# Run tests in a specific browser
npx playwright test --project=chromium
# Run tests with specific tag
npx playwright test --grep "@critical"
```
### Updating Visual Baselines
```bash
# Update all visual baseline screenshots
UPDATE_BASELINE=true npx playwright test visual-regression.spec.ts
```
## Test Structure
```
e2e/
├── fixtures/ # Test data and fixtures
│ ├── test-scenarios.ts # Sample scenario data
│ └── test-logs.ts # Sample log data
├── screenshots/ # Visual regression screenshots
│ └── baseline/ # Baseline images
├── global-setup.ts # Global test setup
├── global-teardown.ts # Global test teardown
├── utils/
│ └── test-helpers.ts # Shared test utilities
├── scenario-crud.spec.ts # Scenario CRUD tests
├── ingest-logs.spec.ts # Log ingestion tests
├── reports.spec.ts # Report generation tests
├── comparison.spec.ts # Scenario comparison tests
├── navigation.spec.ts # Navigation and routing tests
├── visual-regression.spec.ts # Visual regression tests
└── README.md # This file
```
## Test Data & Fixtures
### Test Scenarios
The `test-scenarios.ts` fixture provides sample scenarios for testing:
```typescript
import { testScenarios, newScenarioData } from './fixtures/test-scenarios';
// Use in tests
const scenario = await createScenarioViaAPI(request, newScenarioData);
```
### Test Logs
The `test-logs.ts` fixture provides sample log data:
```typescript
import { testLogs, logsWithPII, highVolumeLogs } from './fixtures/test-logs';
// Send logs to scenario
await sendTestLogs(request, scenarioId, testLogs);
```
### API Helpers
Test utilities are available in `utils/test-helpers.ts`:
- `createScenarioViaAPI()` - Create scenario via API
- `deleteScenarioViaAPI()` - Delete scenario via API
- `startScenarioViaAPI()` - Start scenario
- `stopScenarioViaAPI()` - Stop scenario
- `sendTestLogs()` - Send test logs
- `navigateTo()` - Navigate to page with wait
- `waitForLoading()` - Wait for loading states
- `generateTestScenarioName()` - Generate unique test names
## Visual Regression Testing
### How It Works
Visual regression tests capture screenshots of pages/components and compare them against baseline images. Tests fail if differences exceed the configured threshold (20%).
### Running Visual Tests
```bash
# Run all visual regression tests
npx playwright test visual-regression.spec.ts
# Run tests for specific viewport
npx playwright test visual-regression.spec.ts --project="Mobile Chrome"
# Update baselines
UPDATE_BASELINE=true npx playwright test visual-regression.spec.ts
```
### Screenshots Location
- **Baseline**: `e2e/screenshots/baseline/`
- **Actual**: `e2e/screenshots/actual/`
- **Diff**: `e2e/screenshots/diff/`
### Adding New Visual Tests
```typescript
test('new page should match baseline', async ({ page }) => {
await navigateTo(page, '/new-page');
await waitForLoading(page);
const screenshot = await page.screenshot({ fullPage: true });
expect(screenshot).toMatchSnapshot('new-page.png', {
threshold: 0.2, // 20% threshold
});
});
```
## Best Practices
### 1. Use Data Attributes for Selectors
Prefer `data-testid` attributes over CSS selectors:
```tsx
// In component
<button data-testid="submit-button">Submit</button>
// In test
await page.getByTestId('submit-button').click();
```
### 2. Wait for Async Operations
Always wait for async operations to complete:
```typescript
await page.waitForResponse('**/api/scenarios');
await waitForLoading(page);
```
### 3. Clean Up Test Data
Use `beforeAll`/`afterAll` for setup and cleanup:
```typescript
test.describe('Feature', () => {
test.beforeAll(async ({ request }) => {
// Create test data
});
test.afterAll(async ({ request }) => {
// Clean up test data
});
});
```
### 4. Use Unique Test Names
Generate unique names to avoid conflicts:
```typescript
const testName = generateTestScenarioName('My Test');
```
### 5. Test Across Viewports
Test both desktop and mobile:
```typescript
test('desktop view', async ({ page }) => {
await setDesktopViewport(page);
// ...
});
test('mobile view', async ({ page }) => {
await setMobileViewport(page);
// ...
});
```
## Troubleshooting
### Tests Timing Out
If tests timeout, increase the timeout in `playwright.config.ts`:
```typescript
timeout: 90000, // Increase to 90 seconds
```
### Flaky Tests
For flaky tests, use retries:
```bash
npx playwright test --retries=3
```
Or configure in `playwright.config.ts`:
```typescript
retries: process.env.CI ? 2 : 0,
```
### Browser Not Found
If browsers are not installed:
```bash
npx playwright install
```
### API Not Available
Ensure the backend is running:
```bash
# In project root
docker-compose up -d
# or
uvicorn src.main:app --reload --port 8000
```
### Screenshot Comparison Fails
If visual tests fail due to minor differences:
1. Check the diff image in `e2e/screenshots/diff/`
2. Update baseline if the change is intentional:
```bash
UPDATE_BASELINE=true npx playwright test
```
3. Adjust threshold if needed:
```typescript
threshold: 0.3, // Increase to 30%
```
## CI Integration
### GitHub Actions Example
```yaml
name: E2E Tests
on: [push, pull_request]
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
working-directory: frontend
- name: Install Playwright browsers
run: npx playwright install --with-deps
working-directory: frontend
- name: Run E2E tests
run: npm run test:e2e:ci
working-directory: frontend
- name: Upload test results
if: always()
uses: actions/upload-artifact@v3
with:
name: playwright-report
path: frontend/e2e-report/
```
## Coverage Reporting
Playwright E2E tests can be integrated with code coverage tools. To enable coverage:
1. Instrument your frontend code with Istanbul
2. Configure Playwright to collect coverage
3. Generate coverage reports
See [Playwright Coverage Guide](https://playwright.dev/docs/api/class-coverage) for details.
## Contributing
When adding new E2E tests:
1. Follow the existing test structure
2. Use fixtures for test data
3. Add proper cleanup in `afterAll`
4. Include both positive and negative test cases
5. Test across multiple viewports if UI-related
6. Update this README with new test information
## Support
For issues or questions:
- Check the [Playwright Documentation](https://playwright.dev/)
- Review existing tests for examples
- Open an issue in the project repository