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--pdbfunktioniert 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_conftestsermöglicht Plugins wie pytest-django, die Umgebung zu beeinflussen, bevor conftest-Dateiendjangoimportieren.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_fixturevorgenommen, siehe unten.
neue Features
experimentelles neues
pytest.yield_fixtureDekorator, der genau dieselben Parameter wie pytest.fixture akzeptiert, aber eineyield-Anweisung anstelle einerreturn statementvon 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
myfuncersetzen.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.