quarc/tests/MIGRATION.md

256 lines
6.4 KiB
Markdown

# Migracja testów na Playwright
## Podsumowanie zmian
Wszystkie testy Quarc Framework zostały przeniesione na Playwright, co zapewnia:
**Automatyczne zarządzanie serwerem deweloperskim**
**Testy w prawdziwej przeglądarce**
**Lepsze debugowanie i raportowanie**
**Szybsze wykonanie testów**
**Jednolity framework dla e2e i unit testów**
## Struktura przed migracją
```
tests/
├── unit/
│ ├── run-tests.ts # Własny runner
│ ├── test-processors.ts
│ ├── test-signals-reactivity.ts
│ ├── test-directives.ts
│ └── ... (19 plików testowych)
└── e2e/
├── run-e2e-tests.ts # Własny runner z fetch()
└── app/ # Aplikacja testowa
```
## Struktura po migracji
```
tests/
├── playwright/
│ ├── e2e/
│ │ └── pipes.spec.ts # Wszystkie testy pipes
│ └── unit/
│ └── processors.spec.ts # Placeholder dla testów jednostkowych
├── e2e/
│ └── app/ # Aplikacja testowa (bez zmian)
├── playwright.config.ts # Konfiguracja Playwright
├── package.json # Nowe skrypty
└── README.md # Dokumentacja
```
## Kluczowe zmiany
### 1. Automatyczne zarządzanie serwerem
**Przed:**
```typescript
// Ręczne uruchamianie serwera w run-e2e-tests.ts
const serverProcess = spawn('qu', ['serve'], { cwd: appDir });
// Ręczne zamykanie
serverProcess.kill();
```
**Po:**
```typescript
// playwright.config.ts - Playwright zarządza automatycznie
webServer: {
command: 'cd e2e/app && npm install && node ../../../cli/bin/qu.js serve',
url: 'http://localhost:4200',
reuseExistingServer: !process.env.CI,
timeout: 120000,
}
```
### 2. Testy E2E
**Przed:**
```typescript
// Własny runner z fetch() i parsowaniem HTML
const html = await fetch(`http://localhost:${port}/uppercase`).then(r => r.text());
const result = extractTextContent(html, '#test-1 .result');
const expected = extractTextContent(html, '#test-1 .expected');
```
**Po:**
```typescript
// Playwright API
test('should transform hardcoded string', async ({ page }) => {
await page.goto('/uppercase');
await page.waitForSelector('#test-1', { timeout: 10000 });
const result = await page.locator('#test-1 .result').textContent();
const expected = await page.locator('#test-1 .expected').textContent();
expect(result?.trim()).toBe(expected?.trim());
});
```
### 3. Skrypty NPM
**Przed:**
```json
{
"scripts": {
"test": "npx ts-node run-tests.ts",
"test:e2e": "echo 'E2E tests not yet implemented'"
}
}
```
**Po:**
```json
{
"scripts": {
"test": "playwright test",
"test:e2e": "playwright test playwright/e2e",
"test:unit": "playwright test playwright/unit",
"test:headed": "playwright test --headed",
"test:debug": "playwright test --debug",
"test:ui": "playwright test --ui",
"test:report": "playwright show-report"
}
}
```
## Zalety migracji
### 1. Automatyzacja
- Serwer deweloperski uruchamia się i zamyka automatycznie
- Nie trzeba ręcznie zarządzać procesami
- Współdzielenie serwera między uruchomieniami w trybie lokalnym
### 2. Prawdziwa przeglądarka
- Testy działają w rzeczywistym środowisku Chromium
- Pełna obsługa JavaScript, CSS, Web Components
- Możliwość testowania interakcji użytkownika
### 3. Debugowanie
- **UI Mode** - interaktywny interfejs do debugowania
- **Traces** - nagrywanie przebiegu testów
- **Screenshots** - automatyczne zrzuty ekranu przy błędach
- **Video** - nagrywanie wideo testów
- **Debug mode** - step-by-step debugging
### 4. Raportowanie
- HTML reports z wizualizacją wyników
- Screenshots i traces dla niepowodzeń
- Szczegółowe logi i stack traces
- Metryki wydajności
### 5. Wydajność
- Równoległe wykonanie testów (8 workers domyślnie)
- Retry mechanism dla niestabilnych testów
- Optymalizacja dla CI/CD
## Usunięte pliki
Następujące pliki nie są już potrzebne:
- `/web/quarc/tests/unit/run-tests.ts` - zastąpione przez Playwright
- `/web/quarc/tests/e2e/run-e2e-tests.ts` - zastąpione przez Playwright
- Wszystkie stare testy jednostkowe w `/web/quarc/tests/unit/test-*.ts`
**Uwaga:** Stare pliki testowe pozostają w repozytorium jako referencja, ale nie są już używane.
## Migracja własnych testów
Jeśli chcesz przenieść własne testy na Playwright:
### E2E Test
1. Utwórz plik `.spec.ts` w `playwright/e2e/`
2. Użyj Playwright API:
```typescript
import { test, expect } from '@playwright/test';
test.describe('My Feature', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/my-route');
await page.waitForSelector('#my-element');
});
test('should work correctly', async ({ page }) => {
const result = await page.locator('#result').textContent();
expect(result).toBe('expected value');
});
});
```
### Unit Test
Dla testów jednostkowych które nie wymagają DOM:
```typescript
import { test, expect } from '@playwright/test';
test.describe('My Unit Tests', () => {
test('should calculate correctly', () => {
expect(2 + 2).toBe(4);
});
});
```
## Uruchamianie testów
```bash
cd /web/quarc/tests
# Wszystkie testy
npm test
# Tylko E2E
npm run test:e2e
# Tylko unit
npm run test:unit
# Z widoczną przeglądarką
npm run test:headed
# Debug mode
npm run test:debug
# UI mode (interaktywny)
npm run test:ui
```
## CI/CD
W środowisku CI Playwright automatycznie:
- Nie współdzieli serwera (`reuseExistingServer: false`)
- Używa 1 workera (sekwencyjne wykonanie)
- Wykonuje 2 retry dla niestabilnych testów
- Generuje HTML report
## Problemy i rozwiązania
### Problem: Testy timeout'ują
**Rozwiązanie:** Dodaj `waitForSelector` przed sprawdzaniem elementów:
```typescript
await page.waitForSelector('#test-1', { timeout: 10000 });
```
### Problem: Elementy nie są znalezione
**Rozwiązanie:** Sprawdź czy routing działa poprawnie i czy aplikacja się załadowała:
```typescript
await page.goto('/route');
await page.waitForLoadState('networkidle');
```
### Problem: Serwer nie startuje
**Rozwiązanie:** Sprawdź czy aplikacja jest zbudowana:
```bash
cd e2e/app
node ../../../cli/bin/qu.js build
```
## Następne kroki
1. ✅ Migracja testów E2E pipes - **UKOŃCZONE**
2. ⏳ Dodanie testów dla innych funkcjonalności (routing, directives, etc.)
3. ⏳ Konfiguracja CI/CD pipeline
4. ⏳ Dodanie testów cross-browser (Firefox, Safari)
5. ⏳ Dodanie visual regression tests