201 lines
5.2 KiB
Markdown
201 lines
5.2 KiB
Markdown
# Test Suite - Dienstplan Bonusrechner
|
||
|
||
Automatische Test Suite für die Web-App.
|
||
|
||
## Schnellstart
|
||
|
||
1. **Server starten** (falls noch nicht gestartet):
|
||
```bash
|
||
cd webapp
|
||
python3 -m http.server 8000
|
||
```
|
||
|
||
2. **Test-Seite öffnen**:
|
||
```
|
||
http://localhost:8000/test.html
|
||
```
|
||
|
||
3. **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) → 0€
|
||
- ✅ Über Schwellenwert (3.0 WE-Tage) → 450€
|
||
|
||
**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
|
||
```javascript
|
||
Dienste:
|
||
- 1× Samstag (1.0)
|
||
- 1× Sonntag (1.0)
|
||
|
||
Erwartung:
|
||
- Qualifizierende Tage: 2.0
|
||
- Schwellenwert: ✅ Erreicht
|
||
- Abzug: -2.0
|
||
- Bezahlt: 0.0 × 450€ = 0€
|
||
```
|
||
|
||
### Beispiel 2: Gemischte Dienste
|
||
```javascript
|
||
Dienste:
|
||
- 2× Montag (2.0 normale Tage)
|
||
- 2× Samstag (2.0 qualifizierende Tage)
|
||
|
||
Erwartung:
|
||
- Normale Tage: 2.0 × 250€ = 500€
|
||
- Qualifizierende Tage: (2.0 - 2.0) × 450€ = 0€
|
||
- Gesamt: 500€
|
||
```
|
||
|
||
### Beispiel 3: Halbe Dienste
|
||
```javascript
|
||
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`:
|
||
|
||
```javascript
|
||
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 Gleichheit
|
||
- `assertAlmostEqual(actual, expected, tolerance, message)` - Ungefähre Gleichheit (für Fließkommazahlen)
|
||
- `assertTrue(value, message)` - Wert sollte true sein
|
||
- `assertFalse(value, message)` - Wert sollte false sein
|
||
|
||
## Troubleshooting
|
||
|
||
### Tests schlagen fehl
|
||
1. Prüfen Sie die Fehlermeldung (wird rot angezeigt)
|
||
2. Überprüfen Sie die erwarteten vs. erhaltenen Werte
|
||
3. 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:
|
||
|
||
```bash
|
||
# 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
|
||
|
||
1. **Keine UI-Tests**: Nur Logik-Tests, keine Interaktions-Tests
|
||
2. **Browser-abhängig**: LocalStorage-Tests funktionieren nur im Browser
|
||
3. **Keine Netzwerk-Tests**: Kein Server-seitiger Code
|
||
4. **Zeitzone**: Tests gehen von deutscher Zeitzone aus
|
||
|
||
## Best Practices
|
||
|
||
1. **Tests vor Änderungen ausführen**: Sicherstellen, dass alles funktioniert
|
||
2. **Nach Änderungen erneut testen**: Regression verhindern
|
||
3. **Neue Features = Neue Tests**: Test-first development
|
||
4. **Tests dokumentieren**: Klare Namen und Kommentare
|
||
|
||
## Lizenz
|
||
|
||
MIT (wie Hauptprojekt)
|