Docs: Verweise auf gelöschte Test-Dateien bereinigt
Die in 6268ea6 entfernten test_app.py / test_metronome_velocity.py
sowie SCROLL_IMPROVEMENTS.md waren noch in mehreren Dokumenten
referenziert. Aktualisiert auf den realen Stand:
- README.md, PROJECT_STRUCTURE.md: Dateibäume und Test-Tabellen/
-Abschnitte bereinigt; Testbefehle auf
'unittest discover -s tests -p "test_*.py"' vereinheitlicht
- tests/README.md, JAVASCRIPT_MODULES.md, setup.sh: Testbefehle und
Beispiel-Verweise auf das tests/-Verzeichnis umgestellt
- README_METRONOME_TESTS.md gelöscht (dokumentierte ausschließlich die
entfernte test_metronome_velocity.py); Metronom-Verweis zeigt nun
auf static/js/metronome.js
- CLAUDE.md in Doku als 'nur lokal, nicht versioniert' gekennzeichnet
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
50326fa1b7
commit
8b44279baa
6 changed files with 14 additions and 251 deletions
|
|
@ -316,11 +316,7 @@ KeyboardHandler → TypewriterApp
|
|||
|
||||
## Testing
|
||||
|
||||
Jedes Modul kann isoliert getestet werden:
|
||||
|
||||
**Backend-Tests**: `python -m unittest test_app -v`
|
||||
|
||||
**Metronom-Tests**: `python -m unittest test_metronome_velocity -v`
|
||||
**Backend-Tests** (Service-Layer): `python -m unittest discover -s tests -p "test_*.py" -v`
|
||||
|
||||
Die JavaScript-Module sind so strukturiert, dass sie leicht mit Jest oder ähnlichen Frameworks getestet werden können.
|
||||
|
||||
|
|
|
|||
|
|
@ -42,15 +42,12 @@ typewriter/
|
|||
├── 📄 requirements.txt # Python-Dependencies
|
||||
├── 📄 alembic.ini # Alembic-Konfiguration
|
||||
│
|
||||
├── 🧪 test_app.py # Backend-Tests (236 Zeilen, 18 Tests)
|
||||
├── 🧪 test_metronome_velocity.py # Metronom-Tests (537 Zeilen)
|
||||
├── 🧪 tests/ # Service-Layer Unit- & Integration-Tests
|
||||
│
|
||||
├── 📚 CLAUDE.md # Projekt-Dokumentation für Claude Code
|
||||
├── 📚 CLAUDE.md # Projekt-Dokumentation für Claude Code (nur lokal)
|
||||
├── 📚 JAVASCRIPT_MODULES.md # JavaScript-Modul-Dokumentation
|
||||
├── 📚 MIGRATIONS.md # Alembic-Migrations-Guide
|
||||
├── 📚 README.md # Haupt-README
|
||||
├── 📚 README_METRONOME_TESTS.md # Metronom-Test-Dokumentation
|
||||
├── 📚 SCROLL_IMPROVEMENTS.md # Scroll-Verbesserungen
|
||||
├── 📚 PROJECT_STRUCTURE.md # Diese Datei
|
||||
│
|
||||
├── 🔧 setup.sh # Komplettes Setup-Script
|
||||
|
|
@ -86,12 +83,12 @@ typewriter/
|
|||
- `.gitignore` - Git-Ignore-Regeln
|
||||
|
||||
### 🟡 Dokumentation (versioniert)
|
||||
- `CLAUDE.md` - Projekt-Guide
|
||||
- `README.md` - Haupt-Dokumentation
|
||||
- `HILFE.md` - Benutzer-Hilfe
|
||||
- `JAVASCRIPT_MODULES.md` - JS-Architektur
|
||||
- `MIGRATIONS.md` - Datenbank-Migrations-Guide
|
||||
- `SCROLL_IMPROVEMENTS.md` - Changelog
|
||||
- `PROJECT_STRUCTURE.md` - Struktur-Übersicht
|
||||
- `CLAUDE.md` - Projekt-Guide für Claude Code (nur lokal, nicht versioniert)
|
||||
|
||||
### 🟠 Scripts (versioniert)
|
||||
- `setup.sh` - Komplettes Setup
|
||||
|
|
@ -100,8 +97,7 @@ typewriter/
|
|||
- `setup_database.py` - Datenbank-Setup
|
||||
|
||||
### 🔴 Tests (versioniert)
|
||||
- `test_app.py` - Backend-Tests
|
||||
- `test_metronome_velocity.py` - Metronom-Tests
|
||||
- `tests/` - Service-Layer Unit- & Integration-Tests (80 Tests)
|
||||
|
||||
### ⚫ Temporär/Generiert (NICHT versioniert)
|
||||
- `venv/` - Virtual Environment
|
||||
|
|
@ -126,7 +122,7 @@ typewriter/
|
|||
```bash
|
||||
source venv/bin/activate # Environment aktivieren
|
||||
python app.py # Server starten
|
||||
python -m unittest test_app # Tests ausführen
|
||||
python -m unittest discover -s tests -p "test_*.py" # Tests ausführen
|
||||
```
|
||||
|
||||
### Datenbank
|
||||
|
|
|
|||
24
README.md
24
README.md
|
|
@ -98,8 +98,6 @@ typewriter/
|
|||
├── app.py # Flask-Hauptanwendung
|
||||
├── models.py # SQLAlchemy Datenbankmodelle
|
||||
├── convert_txt_files_to_lessons_json.py # Tool: TXT → lessons.json
|
||||
├── test_app.py # Unit-Tests (18 Tests)
|
||||
├── test_metronome_velocity.py # Metronom-Tests (22 Tests)
|
||||
├── requirements.txt # Python-Dependencies
|
||||
├── .env # Secret Key (automatisch generiert)
|
||||
├── .gitignore # Git-Ignore-Konfiguration
|
||||
|
|
@ -137,8 +135,7 @@ typewriter/
|
|||
│
|
||||
├── README.md # Diese Datei
|
||||
├── CLAUDE.md # Projektdokumentation für KI
|
||||
├── MIGRATIONS.md # Alembic-Anleitung
|
||||
└── README_METRONOME_TESTS.md # Metronom-Test-Dokumentation
|
||||
└── MIGRATIONS.md # Alembic-Anleitung
|
||||
```
|
||||
|
||||
## 🎮 Verwendung
|
||||
|
|
@ -216,7 +213,6 @@ Das Projekt enthält eine umfassende Test-Suite mit **80 Tests** (100% Erfolgsra
|
|||
| **Gesamt** | 80 Tests | ~2.9s | ✅ 100% |
|
||||
| **Unit Tests** | 54 Tests | 0.002s ⚡ | ✅ Bestanden |
|
||||
| **Integration Tests** | 26 Tests | 2.856s | ✅ Bestanden |
|
||||
| **Legacy Tests** | 40 Tests | ~1s | ✅ Bestanden |
|
||||
|
||||
### Test-Ausführung
|
||||
|
||||
|
|
@ -235,15 +231,6 @@ python -m unittest tests.test_integration_progress tests.test_integration_statis
|
|||
./run_coverage.sh
|
||||
```
|
||||
|
||||
**Legacy Tests (40 Tests):**
|
||||
```bash
|
||||
# App-Tests (18 Tests)
|
||||
python -m unittest test_app -v
|
||||
|
||||
# Metronom-Tests (22 Tests)
|
||||
python test_metronome_velocity.py
|
||||
```
|
||||
|
||||
### Was wird getestet?
|
||||
|
||||
**Service Layer Tests (`tests/`):**
|
||||
|
|
@ -252,10 +239,6 @@ python test_metronome_velocity.py
|
|||
- ✅ **SettingsService** (22): Validierungen, Boundary Values
|
||||
- ✅ **ProgressService** (12): CRUD, State Management, Multi-Lesson Independence
|
||||
|
||||
**Legacy Tests:**
|
||||
- ✅ **App-Tests**: Statistik-Berechnungen, API-Endpoints, Input-Validierung, CSV/JSON-Export
|
||||
- ✅ **Metronom-Tests**: 5 Anpassungsregeln, Realistische Szenarien, Edge Cases
|
||||
|
||||
### Lokale Validierung
|
||||
|
||||
Die Validierung läuft lokal über einen Git-Pre-commit-Hook (aktuell ist keine serverseitige CI eingerichtet).
|
||||
|
|
@ -272,7 +255,6 @@ chmod +x .git/hooks/pre-commit
|
|||
|
||||
**Weitere Informationen:**
|
||||
- 📖 Service Tests: [`tests/README.md`](tests/README.md)
|
||||
- 📖 Metronom Tests: [`README_METRONOME_TESTS.md`](README_METRONOME_TESTS.md)
|
||||
|
||||
## 🔧 Entwicklung
|
||||
|
||||
|
|
@ -389,7 +371,7 @@ Das adaptive Metronom ist das Herzstück des Trainers:
|
|||
- Nach 100 Eingaben: ~200 BPM (Maximum erreicht)
|
||||
- Plus Streak-Boni bei 15+ korrekten Zeichen
|
||||
|
||||
Siehe [`README_METRONOME_TESTS.md`](README_METRONOME_TESTS.md) für detaillierte Erklärung und Tests.
|
||||
Die Implementierung findet sich in [`static/js/metronome.js`](static/js/metronome.js).
|
||||
|
||||
## 📊 Datenbank-Schema
|
||||
|
||||
|
|
@ -432,7 +414,7 @@ Contributions sind willkommen! Bitte:
|
|||
|
||||
1. Fork das Repository
|
||||
2. Erstelle einen Feature-Branch (`git checkout -b feature/AmazingFeature`)
|
||||
3. Führe Tests aus (`python -m unittest test_app -v`)
|
||||
3. Führe Tests aus (`python -m unittest discover -s tests -p "test_*.py" -v`)
|
||||
4. Commit deine Änderungen (`git commit -m 'Add AmazingFeature'`)
|
||||
5. Push zum Branch (`git push origin feature/AmazingFeature`)
|
||||
6. Öffne einen Pull Request
|
||||
|
|
|
|||
|
|
@ -1,211 +0,0 @@
|
|||
# Metronom-Geschwindigkeitsanpassung - Test-Dokumentation
|
||||
|
||||
## Übersicht
|
||||
|
||||
`test_metronome_velocity.py` ist eine umfassende Test-Suite für die adaptive Metronom-Geschwindigkeitsanpassung des Typewriter Trainers. Das Programm implementiert die JavaScript-Logik in Python nach und testet alle Aspekte der Geschwindigkeitsanpassung.
|
||||
|
||||
## Installation und Ausführung
|
||||
|
||||
```bash
|
||||
# Keine zusätzlichen Dependencies nötig (nur Python Standard Library)
|
||||
python test_metronome_velocity.py
|
||||
```
|
||||
|
||||
**Ausgabe:**
|
||||
1. Detaillierte Simulation mit visueller Ausgabe
|
||||
2. 22 Unit-Tests mit detaillierten Ergebnissen
|
||||
|
||||
## Test-Struktur
|
||||
|
||||
### 📊 **Test-Kategorien**
|
||||
|
||||
#### 1. **TestAdaptiveMetronomeBasics** (5 Tests)
|
||||
Grundlegende Funktionalität:
|
||||
- ✅ Initialwerte korrekt gesetzt
|
||||
- ✅ Einzelner korrekter Tastendruck
|
||||
- ✅ Einzelner falscher Tastendruck
|
||||
- ✅ History-Limit auf 50 Einträge
|
||||
- ✅ Consecutive-Counter Reset bei Fehler
|
||||
|
||||
#### 2. **TestAdaptiveMetronomeSpeedAdjustment** (7 Tests)
|
||||
Alle 5 Anpassungsregeln:
|
||||
- ✅ **Regel #1**: Streak-Bonus bei 15+ korrekten Zeichen (+3%)
|
||||
- ✅ **Regel #2**: Zu einfach bei >95% Genauigkeit (+2%)
|
||||
- ✅ **Regel #3**: Zu schwer bei <85% Genauigkeit (-8%)
|
||||
- ✅ **Regel #4**: Leicht unter Ziel bei 85-91% (-3%)
|
||||
- ✅ **Regel #5**: Im Zielbereich bei 91-95% (+1%)
|
||||
- ✅ Minimum-Grenze (40 BPM)
|
||||
- ✅ Maximum-Grenze (200 BPM)
|
||||
|
||||
#### 3. **TestAdaptiveMetronomeScenarios** (6 Tests)
|
||||
Realistische Szenarien:
|
||||
- ✅ **Anfänger**: 70% Genauigkeit → Speed sinkt
|
||||
- ✅ **Fortgeschrittener**: 92% Genauigkeit → Speed steigt leicht
|
||||
- ✅ **Experte**: 98% Genauigkeit → Speed steigt stark
|
||||
- ✅ **Erholung**: Nach Fehlerphase wieder schneller werden
|
||||
- ✅ **Wechselnde Performance**: Auf/Ab-Zyklen
|
||||
- ✅ **Difficulty-Parameter**: Höhere Schwierigkeit = niedrigeres Ziel
|
||||
|
||||
#### 4. **TestAdaptiveMetronomeEdgeCases** (4 Tests)
|
||||
Grenzfälle und Edge Cases:
|
||||
- ✅ Leere History
|
||||
- ✅ Exakt an Regelgrenzen
|
||||
- ✅ Streak exakt bei 15
|
||||
- ✅ Schnelle Wechsel (alternierend korrekt/falsch)
|
||||
|
||||
## 📈 **Detaillierte Simulation**
|
||||
|
||||
Die Simulation zeigt 6 typische Phasen:
|
||||
|
||||
```
|
||||
Phase | Genauigkeit | Speed-Änderung
|
||||
------------------------------|-------------|----------------
|
||||
Anfangsphase (70% korrekt) | 70% | 60 → 40 BPM
|
||||
Verbesserung (85% korrekt) | 85% | 40 → 40 BPM
|
||||
Zielbereich (93% korrekt) | 93% | 40 → 200 BPM
|
||||
Exzellent (98% korrekt) | 98% | 200 → 200 BPM
|
||||
Fehlerphase (50% korrekt) | 50% | 200 → 92 BPM
|
||||
Erholung (95% korrekt) | 95% | 92 → 107 BPM
|
||||
```
|
||||
|
||||
## 🎯 **Wichtige Erkenntnisse aus den Tests**
|
||||
|
||||
### 1. **Schnelle Anpassung bei schlechter Performance**
|
||||
- Bei 70% Genauigkeit: 60 → 40 BPM in 50 Eingaben
|
||||
- System bremst aggressiv ab um Fehlerrate zu reduzieren
|
||||
|
||||
### 2. **Langsame Beschleunigung bei guter Performance**
|
||||
- Bei 92% Genauigkeit: Langsame Steigerung (+1% pro Schritt)
|
||||
- Verhindert Überforderung
|
||||
|
||||
### 3. **Streak-Bonus ist effektiv**
|
||||
- 15+ fehlerfreie Zeichen: +3% Boost
|
||||
- Motiviert zu fehlerfreiem Tippen
|
||||
|
||||
### 4. **Grenzen werden respektiert**
|
||||
- Minimum 40 BPM: Auch bei 0% Genauigkeit
|
||||
- Maximum 200 BPM: Auch bei perfekter Performance
|
||||
|
||||
### 5. **Sliding Window funktioniert**
|
||||
- Letzte 50 Eingaben werden berücksichtigt
|
||||
- Alte Fehler werden vergessen
|
||||
- Erlaubt Erholung nach Fehlerphasen
|
||||
|
||||
## 🔍 **Test-Beispiele**
|
||||
|
||||
### Beispiel 1: Streak-Bonus
|
||||
|
||||
```python
|
||||
metronome = AdaptiveMetronome()
|
||||
# 15 korrekte Zeichen
|
||||
for _ in range(15):
|
||||
metronome.process_keystroke(True)
|
||||
|
||||
initial_speed = metronome.speed
|
||||
# 16. korrektes Zeichen löst Bonus aus
|
||||
speed = metronome.process_keystroke(True)
|
||||
|
||||
# Speed erhöht sich um 3%
|
||||
assert speed == initial_speed * 1.03
|
||||
```
|
||||
|
||||
### Beispiel 2: Zu schwierig → Bremsen
|
||||
|
||||
```python
|
||||
metronome = AdaptiveMetronome()
|
||||
metronome.speed = 100.0
|
||||
|
||||
# 20% Genauigkeit (2 korrekt, 8 falsch)
|
||||
for _ in range(2):
|
||||
metronome.process_keystroke(True)
|
||||
for _ in range(8):
|
||||
metronome.process_keystroke(False)
|
||||
|
||||
initial_speed = metronome.speed
|
||||
metronome.process_keystroke(False)
|
||||
|
||||
# Speed reduziert sich um 8%
|
||||
assert metronome.speed == initial_speed * 0.92
|
||||
```
|
||||
|
||||
## 🐛 **Bekannte Einschränkungen**
|
||||
|
||||
1. **Difficulty-Parameter wird nicht genutzt**
|
||||
- Aktuell immer `1.0` in der JavaScript-Implementation
|
||||
- Könnte für schwierige Zeichenkombinationen verwendet werden
|
||||
|
||||
2. **Consecutive-Counter wird bei JEDEM Fehler resettet**
|
||||
- Verhindert Streak-Bonus bei vereinzelten Fehlern
|
||||
- Könnte toleranter sein (z.B. 1 Fehler pro 20 Zeichen erlauben)
|
||||
|
||||
3. **Speed kann bei Maximum "stecken bleiben"**
|
||||
- Bei 200 BPM und perfekter Performance keine weitere Steigerung
|
||||
- Tests müssen dies berücksichtigen
|
||||
|
||||
## 📊 **Test-Ergebnisse interpretieren**
|
||||
|
||||
### ✅ **Alle Tests bestanden (22/22)**
|
||||
Das adaptive Metronom funktioniert wie designed:
|
||||
- Alle 5 Anpassungsregeln arbeiten korrekt
|
||||
- Grenzen werden eingehalten
|
||||
- Realistische Szenarien werden korrekt verarbeitet
|
||||
|
||||
### ⚠️ **Mögliche Verbesserungen**
|
||||
Basierend auf den Tests könnten folgende Anpassungen sinnvoll sein:
|
||||
|
||||
1. **Sanfteres Bremsen bei Anfängern**
|
||||
- Aktuell: 70% Genauigkeit → Speed auf Minimum
|
||||
- Besser: Graduelleres Abbremsen
|
||||
|
||||
2. **Toleranterer Streak-Counter**
|
||||
- Aktuell: 1 Fehler → Streak auf 0
|
||||
- Besser: Streak nur bei 2+ aufeinanderfolgenden Fehlern resetten
|
||||
|
||||
3. **Dynamische Ziel-Genauigkeit**
|
||||
- Aktuell: Fest auf 96%
|
||||
- Besser: Anpassbar in Settings (aus `target_error_rate` berechnen)
|
||||
|
||||
## 🚀 **Verwendung der Test-Suite**
|
||||
|
||||
### Regression Testing
|
||||
```bash
|
||||
# Nach Änderungen an der Metronom-Logik
|
||||
python test_metronome_velocity.py
|
||||
```
|
||||
|
||||
### Einzelne Tests ausführen
|
||||
```bash
|
||||
# Nur Regel #1 testen
|
||||
python -m unittest test_metronome_velocity.TestAdaptiveMetronomeSpeedAdjustment.test_rule_1_streak_bonus -v
|
||||
|
||||
# Alle Scenario-Tests
|
||||
python -m unittest test_metronome_velocity.TestAdaptiveMetronomeScenarios -v
|
||||
```
|
||||
|
||||
### Neue Tests hinzufügen
|
||||
```python
|
||||
class TestAdaptiveMetronomeSpeedAdjustment(unittest.TestCase):
|
||||
def test_my_new_scenario(self):
|
||||
"""Test: Beschreibung"""
|
||||
metronome = AdaptiveMetronome()
|
||||
|
||||
# Setup
|
||||
# ...
|
||||
|
||||
# Execute
|
||||
result = metronome.process_keystroke(True)
|
||||
|
||||
# Assert
|
||||
self.assertEqual(result, expected_value)
|
||||
```
|
||||
|
||||
## 📝 **Zusammenfassung**
|
||||
|
||||
Die Test-Suite bestätigt, dass die adaptive Metronom-Geschwindigkeit:
|
||||
- ✅ Korrekt auf User-Performance reagiert
|
||||
- ✅ Alle 5 Anpassungsregeln korrekt implementiert
|
||||
- ✅ Grenzen (40-200 BPM) respektiert
|
||||
- ✅ In realistischen Szenarien funktioniert
|
||||
- ✅ Edge Cases korrekt behandelt
|
||||
|
||||
**Empfehlung:** Bei Änderungen an `static/js/script.js` (Zeilen 80-137) immer diese Tests ausführen, um Regressionen zu vermeiden.
|
||||
2
setup.sh
2
setup.sh
|
|
@ -98,5 +98,5 @@ echo ""
|
|||
echo "Weitere Befehle:"
|
||||
echo " • ./cleanup.sh - Projekt aufräumen"
|
||||
echo " • ./start.sh - Anwendung starten"
|
||||
echo " • python test_app.py - Tests ausführen"
|
||||
echo " • python -m unittest discover -s tests -p 'test_*.py' - Tests ausführen"
|
||||
echo ""
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ Dieses Verzeichnis enthält Unit Tests für die Service-Layer der Typewriter Tra
|
|||
|
||||
### Warum unittest statt pytest?
|
||||
|
||||
- Bereits im Projekt verwendet (siehe `test_app.py`)
|
||||
- Bereits im Projekt verwendet (siehe `tests/`)
|
||||
- Keine zusätzlichen Dependencies
|
||||
- Standard Python-Tool
|
||||
- Ausreichend für Service-Layer Unit Tests
|
||||
|
|
@ -220,7 +220,7 @@ if __name__ == '__main__':
|
|||
|
||||
## Integration Tests
|
||||
|
||||
Für vollständige Integration Tests (mit Datenbank, Flask-Context, etc.) siehe `test_app.py` im Hauptverzeichnis.
|
||||
Für vollständige Integration Tests (mit Datenbank, Flask-Context, etc.) siehe `tests/test_integration_progress.py` und `tests/test_integration_statistics.py`.
|
||||
|
||||
## Continuous Integration
|
||||
|
||||
|
|
@ -245,7 +245,7 @@ python -m unittest discover tests -v
|
|||
|
||||
### Problem: SQLAlchemy-Fehler
|
||||
|
||||
**Lösung:** Services mit Datenbankzugriff erfordern Flask-App-Context. Siehe `test_app.py` für Beispiele mit `app.app_context()`.
|
||||
**Lösung:** Services mit Datenbankzugriff erfordern Flask-App-Context. Siehe `tests/test_integration_progress.py` für Beispiele mit `app.app_context()`.
|
||||
|
||||
### Problem: Tests schlagen intermittierend fehl
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue