pytest-2.4.0: neue Fixture-Features/Hooks und Fehlerbehebungen

Das gerade veröffentlichte pytest-2.4.0 bringt viele Verbesserungen und zahlreiche Fehlerbehebungen, während es abgesehen von wenigen angeblich sehr kleinen Inkompatibilitäten, plugin- und test-suite-kompatibel bleibt. Sehen Sie unten für eine vollständige Liste der Details. Ein paar Feature-Highlights

  • neue Yield-Style Fixtures pytest.yield_fixture, die die Verwendung bestehender With-Style Context Manager in Fixture-Funktionen ermöglichen.

  • verbesserte pdb-Unterstützung: import pdb ; pdb.set_trace() funktioniert nun, ohne dass eine vorherige Deaktivierung der stdout/stderr-Erfassung erforderlich ist. Auch die Option --pdb funktioniert nun bei Sammel- und internen Fehlern, und wir haben einen neuen experimentellen Hook für IDEs/Plugins eingeführt, um das Debugging abzufangen: pytest_exception_interact(node, call, report).

  • kürzere monkeypatch-Variante, um die Angabe eines Importpfads als Ziel zu ermöglichen, zum Beispiel: monkeypatch.setattr("requests.get", myfunc)

  • bessere unittest/nose-Kompatibilität: alle Teardown-Methoden werden nun nur noch aufgerufen, wenn die entsprechende Setup-Methode erfolgreich war.

  • Integration der Tab-Vervollständigung für Befehlszeilenoptionen, wenn argcomplete konfiguriert ist.

  • zulassen von booleschen Ausdrücken direkt mit skipif/xfail, wenn auch ein "reason" angegeben ist.

  • ein neuer Hook pytest_load_initial_conftests ermöglicht Plugins wie pytest-django, die Umgebung zu beeinflussen, bevor conftest-Dateien django importieren.

  • Reporting: färbe die letzte Zeile rot oder grün, je nachdem, ob Fehler aufgetreten sind oder alles bestanden wurde.

Die Dokumentation wurde aktualisiert, um die Änderungen zu berücksichtigen, siehe https://docs.pytest.de

Um pytest zu installieren oder zu aktualisieren

pip install -U pytest # or
easy_install -U pytest

Vielen Dank an alle, die geholfen haben, darunter Floris Bruynooghe, Brianna Laugher, Andreas Pelme, Anthon van der Neut, Anatoly Bubenkoff, Vladimir Keleshev, Mathieu Agopian, Ronny Pfannschmidt, Christian Theunert und viele andere.

mögen die bestandenen Tests mit dir sein,

holger krekel

Änderungen zwischen 2.3.5 und 2.4

bekannte Inkompatibilitäten

  • wenn Sie --genscript ab Python 2.7 aufrufen, erhalten Sie nur ein eigenständiges Skript, das ab Python 2.7 funktioniert. Verwenden Sie Python 2.6, um auch eine Python 2.5-kompatible Version zu erhalten.

  • alle Teardown-Methoden im xunit-Stil (nose-Stil, pytest-Stil, unittest-Stil) werden nicht aufgerufen, wenn die entsprechende Setup-Methode fehlgeschlagen ist. Siehe Issue322 unten.

  • Der Hook pytest_plugin_unregister wurde nie richtig aufgerufen und es gibt keine bekannte Implementierung des Hooks – daher wurde er entfernt.

  • Mit pytest.fixture dekorierte Funktionen können keine Generatoren mehr sein (d.h. yield verwenden). Diese Änderung könnte in 2.4.1 rückgängig gemacht werden, wenn sie unvorhergesehene reale Probleme verursacht. Sie können jedoch immer eine innere Funktion/einen Generator schreiben und zurückgeben und den Fixture-Konsumenten so ändern, dass er den zurückgegebenen Generator durchläuft. Diese Änderung wurde zugunsten des neuen Dekorators pytest.yield_fixture vorgenommen, siehe unten.

