Aufgaben-Python/test_all.py

123 lines
6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
🧪 Gesamttest-Runner & Gamification-Synchronisation
===================================================
Führe dieses Skript aus, um zu sehen, welche Kapitel du bereits erfolgreich gelöst hast
und um deine XP, dein Level und deine Trophäen zu aktualisieren:
python3 test_all.py
"""
import sys
import unittest
from pathlib import Path
from gamification import GamificationManager
KAPITEL = [
# LEHRPFAD 1: GRUNDLAGEN
("Grundlagen 01: Python als Taschenrechner", "lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner"),
("Grundlagen 02: Variablen & Datentypen", "lehrpfad_1_grundlagen/02_variablen_und_datentypen"),
("Grundlagen 03: Interaktive Ein- & Ausgabe", "lehrpfad_1_grundlagen/03_ein_und_ausgabe"),
("Grundlagen 04: Verzweigungen & Bedingungen", "lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen"),
("Grundlagen 05: Schleifen & Wiederholungen", "lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen"),
("Grundlagen 06: Eigene Funktionen & Module", "lehrpfad_1_grundlagen/06_funktionen_und_module"),
("Grundlagen 07: Listen & Sequenzen", "lehrpfad_1_grundlagen/07_listen_und_sequenzen"),
("Grundlagen 08: Textverarbeitung & Strings", "lehrpfad_1_grundlagen/08_textverarbeitung_und_strings"),
("Grundlagen 09: Dictionaries & Sets", "lehrpfad_1_grundlagen/09_dictionaries_und_sets"),
("Grundlagen 10: Comprehensions & Algorithmen", "lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen"),
# LEHRPFAD 2: EINSTIEG IN OOP & TOOLS
("Kapitel 00: Python-Fehlersuche (Warm-up)", "lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen"),
("Kapitel 01: Einstieg in Klassen", "lehrpfad_2_oop_einstieg/01_einstieg_klassen"),
("Kapitel 02: Konstruktor & self", "lehrpfad_2_oop_einstieg/02_init_und_self"),
("Kapitel 03: Methoden & Verhalten", "lehrpfad_2_oop_einstieg/03_methoden_und_verhalten"),
("Kapitel 04: __str__ & Darstellung", "lehrpfad_2_oop_einstieg/04_str_und_darstellung"),
("Kapitel 05: Objekte kombinieren", "lehrpfad_2_oop_einstieg/05_objekte_kombinieren"),
("Kapitel 06: Abschlussprojekt Tamagotchi", "lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi"),
# LEHRPFAD 3: FORTGESCHRITTENES OOP & GUIS
("Kapitel 07: Referenzen & Stammbäume", "lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher"),
("Kapitel 08: Operator Overloading & Dunder", "lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder"),
("Kapitel 09: Eigene Unit Tests & TDD", "lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben"),
("Kapitel 10: Vererbung & super()", "lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super"),
("Kapitel 11: Polymorphie & Interfaces", "lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces"),
("Kapitel 12: Exceptions & Fehlerbehandlung", "lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung"),
("Kapitel 13: Persistenz (JSON & CSV)", "lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv"),
("Kapitel 14: Desktop-GUIs mit Tkinter", "lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter"),
("Kapitel 15: Parameter & Eigene Container", "lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container"),
("Kapitel 16: Master-Abschlussprojekt", "lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt"),
]
def main():
root = Path(__file__).parent.resolve()
print("=" * 68)
print("🎓 PYTHON LERNPORTAL – GESAMTFORTSCHRITT & TESTS")
print("=" * 68)
gesamt_bestanden = 0
bestandene_ordner = []
gesamt_tests_bestanden = 0
for titel, ordner in KAPITEL:
kapitel_pfad = root / ordner
if not kapitel_pfad.exists():
continue
sys.path.insert(0, str(kapitel_pfad))
# Testsuite laden
loader = unittest.TestLoader()
suite = loader.discover(str(kapitel_pfad), pattern="test_aufgabe.py")
# Leisen Runner ausführen
runner = unittest.TextTestRunner(stream=open("/dev/null", "w"), verbosity=0)
result = runner.run(suite)
# Module für saubere Isolation entfernen
if str(kapitel_pfad) in sys.path:
sys.path.remove(str(kapitel_pfad))
for m in list(sys.modules.keys()):
if m in ("aufgabe", "test_aufgabe", "musterloesung"):
del sys.modules[m]
anzahl_tests = result.testsRun
erfolgreich = result.wasSuccessful() and anzahl_tests > 0
if erfolgreich:
print(f" ✅ {titel:48s} ({anzahl_tests}/{anzahl_tests} Tests OK)")
gesamt_bestanden += 1
bestandene_ordner.append(ordner)
gesamt_tests_bestanden += anzahl_tests
else:
fehlgeschlagen = len(result.failures) + len(result.errors)
print(f" ⏳ {titel:48s} (Noch offen / {fehlgeschlagen} Fehler)")
print("=" * 68)
print(f"Ergebnis: {gesamt_bestanden} von {len(KAPITEL)} Kapiteln vollständig gelöst!")
# Gamification-Status aktualisieren
gm = GamificationManager()
events = gm.sync_mit_test_ergebnissen(bestandene_ordner, gesamt_tests_bestanden)
lvl = events["lvl_info"]
print()
print("🎮 GAMIFICATION STATUS:")
print(f" ⭐ Level {lvl['level']} ({lvl['titel']}) | Rang: {lvl['rang']}")
print(f" 💎 XP: {events['gesamt_xp']} XP (Nächste Stufe bei {lvl['naechste_stufe_xp']} XP)")
print(f" 🏆 Trophäen: {len(gm.state.get('freigeschaltete_badges', []))} / 14 freigeschaltet")
if events.get("level_up"):
print(f"\n🎉🎉🎉 LEVEL UP! Du bist jetzt Level {lvl['level']} ({lvl['titel']})! 🎉🎉🎉")
if events.get("neue_badges"):
print("\n🎖️ NEU FREIGESCHALTETE TROPHÄEN:")
for b in events["neue_badges"]:
print(f" ✨ {b['icon']} {b['name']} (+{b['xp_bonus']} XP Bonus!)")
print(f" ↳ {b['desc']}")
print("-" * 68)
print("💡 Zeige deinen vollständigen Pass mit: python3 profil.py")
print("=" * 68)
if __name__ == "__main__":
main()