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
| Begriff | Was er bedeutet |
|---|---|
| Regression | ein Fehler, der zurückkehrt, oder eine Funktion, die nach einer Änderung ausfällt |
| Regressionstest | ein Test für einen gemeldeten Fehler, der dauerhaft bleibt |
| Fehlermeldung | was eine Nutzerin sah, mit der Eingabe, die es auslöste |
| Rot | ein Testlauf, in dem ein Test scheitert |
| Grün | ein Testlauf, in dem jeder Test besteht |
| Nachbarfall | eine 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
mkdir -p ~/regressionstestHier 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
cd ~/regressionstestHier 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
printf 'def rabatt(summe_cent):\n if summe_cent > 10000:\n return summe_cent // 10\n return 0\n' > laden.pyHier 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
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.pyHier 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
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
sed -i 's|summe_cent > 10000|summe_cent >= 10000|' laden.pyHier 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
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 Cent | Rabatt, den sie bekommen soll | Warum der Fall dabei ist |
|---|---|---|
| 9999 | 0 | Ein Cent darunter: noch kein Rabatt |
| 10000 | 1000 | Die Meldung: genau auf der Grenze |
| 10001 | 1000 | Einen darüber: ganze Cent, abgerundet |
| 25000 | 2500 | Weit darüber: der Rabatt hat keinen Deckel |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Zwei Nachbartests ergänzen
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.pyHier 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
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
sed -i 's|summe_cent >= 10000|summe_cent > 10000|' laden.pyHier 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
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
sed -i 's|summe_cent > 10000|summe_cent >= 10000|' laden.pyHier 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
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?