neue Features

  • experimentelles neues pytest.yield_fixture Dekorator, der genau dieselben Parameter wie pytest.fixture akzeptiert, aber eine yield-Anweisung anstelle einer return statement von Fixture-Funktionen erzwingt. Dies ermöglicht die direkte Integration mit "with-style" Context Managern in Fixture-Funktionen und vermeidet generell die Registrierung von Finalisierungs-Callbacks zugunsten der Behandlung des "After-Yield" als Teardown-Code. Danke an Andreas Pelme, Vladimir Keleshev, Floris Bruynooghe, Ronny Pfannschmidt und viele andere für die Diskussionen.

  • boolesche Ausdrücke direkt mit skipif/xfail zulassen, wenn ein "reason" angegeben ist. Überarbeitung der Skip-Dokumentation, um "Bedingungen als Booleans" zu empfehlen, da dies Überraschungen beim Import von Markern zwischen Modulen vermeidet. Die Angabe von Bedingungen als Strings bleibt vollständig unterstützt.

  • Reporting: färbe die letzte Zeile rot oder grün, je nachdem, ob Fehler aufgetreten sind oder alles bestanden wurde. Danke Christian Theunert.

  • machen, dass "import pdb ; pdb.set_trace()" nativ bezüglich der Erfassung funktioniert (kein "-s" mehr nötig), was pytest.set_trace() zu einer reinen Abkürzung macht.

  • fix Issue181: --pdb funktioniert nun auch bei Sammelfehlern (und bei internen Fehlern). Dies wurde durch eine leichte interne Refaktorierung und die Einführung eines neuen Hooks pytest_exception_interact (siehe nächster Punkt) implementiert.

  • fix Issue341: Einführung eines neuen experimentellen Hooks für IDEs/Terminals, um das Debugging abzufangen: pytest_exception_interact(node, call, report).

  • neue monkeypatch.setattr()-Variante zur kürzeren Aufrufweise für das Patchen von Klassen/Funktionen aus Modulen

    monkeypatch.setattr("requests.get", myfunc)

    wird die "get"-Funktion des "requests"-Moduls durch myfunc ersetzen.

  • fix Issue322: tearDownClass wird nicht ausgeführt, wenn setUpClass fehlschlägt. Danke Mathieu Agopian für den anfänglichen Fix. Machen Sie auch alle Pytest/Nose-Finalisierer, um dasselbe allgemeine Verhalten nachzuahmen: Wenn ein setupX existiert und fehlschlägt, führen Sie teardownX nicht aus. Dies führt intern eine neue Hilfsmethode "node.addfinalizer()" ein, die nur während der Setup-Phase eines Knotens aufgerufen werden kann.

  • vereinfachen der Signatur von pytest.mark.parametrize(): erlauben Sie die Übergabe eines CSV-separierten Strings zur Angabe von Arg-Namen. Zum Beispiel: pytest.mark.parametrize("input,expected",  [(1,2), (2,3)]) funktioniert ebenso wie das vorherige: pytest.mark.parametrize(("input", "expected"), ...).

  • Unterstützung für setUpModule/tearDownModule-Erkennung hinzufügen, danke Brian Okken.

  • Integration der Tab-Vervollständigung für Optionen durch die Verwendung von "argcomplete". Danke Anthon van der Neut für den PR.

  • Optionen ändern Namen zu Bindestrich-separierten langen Optionen, behalten aber die alte Schreibweise rückwärtskompatibel bei. py.test -h zeigt nur die gebundene Version, z. B. "--collect-only", aber "--collectonly" bleibt ebenfalls gültig (aus Gründen der Rückwärtskompatibilität). Vielen Dank an Anthon van der Neut für die Implementierung und an Hynek Schlawack dafür, dass er uns angetrieben hat.

  • fix Issue 308 - erlauben, einzelne Parameter-Sets beim Parametrisieren zu markieren/xfailen/überspringen. Danke Brianna Laugher.

  • Aufruf des neuen experimentellen Hooks pytest_load_initial_conftests, um 3rd-Party-Plugins zu ermöglichen, etwas zu tun, bevor ein conftest geladen wird.

