Ein guter Test beschreibt ein erwartetes Verhalten und kann bei einem Fehler fehlschlagen. pytest bietet dafür eine einfache Struktur aus Testfunktionen und Assertions. Coverage beantwortet ergänzend, welche Codebereiche während des Testlaufs ausgeführt wurden.
Mit einem eindeutigen Verhalten beginnen
Speichern Sie das Beispiel als test_add.py. Die Funktion und der Test gehören hier bewusst in dieselbe Datei, damit sich das kurze Beispiel direkt ausführen lässt. In einem Projekt liegen Anwendung und Tests üblicherweise getrennt.
# Beispieltest für eine einfache Funktion
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5
Installieren Sie pytest und Coverage in Ihrer Entwicklungsumgebung. Führen Sie die Tests anschließend aus dem passenden Projektverzeichnis aus. Der folgende Ablauf sammelt die ausgeführten Python-Zeilen und zeigt eine Übersicht an.
# Führen Sie PyTest zusammen mit Coverage aus
coverage run -m pytest
coverage report
Tests aus Anforderungen ableiten
Das kleine Beispiel prüft nur eine einfache Addition. Für eine fachliche Funktion benötigen Sie Fälle aus ihrem Datenvertrag: normale Eingaben, Grenzfälle, fehlerhafte Eingaben und relevante Zustandswechsel. Bei einer Webanwendung gehören je nach Funktion auch Berechtigungen und das Verhalten der Schnittstellen dazu.
Vermeiden Sie Tests, die lediglich den Aufbau der Implementierung wiederholen. Eine interne Umstrukturierung sollte einen Test nicht zerstören, solange das vereinbarte Verhalten erhalten bleibt. Umgekehrt muss eine falsche Ausgabe oder eine verlorene Berechtigungsgrenze sichtbar werden.
Coverage als Hinweis lesen
Ein ausgeführter Codebereich ist nicht automatisch sinnvoll geprüft. Lesen Sie bei wichtigen Funktionen daher auch die Assertions und die erfassten Fälle. Nicht ausgeführte Fehlerpfade sind ein Anlass, die Tests zu überprüfen; eine hohe Abdeckung ist keine Garantie für korrekte Ergebnisse.
Wenn Sie testgetrieben arbeiten, beschreiben Sie die nächste Anforderung zuerst durch einen fehlgeschlagenen Test. Prüfen Sie, ob er aus dem erwarteten Grund rot wird. Erst dann ist sein späterer Erfolg ein hilfreicher Nachweis für die Änderung.
Weiterführende Dokumentation: pytest: Getting started.
Weiterführende Dokumentation: Coverage.py.