Testing
Test-Strategie für den sellx Hub - Vitest fuer das Frontend, xUnit fuer das Sidecar, Playwright fuer E2E, plus Coverage-Ziele und manuelle Tests.
Entwickler-Handbuch · Development
Test-Pyramide
/\
/ \ E2E (Playwright)
/----\
/ \ Integration (.NET: SqlExecutorService, PluginLoader)
/--------\
/ \ Unit (xUnit .NET, Vitest TypeScript)
/------------\Frontend-Tests (Vitest)
Datei: sellx-hub/src/test/
cd sellx-hub && npm run testTests:
| Datei | Was getestet wird |
|---|---|
| src/test/sql-formatter.test.ts | SQL-Formatierung und Validator-Output |
| src/test/plugin-loader.test.ts | Plugin-Manifest-Parsing |
| src/test/csv-export.test.ts | CSV-Export-Determinismus |
Tests sind absichtlich isoliert — kein Tauri-IPC, kein DOM. Reine Logik.
Sidecar-Tests (xUnit)
Datei: sellx-sidecar/SellxSidecar.Tests/
cd sellx-sidecar && dotnet testTests:
| Test-Klasse | Was getestet wird |
|---|---|
| SqlSecurityValidatorTests | Alle Verbots-Patterns |
| SqlExecutorServiceTests | Parametrisierung, Timeout, Row-Limit |
| LicenseServiceTests | JWT-Validierung, Token-Version-Check |
| PluginLoaderTests | ZIP-Parsing, Manifest-Validierung |
Tests verwenden eine In-Memory-SQLite-DB und einen Mock-JTL-Server (nicht enthalten).
Mock-Infrastruktur
Im MVP gibt es einen CentralMockService, der die sellx Central-API simuliert:
Datei: sellx-sidecar/SellxSidecar/Services/CentralMockService.cs
Endpoints:
| Endpoint | Verhalten |
|---|---|
| POST /api/hub/activate | Gibt gültiges JWT + Master-Key-Seed zurück |
| POST /api/hub/heartbeat | Bestätigt, gibt Update-Liste leer zurück |
| GET /api/plugins | Gibt Demo-Plugin-Liste zurück |
Der Mock wird per appsettings.Development.json aktiviert:
{
"Central": {
"UseMock": true,
"MockUrl": "http://localhost:5500"
}
}E2E-Tests (Playwright, geplant)
Datei: sellx-hub/e2e/ (geplant)
Setup:
cd sellx-hub
npm run tauri dev &
sleep 10 # Tauri + Sidecar brauchen Zeit
npx playwright testTest-Journeys:
| Journey | Was geprüft wird |
|---|---|
| Setup-Wizard durchlaufen | 3 Schritte, Validation, DB-Rolle erkannt |
| Demo-Plugin laden | Plugin erscheint im Workspace |
| Query ausführen | DataTable zeigt Ergebnisse |
| Plugin deinstallieren | Plugin verschwindet aus Liste |
Test-Fixtures
Lokal-development-für-Tests:
| Fixture | Pfad |
|---|---|
| eazybusiness-sample.bak | Mock-JTL-Wawi (geplant) |
| demo.sellxpkg | Demo-Plugin-Datei |
| master-key-test.bin | Deterministischer Test-Key |
Coverage-Ziele
| Bereich | Ziel | Aktuell |
|---|---|---|
| Sidecar SqlSecurityValidator | 100% | ~95% |
| Sidecar SqlExecutorService | 90% | ~70% |
| Sidecar LicenseService | 90% | ~60% |
| Frontend Utility-Funktionen | 80% | ~50% |
| Frontend React-Components | 50% | ~20% (visual regression bevorzugt) |
Coverage-Reports:
# Sidecar
cd sellx-sidecar
dotnet test --collect:"XPlat Code Coverage"
# Frontend
cd sellx-hub
npm run test:coverageManuelle Tests
Trotz automatisierter Tests sind manuelle Tests gegen echte JTL-Wawi-Instanzen wichtig:
| Test | Anleitung |
|---|---|
| Setup mit echter JTL | Hub installieren, Registry lesen, Verbindung testen |
| Plugin mit echtem Mandanten | 100k+ Artikel, prüfen ob UI responsive bleibt |
| Timeout-Verhalten | Query mit WAITFOR DELAY '00:01:00' → soll nach 30s abbrechen |
| Grace-Period | Subscription deaktivieren, Heartbeat blockieren, nach 7 Tagen prüfen |