Fehlerbehebungen

  • fix Issue358 - Erfassungsoptionen werden nun besser mit einem neuen Parser.parse_known_args-Methode geparst.

  • pytest verwendet nun argparse anstelle von optparse (danke Anthon), was bedeutet, dass "argparse" als Abhängigkeit hinzugefügt wird, wenn in Python 2.6-Umgebungen oder älteren installiert wird.

  • fix Issue333: Behebung eines Falls von schlechter Interaktion zwischen unittest/pytest-Hooks.

  • PR27: korrekte Handhabung von nose.SkipTest während des Sammelns. Danke Antonio Cuni, Ronny Pfannschmidt.

  • fix Issue355: junitxml setzt das Attribut name=”pytest” zum testsuite-Tag.

  • fix Issue336: autouse-Fixtures in Plugins sollten wieder funktionieren.

  • fix Issue279: verbesserte Objektvergleiche bei Assertionsfehlern für Standard-Datentypen und Erkennung von collections.abc. Danke an Brianna Laugher und Mathieu Agopian.

  • fix Issue317: Assertion-Rewriter-Unterstützung für die is_package-Methode

  • fix Issue335: Dokumentation des py.code.ExceptionInfo()-Objekts, das von pytest.raises() zurückgegeben wird, danke Mathieu Agopian.

  • entferne implizite distribute_setup-Unterstützung aus setup.py.

  • fix Issue305: ignoriere jegliche Probleme beim Schreiben von pyc-Dateien.

  • SO-17664702: Fixture-Finalizer auch dann aufrufen, wenn die Fixture-Funktion teilweise fehlgeschlagen ist (Finalizer wurden nicht immer vorher aufgerufen)

  • fix Issue320 - Behebung des Klassen-Scopes für Fixtures, wenn sie mit Modul-Level-Funktionen gemischt werden. Danke Anatoly Bubenkoff.

  • Sie können "-q" oder "-qq" angeben, um unterschiedliche Stufen von "leiserem" Reporting zu erhalten (danke Katarzyna Jachim)

  • fix Issue300 - Korrektur der Reihenfolge des Ladens von conftest beim Starten von py.test in einem Unterverzeichnis.

  • fix Issue323 - Sortierung vieler Modul-bezogener Arg-Parametrisierungen

  • sessionfinish-Hooks mit demselben cwd-Kontext wie beim Session-Start ausführen lassen (hilft bei Plugin-Verhalten, das Ausgabedateien mit relativen Pfaden schreibt, wie pytest-cov)

  • fix Issue316 - Sammlungshooks in der Dokumentation ordnungsgemäß referenzieren

  • fix Issue 306 - Bereinigung der -k/-m Optionen, um nur Marker/Testnamen/Keywords bzw. zu matchen. Danke Wouter van Ackooy.

  • verbesserte Doctest-Zählung für Doctests in Python-Modulen – Dateien ohne Doctest-Elemente werden nicht mehr angezeigt und Doctest-Beispiele werden als separate Testelemente gezählt. Danke Danilo Bellini.

  • fix Issue245 durch Abhängigkeit von der veröffentlichten py-1.4.14, die py.io.dupfile repariert, damit es mit Dateien ohne Modus funktioniert. Danke Jason R. Coombs.

  • fix junitxml-Generierung, wenn die Testausgabe Steuerzeichen enthält, Behebung von Issue267, danke Jaap Broekhuizen

  • fix Issue338: --tb-Stil auch für Setup/Teardown-Fehler berücksichtigen. Danke Maho.

  • fix Issue307 - Verwende yaml.safe_load im Beispiel, danke Mark Eichin.

  • bessere Parametrisierungs-Fehlermeldungen, danke Brianna Laugher

  • pytest_terminal_summary(terminalreporter)-Hooks können nun die Methoden ".section(title)" und ".line(msg)" verwenden, um zusätzliche Informationen am Ende eines Testlaufs auszugeben.