Was 100 Prozent Abdeckung nicht verrät
Testabdeckung, englisch Code Coverage, ist der Anteil des Codes, den Ihre Tests mindestens einmal ausführen. Sie zeigt, welche Teile ein Test nie berührt hat.
Eine Prüfungsverwaltung meldet 100 Prozent Abdeckung. Trotzdem rechnet sie eine Note falsch. Die Zahl sagte, dass jede Zeile lief, nicht dass jede Zeile geprüft wurde.
Am Ende dieser Lektion
Notiz
Ich kann eine Abdeckungszahl lesen und sagen, was sie nicht zeigt.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Testabdeckung | der Anteil des Codes, den Tests ausführen | |
| Zeilenabdeckung | der Anteil der ausgeführten Zeilen | |
| Zweigabdeckung | der Anteil der durchlaufenen Wege einer Verzweigung | |
| Spur | die Liste der Zeilen, die ein Lauf ausgeführt hat | |
| Lücke | eine Stelle, die kein Test erreicht | Zeile 7 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Zeilenabdeckung zählt, welche Zeilen liefen
Die Zeilenabdeckung zählt, welche Zeilen mindestens ein Test ausgeführt hat. Das Ergebnis ist ein Anteil.
Hat der Code 6 ausführbare Zeilen und die Tests führen 4 davon aus, sind es 4 von 6, also 66 Prozent. Die übrigen zwei Zeilen sind Lücken, die kein Test erreicht.
Die Spur eines Laufs im Lab drucken
Das Lab hat kein Abdeckungswerkzeug. Ein kleines Skript druckt stattdessen die Nummer jeder Zeile, die die Funktion bewertung ausführt. Das ist die Spur.
Sie legen zensur.py mit der Funktion und spur.py mit dem Skript an und rufen es mit drei Punktzahlen auf.
Den Ordner anlegen
mkdir -p ~/testlaborHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Hineingehen
cd ~/testlaborHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Funktion mit zwei Verzweigungen schreiben
printf 'def bewertung(punkte):\n if punkte >= 50:\n text = "bestanden"\n else:\n text = "nicht bestanden"\n if punkte == 100:\n text = text + " mit Auszeichnung"\n return text\n' > zensur.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Skript für die Spur schreiben
printf 'import sys\nfrom zensur import bewertung\n\ndef spur(frame, ereignis, arg):\n if frame.f_code.co_name == "bewertung" and ereignis == "line":\n print(frame.f_lineno)\n return spur\n\nsys.settrace(spur)\nbewertung(int(sys.argv[1]))\nsys.settrace(None)\n' > spur.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 Spur für 70 Punkte
python3 spur.py 70Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Spur für 30 Punkte
python3 spur.py 30Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Spur für 100 Punkte
python3 spur.py 100Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Beispiel: wer welche Zeilen erreicht
| Zeile | Inhalt | 70 Punkte | 30 Punkte | 100 Punkte |
|---|---|---|---|---|
| 2 | if punkte >= 50 | ja | ja | ja |
| 3 | text = "bestanden" | ja | nein | ja |
| 5 | text = "nicht bestanden" | nein | ja | nein |
| 6 | if punkte == 100 | ja | ja | ja |
| 7 | text = text + " mit Auszeichnung" | nein | nein | ja |
| 8 | return text | ja | ja | ja |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Zweigabdeckung zählt die Wege jeder Verzweigung
Jedes if hat zwei Wege: Die Bedingung trifft zu, oder sie trifft nicht zu. Die Zweigabdeckung zählt, wie viele dieser Wege mindestens ein Test gegangen ist.
Hier gibt es zwei if, also vier Wege. Der Lauf mit 70 Punkten geht zwei davon: den ersten if mit Ja, den zweiten mit Nein. Das sind 50 Prozent.
Ein Beispiel: vier Wege, zwei Tests
| Verzweigung | Weg | 70 Punkte | 30 Punkte |
|---|---|---|---|
| punkte >= 50 | zutreffend | ja | nein |
| punkte >= 50 | nicht zutreffend | nein | ja |
| punkte == 100 | zutreffend | nein | nein |
| punkte == 100 | nicht zutreffend | ja | ja |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele glauben, 100 Prozent Abdeckung heiße fehlerfrei. Die Zahl sagt nur, dass jede Zeile lief. Ob ein Test das Ergebnis prüft, sagt sie nicht. Eine Zeile ohne assert ist ausgeführt und nicht geprüft.
Alle Zeilen laufen, nichts wird geprüft
def bewertung(punkte):
if punkte >= 50:
text = "bestanden"
else:
text = "nicht bestanden"
return text
# Dieser Test führt jede Zeile aus, aber er prüft nichts.
bewertung(70)
bewertung(30)
print("Alle Zeilen laufen, kein assert prüft das Ergebnis")
# Fügen Sie assert bewertung(49) == "bestanden" ein. Starten Sie und lesen Sie die Meldung.