Plugins¶
So leistungsfähig pytest ist, es kann noch mehr, wenn wir Plugins hinzufügen. Die Codebasis von pytest ist so konzipiert, dass Anpassungen und Erweiterungen möglich sind, und es gibt Hooks, die Änderungen und Verbesserungen durch Plugins ermöglichen.
Es wird euch vielleicht überraschen, dass ihr bereits einige Plugins geschrieben
habt, wenn ihr die vorherigen Abschnitte durchgearbeitet habt. Jedes Mal, wenn
ihr Fixtures oder Hook-Funktionen in die Datei conftest.py
eines
Projekts einfügt, erstellt ihr ein lokales Plugin. Es ist nur ein wenig
zusätzliche Arbeit, diese conftest.py
-Dateien in installierbare Plugins
umzuwandeln, die ihr zwischen Projekten, mit anderen Personen oder mit der
ganzen Welt teilen könnt.
Zunächst beginnen wir jedoch mit der Frage, wo ihr Plugins von Drittanbietern finden könnt. Es gibt eine ganze Reihe von Plugins, so dass die Wahrscheinlichkeit groß ist, dass Änderung, die ihr an pytest vornehmen wollt, bereits geschrieben wurden.
Plugins finden¶
Ihr könnt pytest-Plugins von Drittanbietern an verschiedenen Stellen finden, u.a. enthält die pytest-Dokumentation eine alphabetisch geordnete Liste von Plugins, die von pypi.org stammen. Ihr könnt auch pypi.org selbst durchsuchen, z.B. nach pytest oder nach dem pytest-Framework. Schließlich finden sich in pytest-dev auf GitHub auch viele beliebte pytest-Plugins.
Plugins installieren¶
pytest-Plugins lassen sich, wie anderen Python-Pakete einfach mit pip
installieren: python -m pip install pytest-cov
.
Plugins für …¶
… veränderte Testabläufe¶
pytest führt unsere Tests üblicherweise in einer vorhersehbaren Reihenfolge aus. Bei einem Verzeichnis mit Testdateien führt pytest jede Datei in alphabetischer Reihenfolge aus. Innerhalb jeder Datei wird jeder Test in der Reihenfolge ausgeführt, in der er in der Datei erscheint. Manchmal kann es jedoch sinnvoll sein, diese Reihenfolge zu ändern. Die folgenden Plugins ändern den üblichen Ablauf eines Test:
- pytest-xdist
führt Tests parallel aus, entweder mit mehreren CPUs auf einer Maschine oder mehreren entfernten Maschinen.
- pytest-rerunfailures
führt fehlgeschlagene Tests erneut aus und ist v.a. hilfreich bei fehlerhaften Tests.
- pytest-repeat
macht es einfach, einen oder mehrere Tests zu wiederholen.
- pytest-order
ermöglicht die Festlegung der Reihenfolge durch Markers.
- pytest-randomly
lässt die Tests in zufälliger Reihenfolge ablaufen, zuerst nach Datei, dann nach Klasse, dann schließlich nach Testdatei.
… veränderten Output¶
Die normale pytest-Ausgabe zeigt hauptsächlich Punkte für bestandene Tests und
Zeichen für andere Ausgaben. Wenn ihr -v
übergebt, seht ihr eine Liste von
Testnamen mit dem Ergebnis. Es gibt jedoch Plugins, die die Ausgabe noch weiter
verändern:
- pytest-instafail
fügt eine
--instafail
-Option hinzu, das Tracebacks und Ausgaben von fehlgeschlagenen Tests direkt nach dem Fehlschlag meldet. Normalerweise meldet pytest Tracebacks und Ausgaben von fehlgeschlagenen Tests erst, nachdem alle Tests abgeschlossen wurden.- pytest-sugar
zeigt grüne Häkchen anstelle von Punkten für bestandene Tests und hat einen schönen Fortschrittsbalken. Es zeigt, wie pytest-instafail auch, Fehlschläge sofort an.
- pytest-html
ermöglicht die Erstellung von HTML-Berichten. Berichte können mit zusätzlichen Daten und Bildern, wie z.B. Screenshots von Fehlerfällen, erweitert werden.
- pytest-icdiff
verbessert Diffs in den Fehlermeldungen der Pytest-Assertion mit ICDiff.
… für die Webentwicklung¶
pytest wird ausgiebig für das Testen von Webprojekten verwendet und es gibt eine lange Liste von Plugins, die das Testen weiter vereinfachen:
- pytest-selenium
stellt Fixtures zur Verfügung, die eine einfache Konfiguration von browserbasierten Tests mit Selenium ermöglichen.
- pytest-splinter
bieten die High-Level-API des auf Selenium aufbauenden Splinter um einfacher von pytest aus verwendet zu werden.
- pytest-httpx
… für Fake-Daten¶
Wir haben Faker schon verwendet in Marker mit Fixtures kombinieren, um mehrere Item-Instanzen zu erzeugen. Es gibt viele Fälle in verschiedenen Bereichen, in denen es hilfreich ist, Fake-Daten zu erzeugen. Es überrascht daher nicht, dass es mehrere Plugins gibt, die diesen Bedarf decken:
- Faker
generiert Fake-Daten für euch und bietet ein Faker Fixture für die Verwendung mit pytest.
- pytest-factoryboy
enthält Fixtures für factory-boy, einen Datenbankmodelldatengenerator.
- pytest-mimesis
erzeugt Fake-Daten ähnlich wie Faker, aber Mimesis ist um einiges schneller.
… für Verschiedenes¶
- pytest-cov
führt die Coverage beim Testen aus.
- pytest-benchmark
führt Benchmark-Timing für Code innerhalb von Tests durch.
- pytest-timeout
lässt Tests nicht zu lange laufen.
- pytest-asyncio
testet asynchrone Funktionen.
- pytest-mock
ist ein dünner Wrapper um die unittest.mock-Patching-API.
- pytest-freezegun
friert die Zeit ein, so dass jeder Code, der die Zeit, Datum oder Uhrzeit, liest, während eines Tests denselben Wert erhält.
- pytest-grpc
ist ein Pytest-Plugin für gRPC.
- pytest-bdd
schreibt BDD-Tests mit pytest.
Eigene Plugins¶
Siehe auch