Test-Framework: pytest 7 bietet mehr Type Annotations und baut Altlasten ab

Unter den zahlreichen Neuerungen im Major Release des Python-Test-Frameworks finden sich eine umorganisierte Dokumentation sowie zusätzliche Type Annotations.

In Pocket speichern vorlesen Druckansicht 7 Kommentare lesen

(Bild: Svetlana Lukienko/Shutterstock.com)

Lesezeit: 4 Min.
Inhaltsverzeichnis

Mehr als ein Jahr nach dem letzten Minor-Release (6.2.0) vom Dezember 2020 ist jetzt pytest 7.0.0 erschienen. Die Arbeiten am neuen Major Release des Python-Test-Frameworks haben sich länger hingezogen, da insbesondere die Bemühungen, pytest von der py-Bibliothek unabhängiger zu machen, immer neue Probleme aufwarfen und das Entwicklerteam Umwege einschlagen musste, wie The-Compiler Florian Bruhin gegenüber heise Developer erklärte.

Die ursprünglich bereits für Mitte 2021 angedachte Veröffentlichung von pytest 7.0.0 wurde durch zahlreiche notwendige Schritte verzögert, das Framework komplett von py abzuspalten. Die Weiterentwicklung des py-Projekts steht infrage, und für viele der darin enthaltenen Komponenten existiert inzwischen ein Äquivalent in der Python-Standardbibliothek. Während pytest ursprünglich aus dem pylib-Projekt hervorgegangen ist, das als Abspaltung des PyPy-Projekts eine "zusätzliche Standard-Bibliothek" für Python zur Verfügung stellen sollte, sind entscheidende Komponenten wie py.code inzwischen direkt in pytest integriert, pytest._code.

Mit dem neuesten Release von pytest soll nun die Abhängigkeit zu einer weiteren Komponente aus der py-Bibliothek zumindest reduziert werden: py.path dient einem einfacheren Umgang mit Pfad-Objekten. Seit Python 3.4 existiert allerdings schon länger pathlib als äquivalente Komponente in der Python-Standardbibliothek. Die Problematik beim Loslösen von py.path ergibt sich Bruhin zufolge dadurch, dass in der API von pytest py.path-Objekte nahezu omnipräsent sind: Sowohl diverse Testsuites nutzen die tmpdir-Funktion von pytest für temporäre Verzeichnisse, als auch die von fast 1000 Plug-ins genutzten APIs bauen an diversen Stellen auf den veralteten Typ.

Version 7.0 vollzieht nun einen wichtigen Schritt weg von py.path: Fast alle von pytest exponierten Attribute und Argumente wurden durch pathlib-Äquivalente ergänzt, die Nutzung der alten Varianten führt damit zu einer Deprecation-Warnung. Die bisherige Nutzung der APIs sollte bis auf wenige, unvermeidbare Ausnahmen aber weiterhin bis zur endgültigen Entfernung funktionieren, sodass Projekten genug Zeit für die Migration bleibt, versichert Bruhin.

Im Zuge des PEP 484 zogen mit dem typing-Modul Type Hints in Python 3.5 ein. Mit Blick auf Type-Annotationen kommt pytest 7 nun einem vonseiten der Nutzerinnen und Nutzer häufig geäußerten Wunsch nach, der besseren IDE-Support beim Einsatz des Test-Frameworks verspricht: Es exponiert nun auch die Typen der internen Objekte als Teil seiner API. Im Vorgänger-Release waren bereits erste Typen als Teil der API verfügbar, nun kommen 16 weitere hinzu – darunter pytest.Config und pytest.Mark. Damit ist fast die gesamte API von pytest abgedeckt.

Die Dokumentation von pytest präsentiert sich in weiten Teilen überarbeitet. Nach einem System von Divio ist sie in Tutorials, Erklärungen und einen Referenz-Abschnitt aufgeteilt. Insbesondere bei umfassenderen Themen wie etwa den Erklärungen zu Fixtures verspricht die neue Aufteilung eine übersichtlichere Struktur. Dank passend eingerichteter Weiterleitungen sollten sowohl alte Links wie auch der Wechsel zwischen verschiedenen Versionen der Dokumentation laut Bruhin weiterhin reibungslos funktionieren.

Eine versehentliche Nutzung von pytest.mark.skip anstelle von pytest.mark.skipif löst nun einen Fehler aus, anstatt wie bisher den Test zu überspringen. Auch assert pytest.approx(actual, expected) statt assert actual == pytest.approx(expected) führt nun zu einem Fehler. Bei der leicht misszuverstehenden Nutzung von pytest.warns(None) erhalten Anwenderinnen und Anwender künftig Hinweise auf passende Alternativen.

Schließlich wurden zudem diverse Inkonsistenzen in der API eliminiert und an verschiedenen Stellen die Ausgaben von pytest übersichtlicher gestaltet. Eine komplette Auflistung aller Änderungen findet sich im Changelog.

(map)