Der Test scheitert, was nun?
Ein Test scheitert, und Sie wissen nicht, warum. Sie können den Assistenten bitten, den Fehler zu finden. Mit einer vagen Bitte, etwa „es geht nicht“, rät er.
Mit dem richtigen Material findet er die Ursache viel eher. Diese Lektion zeigt, was Sie ihm geben, und wie Sie prüfen, ob seine Korrektur den Fehler erklärt oder ihn nur versteckt.
Am Ende dieser Lektion
Notiz
Ich kann einem Assistenten geben, was er für die Fehlersuche braucht, und prüfen, ob seine Korrektur den Fehler wirklich behebt.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Fehlschlagender Test | ein Test, der den Fehler zeigt | schnitt([2, 4, 6]) |
| Fehlermeldung | der Text, den das Programm bei einem Fehler ausgibt | |
| Ursache | der Grund, aus dem der Fehler auftritt | |
| Notlösung | eine Änderung, die nur den gemeldeten Fall flickt | |
| Kontrollfälle | weitere Fälle, die nach der Korrektur noch bestehen müssen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Was der Assistent für die Fehlersuche braucht
Geben Sie vier Dinge. Erstens den fehlschlagenden Test: den Aufruf, den erwarteten und den erhaltenen Wert. Zweitens die vollständige Fehlermeldung, nicht Ihre Zusammenfassung. Drittens, was Sie schon probiert haben. Viertens die Funktion selbst.
Der Assistent kann nur raten, was nicht auf dem Tisch liegt. Je genauer der Fall, desto weniger rät er.
Eine mögliche Anfrage an den Assistenten
So könnte eine Anfrage lauten: „schnitt([2, 4, 6]) gibt 6, ich erwarte 4. Hier ist die Funktion. Ich habe die Schleife schon geprüft, sie addiert richtig. Nenne zuerst die Ursache, dann eine einzige Änderung.“
Was zurückkommt, ist jedes Mal anders. Lassen Sie sich die Ursache vor der Änderung nennen, und ändern Sie immer nur eine Sache.
Drei Fassungen derselben Funktion
Die Runs unten schreiben in den Ordner demo-fehler/ eine Datei mit drei Fassungen eines Durchschnitts: die fehlerhafte, eine Notlösung und die richtige. Dazu kommt ein Kontrollskript mit fünf Fällen.
Alles ist von Hand geschrieben und keine Antwort eines Assistenten. Zuerst läuft nur der gemeldete Fall.
Drei Fassungen einer Funktion schreiben
docker exec -w /home/node/project agent sh -c "mkdir -p demo-fehler && printf '%s\n' '// Durchschnitt einer Liste von Tagesumsaetzen.' 'function schnitt(liste) {' ' let summe = 0;' ' for (const x of liste) summe = summe + x;' ' return summe / (liste.length - 1);' '}' '// Eine Notloesung: Sie flickt nur den gemeldeten Fall.' 'function notloesung(liste) {' ' if (liste.join() === \"2,4,6\") return 4;' ' return schnitt(liste);' '}' '// Die Korrektur, die den Fehler erklaert: durch die Anzahl teilen.' 'function richtig(liste) {' ' if (liste.length === 0) return 0;' ' let summe = 0;' ' for (const x of liste) summe = summe + x;' ' return summe / liste.length;' '}' 'module.exports = { schnitt, notloesung, richtig };' > demo-fehler/schnitt.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Kontrollskript schreiben
docker exec -w /home/node/project agent sh -c "mkdir -p demo-fehler && printf '%s\n' 'const funktion = require(\"./schnitt.js\")[process.argv[2]];' '// Jeder Fall: die Liste, dann der erwartete Durchschnitt.' 'const faelle = [[[2, 4, 6], 4], [[5], 5], [[1, 2], 1.5], [[10, 20, 30, 40], 25], [[], 0]];' 'const anzahl = process.argv[3] === undefined ? faelle.length : Number(process.argv[3]);' 'let fehler = 0;' 'for (const fall of faelle.slice(0, anzahl)) {' ' const erhalten = funktion(fall[0]);' ' if (erhalten === fall[1]) continue;' ' fehler = fehler + 1;' ' console.log(\"fehler: \" + process.argv[2] + \"(\" + JSON.stringify(fall[0]) + \") gibt \" + erhalten + \", erwartet \" + fall[1]);' '}' 'console.log(process.argv[2] + \": \" + fehler + \" Fehler, Fälle geprüft: \" + anzahl);' > demo-fehler/kontrolle.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Nur den gemeldeten Fall laufen lassen
docker exec -w /home/node/project/demo-fehler agent node kontrolle.js schnitt 1Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Notlösung besteht den gemeldeten Fall
Der gemeldete Fall scheitert, und das ist der Anfang der Suche. Die Notlösung gibt für genau diese Liste 4 zurück und rechnet sonst weiter falsch. Der gemeldete Fall besteht, der Fehler bleibt.
Eine gute Korrektur erklärt, warum der Fall gescheitert ist: Es wurde durch die Anzahl minus eins geteilt. Darum prüfen Sie sie auch an weiteren Kontrollfällen.
Notlösung und richtige Korrektur ausprobieren
docker exec -w /home/node/project/demo-fehler agent sh -c "node kontrolle.js notloesung 1; node kontrolle.js notloesung; node kontrolle.js richtig"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, ein Fehler sei behoben, sobald der gemeldete Test grün ist. Das stimmt nur, wenn die Korrektur die Ursache beseitigt. Besteht nur dieser eine Fall, ist es eine Notlösung. Prüfen Sie darum immer auch Fälle, die Sie nicht gemeldet haben.
Beispiel: drei Fassungen im Vergleich
| Fassung | Gemeldeter Fall | Alle fünf Fälle |
|---|---|---|
| schnitt | 1 Fehler | Mehrere Fehler |
| notloesung | 0 Fehler | 3 Fehler |
| richtig | 0 Fehler | 0 Fehler |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Weiter: an einem anderen Fehler ausprobieren
Jetzt ist ein guter Moment, diese Ideen an einem anderen Fehler auszuprobieren. Der Fehler des Labs bleibt unberührt. Bauen Sie lieber in einer Kopie von shop.js absichtlich einen kleinen Fehler ein.
Geben Sie dem Assistenten Test, Meldung und Versuche, bitten Sie um die Ursache und eine einzige Änderung. Lassen Sie danach Kontrollfälle laufen und notieren Sie, ob er den Fehler erklärt hat.