Zum Hauptinhalt springen

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.ts oder *.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?

BereichBeispiele
ValidierungenZod-Schemas (gültige/ungültige Eingaben)
BerechnungenEinbrand, Lagerbestand, MwSt, Kaffeesteuer
UtilitiesFormatierung, Datumskonvertierung, Gewichts-Umrechnung
tRPC-RouterInput-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 auf dev
  • Full Suite (e2e:full): Bei PRs auf main

Aktueller Stand

  • 872+ Unit-Tests bestanden
  • E2E-Tests decken Auth, Dashboard, Produktion, Settings und Integrationen ab