Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Regressionstest: ein behobener Fehler bleibt behoben

Nach dieser Lektion: Ich kann eine Fehlermeldung in einen scheiternden Test verwandeln, den Fehler beheben und den Test behalten.

Lektion, 60 Min.13 BefehleLab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Ein einmal behobener Fehler kann zurückkehren

Eine Regression ist ein Fehler, der nach der Behebung zurückkehrt, oder eine Funktion, die nach einer Änderung nicht mehr geht. Ein Regressionstest ist ein Test, der für genau einen gemeldeten Fehler geschrieben wurde, damit dieser nie unbemerkt zurückkommt.

In dieser Lektion meldet eine Kundin einen Fehler. Sie schreiben zuerst den Test, dann die Korrektur.

Am Ende dieser Lektion

Notiz

Ich kann eine Fehlermeldung in einen scheiternden Test verwandeln, den Fehler beheben und den Test behalten.

Schlüsselwörter

BegriffWas er bedeutet
Regressionein Fehler, der zurückkehrt, oder eine Funktion, die nach einer Änderung ausfällt
Regressionstestein Test für einen gemeldeten Fehler, der dauerhaft bleibt
Fehlermeldungwas eine Nutzerin sah, mit der Eingabe, die es auslöste
Rotein Testlauf, in dem ein Test scheitert
Grünein Testlauf, in dem jeder Test besteht
Nachbarfalleine Eingabe neben der aus der Meldung, um zu prüfen, ob der Fehler nur gewandert ist

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Aus einer Fehlermeldung einen Test machen

Ein Laden gibt ein Zehntel Rabatt auf jede Bestellung ab 100 Euro. Eine Kundin schreibt: "Ich habe genau 100 Euro ausgegeben und keinen Rabatt bekommen."

Die Meldung enthält die Eingabe: 10000 Cent. Der Laden rechnet in Cent, damit kein Preis je ein Bruchteil ist. Legen Sie zuerst Ordner und Code an, wie er heute ist, mit dem Fehler darin.

Ordner für die Lektion anlegen

Befehl
mkdir -p ~/regressionstest

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

In den Ordner wechseln

Befehl
cd ~/regressionstest

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Ladencode von heute schreiben

Befehl
printf 'def rabatt(summe_cent):\n    if summe_cent > 10000:\n        return summe_cent // 10\n    return 0\n' > laden.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Test vor der Korrektur schreiben

Machen Sie aus der Meldung einen Test mit genau der Eingabe der Kundin. Benennen Sie ihn nach dem, was sie sah, damit ein Scheitern wie die Meldung klingt.

Lassen Sie ihn laufen, bevor Sie etwas beheben. Er muss scheitern. Ein Test, der auf dem kaputten Code besteht, beweist nichts.

Den Test aus der Meldung schreiben

Befehl
printf 'import unittest\nfrom laden import rabatt\n\n\nclass RabattMeldung(unittest.TestCase):\n    def test_genau_100_euro_bekommen_ein_zehntel(self):\n        self.assertEqual(rabatt(10000), 1000)\n' > test_laden.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Starten und ihn scheitern sehen

Befehl
python3 -m unittest test_laden 2>&1 | grep -E "^(OK|FAILED|AssertionError)"

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 beheben, was der Test zeigt

Im Code steht >, wo die Regel "ab" sagt. Ändern Sie es in >= und sonst nichts. Lassen Sie den Test dann erneut laufen. Er sollte grün werden.

Das Größer-Zeichen ändern

Befehl
sed -i 's|summe_cent > 10000|summe_cent >= 10000|' laden.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Test erneut starten

Befehl
python3 -m unittest test_laden 2>&1 | grep -E "^(OK|FAILED|AssertionError)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Nachbarn des Fehlers ergänzen

Eine Korrektur kann einen Fehler verschieben statt ihn zu beseitigen. Schreiben Sie aus Versehen >= 9999, und eine Bestellung von 99,99 Euro bekommt Rabatt. Testen Sie also die Eingaben auf beiden Seiten der Eingabe aus der Meldung.

Beispiel: die Fälle rund um die Grenze

Bestellung in CentRabatt, den sie bekommen sollWarum der Fall dabei ist
99990Ein Cent darunter: noch kein Rabatt
100001000Die Meldung: genau auf der Grenze
100011000Einen darüber: ganze Cent, abgerundet
250002500Weit darüber: der Rabatt hat keinen Deckel

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Zwei Nachbartests ergänzen

Befehl
printf '    def test_ein_cent_darunter_bekommt_nichts(self):\n        self.assertEqual(rabatt(9999), 0)\n\n    def test_darueber_bekommt_ein_zehntel(self):\n        self.assertEqual(rabatt(25000), 2500)\n' >> test_laden.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Alle drei starten

Befehl
python3 -m unittest test_laden 2>&1 | grep -E "^(OK|FAILED|AssertionError)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Beweisen, dass der Test die Korrektur schützt

Ein Regressionstest zahlt sich aus, wenn der Fehler zurückkehrt. Bauen Sie den Fehler absichtlich wieder ein, wie es eine unachtsame Änderung täte, und sehen Sie, wie die Tests ihn fangen. Dann stellen Sie die Korrektur wieder her.

Den Fehler wieder einbauen

Befehl
sed -i 's|summe_cent >= 10000|summe_cent > 10000|' laden.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Tests starten

Befehl
python3 -m unittest test_laden 2>&1 | grep -E "^(OK|FAILED|AssertionError)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Korrektur wiederherstellen

Befehl
sed -i 's|summe_cent > 10000|summe_cent >= 10000|' laden.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Tests ein letztes Mal starten

Befehl
python3 -m unittest test_laden 2>&1 | grep -E "^(OK|FAILED|AssertionError)"

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 beheben den Fehler, schreiben dann einen Test, der besteht, und gelten als fertig. Dieser Test war nie rot, also weiß niemand, ob er den Fehler finden kann. Schreiben Sie ihn zuerst, sehen Sie ihn scheitern, beheben Sie dann.

Weiterdenken: eine Meldung ohne Eingabe

Manche Meldungen haben keine Eingabe: "Die Summe sah am Dienstag falsch aus". Bevor Sie einen Test schreiben können, müssen Sie eine finden.

Notieren Sie drei Fragen, die Sie der Kundin stellen, um eine Eingabe zu erhalten, die Sie reproduzieren können. Welche stellen Sie zuerst?

Über dieses Lab und seinen Quellcode: Lab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.