Die Regeln zum Testen stehen in der CLAUDE.md: A10 (Testkurs, Präfix ZZ, flutter analyze und flutter test, Umgang mit der Zugangsdatei) und die Arbeitsregeln (Durchspielen, Bildschirmfotos zum Nachsehen, Warten nach dem Neustart, Bauen nur auf Auftrag). Hier stehen die Werkzeuge und der Ablauf.
- Durchspielen ohne Claude-Sitzung:
bash tool/neustart.sh [profilordner](prüfen, bauen, neu starten),bash tool/mcp_aufruf.sh <werkzeug> '<json>' [mcp-name](ein Werkzeug der laufenden App aufrufen). Ohnemcp-namewird das erste Profil verwendet. Unter Windows aus Git Bash, unter macOS aus der Shell aufrufen, nicht aus Python – warum, steht im Skript.
- Die lokal bestätigte Zuordnung von Instanzen und Testkursen sowie der freigegebene Testrahmen stehen in
~/.config/moocp/e2e/testumgebung.md. Vor Live-Messungen dort nachsehen; echte Kursnummern und Instanzangaben bleiben außerhalb des öffentlichen Repositorys. - Die Zugangsdaten des Lehrkraft-Kontos (Teacher-Edit) für die Spike-Instanz liegen außerhalb des Repos in
~/.config/moocp/e2e/spike-credentials.env(Rechte 600). Sie haben das FormatSCHLUESSEL=WERTmitTEACHER_USERNAMEundTEACHER_PASSWORD;URL_INTERNALundHostdarin betreffen die Testumgebung selbst, nicht die App. - Bauschalter. Der Testbetrieb (Testzugang lesen, automatische Freigaben,
MoodleZugang.fuerTest, Testprofile starten) läuft nur in einem Debug-Bau, der mit--dart-define=MOOCP_TESTBETRIEB=truegebaut ist (lib/testschalter.dart,testbetriebAktiv). Auf dem Mac ist der Debug-Bau der normale Bau,kDebugModeallein trennt das nicht. Ohne den Schalter liest die App die VariablenMOOCP_TESTZUGANG*nicht einmal. Die Entwicklerskripte setzen ihn nur, wenn eine dieser Variablen gesetzt ist (tool/mac_bau.sh, damit auchtool/neustart.shauf dem Mac, undtool/dev.dart);moocp-starten.commandsetzt ihn nie, räumt die Variablen vor dem Bau weg und startet keinen Bau, der ihn hat. - Die App liest die Zugangsdatei nur mit diesem Schalter, wenn
MOOCP_TESTZUGANG_PROFILEeine Zuordnung aus Profilkennung zu Datei und Moodle-Adresse enthält (lib/anmeldedaten.dart). Beispiel mit erfundenen Angaben:MOOCP_TESTZUGANG_PROFILE='{"standard":{"file":"/tmp/testzugang.env","address":"https://moodle.schule.example"},"a1b2c3d4":{"file":"/tmp/zweiter-testzugang.env","address":"https://zweite.schule.example"}}'. Für das Standardprofil istMOOCP_TESTZUGANGmit zusätzlichemMOOCP_TESTZUGANG_ADRESSEals gebundene Einzelzuordnung weiter möglich. Ohne passende Profilkennung und Adresse werden die Dateizugangsdaten und der automatische Freigabemodus nicht verwendet. Der Release-Bau ignoriert alle Variablen. - Begrenzter Debug-Testbetrieb: Eine Bindung kann zusätzlich
"courses":[12]und"screenshots":trueenthalten. In diesen Kursen können Anlegen, Ändern und Löschen eigener verborgener ZZ-Proben automatisch freigegeben werden. Automatisch freigegeben wird nur eine Anfrage, die nicht auf jeder Stufe fragt (abnichtBestaetigungen.keine,lib/freigabe.dart). Dazu gehört das Löschen einer eigenen ZZ-Probe (loeschen,ab„mittel“). Nicht dazu gehören die Bitte, selbst im Browser zu speichern, fachliche Zuordnungen auf Lernlandkarten (lernlandkarte_verknuepfungen_setzen), die Rückfrage vor einer Wiederholung, fremde Sicherungsdateien und das Ersetzen eines Kurses (es löscht und gehört nie zu den eigenen Proben): Sie gehen auch im Testbetrieb an die Lehrkraft. Einzige Ausnahme ist die Freigabe je Bildschirmfoto (FreigabeAnfrage.bildschirmfoto), mitscreenshots:true. Folgeaktionen gelten ausschließlich für in derselben App-Sitzung selbst erzeugte und erfolgreich zurückgelesene Proben oder deren vollständig gegen die Quelle geprüfte Kopien. Eine explizite eigene Auswahl kann in gebundene Testkurse eingefügt werden; eine Dateiwiederherstellung erkennt ausschließlich den Inhalts-Hash ihrer eigenen, geprüften Sicherung aus dieser Sitzung. Nur eindeutig neue, verborgene Kopien mit gleichem Formularinhalt, gleichen Kartendaten, belegten neuen Ortszielen und gleichen gelesenen Datei-Bytes werden übernommen. Prüflücken, fremde ZZ-Archive und Altbestand begründen keinen Testbesitz. Profilkennung, tatsächliche Instanzadresse, Kurs, Name und der vollständige Formularstand werden erneut geprüft; vorhandene ZZ-Objekte sind keine eigenen Proben. Bilder brauchen zusätzlichscreenshots:true. Ohne diese Angaben gibt es keine Testautomatik. Andere Aktivitäten, Fragen, Abschnitte, Sichtbarkeit und sonstige Übertragungen verwenden weiterhin die normale Freigabemechanik. Im Release-Bau ist diese Ausnahme abgeschaltet (E18, E20). - Die App lädt gebundene Testzugänge unabhängig vom gespeicherten Anmeldehaken und meldet alle gebundenen Profile selbst an, bevor ihre MCP-Server bereitgemeldet werden. Fehler eines Profils werden einzeln gemeldet; ein bereites Profil belegt keine zweite Anmeldung. Passwörter werden ausschließlich von der App gelesen.
- Bei einer ausdrücklichen Debug-Testprofilbindung beginnt diese Anmeldung vor einem eventuell wartenden Dialog „KI-Werkzeuge einrichten“. Der Dialog bleibt erforderlich; Testbetrieb richtet weder Verbindungen noch Skills automatisch ein.
- Start:
MOOCP_TESTZUGANG_PROFILE='{"standard":{"file":"/tmp/testzugang.env","address":"https://moodle.schule.example"}}' flutter run -d macos --dart-define=MOOCP_TESTBETRIEB=true. Ohne--dart-definebleiben die Variablen wirkungslos. tool/neustart.shreicht diese Zuordnungen beim Mac-Neustart nur weiter, wennMOOCP_TESTZUGANG_PROFILEoder die passende Legacy-KombinationMOOCP_TESTZUGANGundMOOCP_TESTZUGANG_ADRESSEausdrücklich gesetzt ist; ohne Zuordnung startet die App mit der gespeicherten Anmeldung. Mit Zuordnung bauttool/mac_bau.shmit dem Bauschalter und legt nebenmoocp.appdie Marketestbetriebab (ohne Zuordnung entfernt es sie);tool/mac_start.shbricht mitSTART-FEHLTab, bevor es etwas beendet, wenn die Marke fehlt, der Bau also keinen Testbetrieb hat. Auf Windows bauttool/neustart.sheinen Release-Bau, der den Testbetrieb nie hat; dort geht er nur überflutter run -d windows --dart-define=MOOCP_TESTBETRIEB=true.- Mac-Bau im Temp-Ordner. Im iCloud-Ordner scheitert CodeSign: iCloud (File Provider) hängt an Bundle und Ressourcen die Attribute
com.apple.fileprovider.fpfs#Pundcom.apple.FinderInfo, und CodeSign lehnt sie ab.bash tool/mac_bau.shbaut deshalb in einer Temp-Kopie, kopiertmoocp.appnachbuild/macos/Build/Products/Debug/und entfernt die Kopie auch nach einem Fehler. Der Ordnerbuild/ist ignoriert und liegt im Repo, wo die Lehrkraft die App findet. Anschließend lässt sich die kopierte App mitopen build/macos/Build/Products/Debug/moocp.appstarten. Mitbash tool/mac_bau.sh releaseentsteht auf demselben Weg ein Bau ohne Debugmodus unterbuild/macos/Build/Products/Release/; er hat den Testbetrieb nie und ignoriert die Testzugangs-Variablen. Die macOS-Anleitung unter Teil 4 der README beschreibt den Entwicklungsbau.
- Private Zuordnung aus
~/.config/moocp/e2e/testumgebung.mdlesen und für jede Instanz ausdrücklich Profilkennung, vollständige Adresse, Zugangspfad und freigegebene Testkurse binden. Nichts aus Anzeigenamen oder einer Kursnummer ableiten. Zugangsinhalte nicht lesen.coursesundscreenshotsnur für den bestätigten Testumfang setzen. flutter analyzeundflutter testausführen, dann den Debug-Bau starten.tool/mac_start.shwartet auf alle ausdrücklich gebundenen Testprofile. Pro Profilstatusübertool/mcp_aufruf.shaufrufen; tatsächliche Instanz und angemeldeten Zustand prüfen. Bei fehlender zweiter Anmeldung die Voraussetzung konkret melden und den zweiten Rundlauf offenlassen.- Je Instanz den erlaubten Kurs mit
kurs_uebersichtfrisch lesen; Kursname, Abschnitt-ID und Restbestand festhalten. Im gemeldeten Arbeitsordner einen Entwurf mitpage.htmlerstellen: ÜberschriftZZ Testbetrieb, ein kurzer Absatz mit eindeutigem Laufkennzeichen. Mitaktivitaet_anlegeneine verborgene ZZ-Textseite erzeugen. Nur nachverified: truefortsetzen; cmid aus der Antwort festhalten, bei unklarem Ergebnis nicht erneut anlegen. - Den zurückgelesenen Ordner bearbeiten und mit
aendernspeichern. Wiederverified: trueverlangen, danachaktivitaet_lesenund den gespeicherten Text mit dem Soll vergleichen. bildschirmfotomit der eigenen cmid und einem konkreten Prüfgrund aufrufen. Nur die ausgegebenen PNGs aus dem App-Arbeitsordner öffnen; Überschrift, Absatz und sichtbare Fehler mit dem rückgelesenen Text vergleichen. Browserfehler sind eine fehlende Voraussetzung, kein Anlass für einen anderen Browserzugang (E28). Im normalen Betrieb bleibt die persönliche Freigabe erhalten.- Die eigene Probe nach frischer Namensprüfung mit
loeschenentfernen,verified: trueund den Restbestand überkurs_uebersichtprüfen. Keine vorhandenen ZZ-Objekte anderer Läufe löschen. Lauf einschließlich Profilstart für die zweite Instanz wiederholen. - Öffentliche MCP-Verträge und reale Dialogzustände separat prüfen:
flutter test test/testbetrieb_mcp_test.dart test/freigabe_dialoge_test.dart test/lernlandkarte_verteilen_mcp_test.dart test/testschalter_test.dart.flutter testschaltet den Testbetrieb übertest/flutter_test_config.dartselbst ein (ein Aufruf von Hand braucht kein--dart-define);test/testschalter_test.dartprüft den Normalbetrieb ohne Schalter. Nur Moodle wird durch einen lokalen HTTP-Server ersetzt. Zustimmung, Ablehnung, Fristablauf und Abbruch durchlaufen echte Dialoge ohne Testautomatik. Karten-Zieländerungen prüfen Mehrdeutigkeit, Ziel- und Kurswechsel während des offenen Dialogs sowie das Erhalten der nicht beauftragten Kartendaten. Inhaltsbilder werden im Live-Rundlauf geprüft: Der App-Browser erlaubt ausschließlich HTTPS; die HTTP-Testgrenze darf diese Browserregel nicht aufweichen.
Öffentliche Belege nennen je Testrolle: Anmeldung, Schreib-/Rückleseprobe, Bild angesehen und Befund, Aufräumen und Restbestand. Zwischen „umgesetzt“, „geprüft“ und „wegen fehlender Voraussetzung offen“ unterscheiden; keine echten Adressen, Kursnummern, Zugangs- oder Nutzerpfade veröffentlichen.
Der öffentliche MCP-Test verteilt ein Thema in fünf lokale Zielkurse mit unterschiedlichen Aktivitätsnummern. Er prüft Karteninhalt, Ortsziele und Sichtbarkeit, fehlende Ziele, mehrdeutige Quellauswahl, Quelländerung während der Freigabe, Profilwechsel, Ablehnung, HTTP-Startfehler sowie Wiederholung und Neustart ohne Doppelung. Nur Moodle wird ersetzt. Die Dialogtests prüfen Zustimmung, Ablehnung, Fristablauf und Abbruch über die echte Oberfläche.
Live ausschließlich eigene ZZ-Proben in den privat gebundenen Kursen erzeugen: zwei Textseiten und eine Karte mit zwei Ortszielen. Anfangsbestand festhalten, Quellkarte zurücklesen, mit uebertragen die explizite Auswahl auf die verfügbaren benannten Ziele verteilen. Pro Ziel neue Nummern, Karten-SVG, vollständige Kartendaten und Ortsziele strukturiert gegen die Quelle prüfen; danach einen Wiederholungsversuch ohne erneuten Start belegen. Auf einer zweiten Instanz Sicherung und Wiederherstellung getrennt ausführen: die Kartenverknüpfung wird dort nicht automatisch übernommen. Unbelegte Zuordnungen bleiben offen.
Je Ziel ein Inhaltsbild über die App öffnen und mit dem strukturierten Soll vergleichen. Nur die gegen die eigene Quelle vollständig geprüften, unveränderten Kopien erhalten im gebundenen Debug-Testbetrieb automatische Bildfreigaben. Ohne diesen Nachweis gilt die persönliche Freigabe. Bei fehlender Freigabe den Schritt als offen melden. Der Debug-Nachweis setzt die allgemeine Wiederherstellungsverifikation nicht auf wahr. Nur eigene Proben löschen und den Restbestand mit dem Ausgangsbestand vergleichen. Eine konkrete Zahl realer Ziele erst nach tatsächlichem Rücklesen und Sichtprüfung nennen.