2016-07-29 30 views
7

Ich entwickle eine Test-Suite mit Pytest für ein Projekt von mir. Aufgrund der Art des Projekts muss ich ein Pytest-Plugin erstellen, das steuert, wie die Tests ausgeführt werden. Sie werden nicht lokal ausgeführt, sondern an einen anderen Prozess zur Ausführung gesendet. (Ich weiß über xdist, aber ich denke, dass es mein Problem nicht löst.)Pytest Plugin: Überschreiben pytest_runtest_call und Freunde

Ich habe mein eigenes Pytest-Plugin geschrieben, indem ich die verschiedenen Methoden pytest_runtest_* überschreibe. Bis jetzt ist es gut vorangeschritten. Hier ist, wo ich eine Wand getroffen habe: Ich möchte, dass meine Implementierungen von pytest_runtest_setup, pytest_runtest_call und pytest_runtest_teardown tatsächlich für das Setup, den Anruf und das Teardown verantwortlich sind. Sie werden es in einem anderen Prozess tun. Mein Problem ist: Nach Pyest ruft meine pytest_runtest_setup, ruft es auch alle anderen pytest_runtest_setup auf der Linie der Plugins. Dies liegt daran, dass die Hook-Spezifikation für pytest_runtest_setupfirstresult=False hat.

Ich möchte dies nicht, weil ich nicht pytest_runtest_setup tatsächlich auf den aktuellen Prozess ausführen möchte. Ich möchte dafür verantwortlich sein, es alleine zu führen. Ich möchte überschreiben, wie es ausgeführt wird, nicht hinzufügen zu ihm. Ich möchte die anderen Implementierungen von pytest_runtest_setup unter meinem eigenen nicht laufen lassen.

Wie kann ich das tun?

+2

Es sieht so aus, als müssten Sie eine obskure Funktion auf Pytest einstellen. Habe versucht, den Code für ein bisschen zu betrachten und schien nicht offensichtlich, wenn diese Funktion aufgerufen wird. Vielleicht gibt es eine sauberere, kompatiblere Lösung als Monkeypatching. – Hector

+0

Ich habe keine Zeit, um ein funktionierendes Beispiel zu finden, bevor die Bounty abläuft, aber es sieht so aus, als wäre der Haken dafür: ['pytest_runtest_protocol'] (http://doc.pytest.org/en/latest/ writing_plugins.html # _pytest.hookspec.pytest_runtest_protocol) –

Antwort

0

Generic “runtest” hooks

Alle runtest bezogenen Haken erhalten ein pytest.Item Objekt.

pytest_runtest_protocol (item, nextitem) [Quelle]

implements the runtest_setup/call/teardown protocol for the given test item, including capturing exceptions and calling reporting hooks. 
Parameters: 

    item – test item for which the runtest protocol is performed. 
    nextitem – the scheduled-to-be-next test item (or None if this is the end my friend). This argument is passed on to pytest_runtest_teardown(). 

Return boolean: 

True if no further hook implementations should be invoked. 

pytest_runtest_setup (item) [Quelle]

called before pytest_runtest_call(item). 

pytest_runtest_call (item) [Quelle]

called to execute the test item. 

pytest_runtest_teardown (item, nextitem) [Quelle]

called after pytest_runtest_call. 
Parameters: nextitem – the scheduled-to-be-next test item (None if no further test item is scheduled). This argument can be used to perform exact teardowns, i.e. calling just enough finalizers so that nextitem only needs to call setup-functions. 

pytest_runtest_makereport (Artikel, Call) [Quelle]

return a _pytest.runner.TestReport object for the given pytest.Item and _pytest.runner.CallInfo. 

Zum besseren Verständnis Sie bei der Standardimplementierung dieses Haken in _pytest.runner und vielleicht auch in _pytest.pdb, die mit _pytest interagiert aussehen. Capture und seine Eingabe/Ausgabe-Erfassung, um sofort in das interaktive Debugging zu fallen, wenn ein Testfehler auftritt.

Der angegebene _pytest.terminal verwendet den Berichtshook zum Drucken von Informationen zu einem Testlauf.