Testing-Guide
Roestify verwendet Vitest für Unit-/Integrationstests und Playwright für End-to-End-Tests.
Unit-Tests (Vitest)
Setup
# Alle Tests ausführen
npm test
# Watch-Mode (Datei-Änderungen beobachten)
npm run test:watch
# Coverage-Report
npm run test:coverage
Teststruktur
Tests liegen neben den Dateien, die sie testen:
src/lib/validations/lot.ts
src/lib/validations/lot.test.ts
Konventionen
- Dateiname:
*.test.tsoder*.test.tsx - Beschreibung: Deutsche Testbeschreibungen erlaubt, englischer Code
- Assertions: Vitest
expect()API - Mocks:
vi.mock()für externe Dependencies
Beispiel
import { describe, it, expect } from 'vitest';
import { calculateWeightLoss } from './calculateWeightLoss';
describe('calculateWeightLoss', () => {
it('berechnet den Einbrand korrekt', () => {
const result = calculateWeightLoss(1000, 850);
expect(result).toBe(15);
});
it('gibt 0 zurück bei gleichem Gewicht', () => {
const result = calculateWeightLoss(1000, 1000);
expect(result).toBe(0);
});
});
Was testen?
| Bereich | Beispiele |
|---|---|
| Validierungen | Zod-Schemas (gültige/ungültige Eingaben) |
| Berechnungen | Einbrand, Lagerbestand, MwSt, Kaffeesteuer |
| Utilities | Formatierung, Datumskonvertierung, Gewichts-Umrechnung |
| tRPC-Router | Input-Validierung, Business-Logik |
E2E-Tests (Playwright)
Setup
# Browser installieren (einmalig)
npx playwright install chromium
# E2E-Tests ausführen
npx playwright test
# UI-Mode (interaktiv)
npx playwright test --ui
# Bestimmte Spec ausführen
npx playwright test e2e/specs/auth/login.spec.ts
Umgebungsvariablen
E2E-Tests benötigen in .env.local:
E2E_USER_EMAIL=test@example.com
E2E_USER_PASSWORD=TestPassword123
Teststruktur
e2e/
├── fixtures/ # Auth-Setup, Shared Fixtures
│ └── auth.setup.ts # Login vor allen Tests
├── helpers/
│ ├── mocks/ # API-Mocks (Shopify, DHL)
│ └── utils.ts # Shared Test-Utilities
├── pages/ # Page Object Models
│ ├── login.page.ts
│ └── register.page.ts
└── specs/ # Test-Spezifikationen
├── auth/ # Login, Register, Password-Reset
├── dashboard/ # Dashboard, Responsive
├── production/ # Röst-Log, Tonnen, Abpackung
├── settings/ # Team, Shipping, Integrationen
└── integrations/ # Shopify, DHL
Page Object Pattern
// e2e/pages/login.page.ts
export class LoginPage {
constructor(private page: Page) {}
async login(email: string, password: string) {
await this.page.getByLabel('E-Mail').fill(email);
await this.page.getByLabel('Passwort').fill(password);
await this.page.getByRole('button', { name: 'Anmelden' }).click();
}
}
CI/CD
Tests laufen automatisch in GitHub Actions:
- Smoke-Tests (
e2e:smoke): Bei jedem Push aufdev - Full Suite (
e2e:full): Bei PRs aufmain
Aktueller Stand
- 872+ Unit-Tests bestanden
- E2E-Tests decken Auth, Dashboard, Produktion, Settings und Integrationen ab