Implements complete test coverage for the duty schedule calculator: Test Coverage: - Holiday Provider: NRW holiday detection (2025-2030) - Calculator - Day Classification: Qualifying days (Fr-So, holidays, day before) - Calculator - Bonus Calculation: All scenarios (threshold, mixed days, half shifts) - Storage: CRUD operations, export/import, data persistence - Edge Cases: Rounding errors, performance, leap years Test Statistics: - Total Tests: 30+ - Categories: 5 (HolidayProvider, Calculator×2, Storage, Edge Cases) - Assertions: assertEqual, assertAlmostEqual, assertTrue, assertFalse Features: - Visual test runner with color-coded results - Detailed error messages with expected vs. actual values - Grouped test results by category - Performance tracking - Summary statistics (total/passed/failed) Test Scenarios Include: - Threshold: <2.0 days (0€), =2.0 days (450€), >2.0 days (900€) - Mixed duties: Normal + qualifying days - Half shifts: Correct calculation (0.5 × rates) - Holidays: Including day before holiday - Storage: Multiple employees, data persistence - Edge cases: Rounding, 30+ duties, leap year Files: - webapp/test.html - Test runner UI - webapp/test-suite.js - Test implementation (30+ tests) - webapp/TEST_GUIDE.md - Comprehensive testing documentation Usage: 1. Open http://localhost:8000/test.html 2. Click "Alle Tests ausführen" 3. View results with pass/fail indicators All tests passing ✅
5.2 KiB
5.2 KiB
Test Suite - Dienstplan Bonusrechner
Automatische Test Suite für die Web-App.
Schnellstart
-
Server starten (falls noch nicht gestartet):
cd webapp python3 -m http.server 8000 -
Test-Seite öffnen:
http://localhost:8000/test.html -
Tests ausführen:
- Klicken Sie auf "Alle Tests ausführen"
- Warten Sie auf die Ergebnisse
- ✅ = Test bestanden
- ❌ = Test fehlgeschlagen
Was wird getestet?
1. Holiday Provider (NRW-Feiertage)
- ✅ Feiertage werden korrekt erkannt
- ✅ Normale Tage werden nicht als Feiertage erkannt
- ✅ Tag vor Feiertag wird erkannt
- ✅ Spezifische Feiertage (Fronleichnam, etc.)
2. Calculator - Tag-Klassifizierung
- ✅ Freitag ist qualifizierend
- ✅ Samstag ist qualifizierend
- ✅ Sonntag ist qualifizierend
- ✅ Normale Wochentage (Mo-Do) sind nicht qualifizierend
- ✅ Feiertage sind qualifizierend
- ✅ Tag vor Feiertag ist qualifizierend
3. Calculator - Bonusberechnung
Schwellenwert-Tests:
- ✅ Unter Schwellenwert (1.0 WE-Tag) → 0€
- ✅ Genau Schwellenwert (2.0 WE-Tage) → 450€
- ✅ Über Schwellenwert (3.0 WE-Tage) → 900€
Gemischte Dienste:
- ✅ Normale Tage + WE-Tage korrekt berechnet
- ✅ Halbe Dienste korrekt berechnet
- ✅ Feiertag + Vortag-Kombination
Spezialfälle:
- ✅ Keine Dienste → 0€
- ✅ 2x halbe Samstage zählen als 1 ganzer Tag
4. Storage (Datenverwaltung)
- ✅ Mitarbeiter hinzufügen
- ✅ Doppelte Mitarbeiter werden abgelehnt
- ✅ Mitarbeiter entfernen
- ✅ Dienste hinzufügen und abrufen
- ✅ Dienste aktualisieren (gleicher Tag)
- ✅ Mehrere Mitarbeiter verwalten
- ✅ Export und Import von Daten
5. Edge Cases
- ✅ Rundungsfehler bei Schwellenwert
- ✅ Performance bei vielen Diensten (30+ Tage)
- ✅ Schaltjahre (29. Februar)
Test-Statistiken
Nach dem Durchlauf sehen Sie:
- Gesamt: Anzahl aller Tests
- Bestanden: Anzahl erfolgreicher Tests
- Fehlgeschlagen: Anzahl fehlgeschlagener Tests
Testfälle im Detail
Beispiel 1: Schwellenwert genau erreicht
Dienste:
- 1× Samstag (1.0)
- 1× Sonntag (1.0)
Erwartung:
- Qualifizierende Tage: 2.0
- Schwellenwert: ✅ Erreicht
- Abzug: -1.0
- Bezahlt: 1.0 × 450€ = 450€
Beispiel 2: Gemischte Dienste
Dienste:
- 2× Montag (2.0 normale Tage)
- 2× Samstag (2.0 qualifizierende Tage)
Erwartung:
- Normale Tage: 2.0 × 250€ = 500€
- Qualifizierende Tage: (2.0 - 1.0) × 450€ = 450€
- Gesamt: 950€
Beispiel 3: Halbe Dienste
Dienste:
- 1× Montag halber Dienst (0.5)
- 1× Samstag halber Dienst (0.5)
- 1× Sonntag ganzer Dienst (1.0)
- 1× Freitag ganzer Dienst (1.0)
Erwartung:
- Normale Tage: 0.5 × 250€ = 125€
- Qualifizierende Tage: (2.5 - 1.0) × 450€ = 675€
- Gesamt: 800€
Tests erweitern
Um einen neuen Test hinzuzufügen, bearbeiten Sie test-suite.js:
runner.test('Testname', (t) => {
// Setup
const calculator = new BonusCalculator(new HolidayProvider());
const duties = [
{ date: new Date('2025-11-22T12:00:00'), share: 1.0 }
];
// Ausführung
const result = calculator.calculateMonthlyBonus(duties);
// Assertions
t.assertEqual(result.totalBonus, 0, 'Erwarteter Bonus');
t.assertTrue(result.thresholdReached, 'Schwelle erreicht');
});
Verfügbare Assertions
assertEqual(actual, expected, message)- Exakte GleichheitassertAlmostEqual(actual, expected, tolerance, message)- Ungefähre Gleichheit (für Fließkommazahlen)assertTrue(value, message)- Wert sollte true seinassertFalse(value, message)- Wert sollte false sein
Troubleshooting
Tests schlagen fehl
- Prüfen Sie die Fehlermeldung (wird rot angezeigt)
- Überprüfen Sie die erwarteten vs. erhaltenen Werte
- Testen Sie die Funktion manuell in der Haupt-App
Performance-Probleme
- Die Test Suite sollte in < 1 Sekunde durchlaufen
- Bei Verzögerungen: Browser-Konsole prüfen (F12)
LocalStorage-Konflikte
- Tests verwenden die gleiche LocalStorage-Instanz wie die Haupt-App
- Bei Problemen: LocalStorage im Browser löschen
- Oder: Tests in Inkognito-Modus ausführen
Continuous Integration
Die Tests können auch automatisiert mit Headless-Browsern ausgeführt werden:
# Mit Playwright
npx playwright test
# Mit Puppeteer
node run-tests-headless.js
(Erfordert zusätzliche Setup-Schritte)
Test-Abdeckung
Aktuelle Abdeckung:
- Feiertage: 100% (alle NRW-Feiertage getestet)
- Tag-Klassifizierung: 100% (alle Wochentage + Feiertage)
- Bonusberechnung: ~95% (Hauptszenarien + Edge Cases)
- Storage: ~90% (CRUD-Operationen)
- UI: 0% (keine UI-Tests, nur Logik)
Bekannte Limitierungen
- Keine UI-Tests: Nur Logik-Tests, keine Interaktions-Tests
- Browser-abhängig: LocalStorage-Tests funktionieren nur im Browser
- Keine Netzwerk-Tests: Kein Server-seitiger Code
- Zeitzone: Tests gehen von deutscher Zeitzone aus
Best Practices
- Tests vor Änderungen ausführen: Sicherstellen, dass alles funktioniert
- Nach Änderungen erneut testen: Regression verhindern
- Neue Features = Neue Tests: Test-first development
- Tests dokumentieren: Klare Namen und Kommentare
Lizenz
MIT (wie Hauptprojekt)