Wie man pytest aufruft¶
Im Allgemeinen wird pytest mit dem Befehl pytest aufgerufen (siehe unten für andere Möglichkeiten, pytest aufzurufen). Dies führt alle Tests in allen Dateien aus, deren Namen dem Muster test_*.py oder \*_test.py im aktuellen Verzeichnis und seinen Unterverzeichnissen entsprechen. Im Allgemeinen folgt pytest den Standardregeln für die Testentdeckung.
Festlegen, welche Tests ausgeführt werden sollen¶
Pytest unterstützt verschiedene Möglichkeiten, Tests von der Kommandozeile oder aus einer Datei auszuführen und auszuwählen (siehe unten für Argumente aus Datei lesen).
Tests in einem Modul ausführen
pytest test_mod.py
Tests in einem Verzeichnis ausführen
pytest testing/
Tests anhand von Schlüsselwortausdrücken ausführen
pytest -k 'MyClass and not method'
Dies führt Tests aus, deren Namen mit dem angegebenen *String-Ausdruck* übereinstimmen (Groß-/Kleinschreibung wird nicht beachtet), der Python-Operatoren enthalten kann, die Dateinamen, Klassennamen und Funktionsnamen als Variablen verwenden. Das obige Beispiel führt TestMyClass.test_something aus, aber nicht TestMyClass.test_method_simple. Verwenden Sie "" anstelle von '' im Ausdruck, wenn Sie dies unter Windows ausführen.
Tests anhand von Sammlungsargumenten ausführen
Geben Sie den Moduldateinamen relativ zum Arbeitsverzeichnis an, gefolgt von Spezifikatoren wie dem Klassennamen und Funktionsnamen, die durch :: getrennt sind, und Parametern aus der Parametrisierung, die in [] eingeschlossen sind.
Einen bestimmten Test in einem Modul ausführen
pytest tests/test_mod.py::test_func
Alle Tests in einer Klasse ausführen
pytest tests/test_mod.py::TestClass
Eine bestimmte Testmethode angeben
pytest tests/test_mod.py::TestClass::test_method
Eine bestimmte Parametrisierung eines Tests angeben
pytest tests/test_mod.py::test_func[x1,y2]
Tests anhand von Marker-Ausdrücken ausführen
Alle Tests ausführen, die mit dem Dekorator @pytest.mark.slow dekoriert sind
pytest -m slow
Alle Tests ausführen, die mit dem dekorierten Dekorator @pytest.mark.slow(phase=1) dekoriert sind, wobei das Schlüsselwortargument phase auf 1 gesetzt ist
pytest -m "slow(phase=1)"
Weitere Informationen finden Sie unter Marks.
Tests aus Paketen ausführen
pytest --pyargs pkg.testing
Dies importiert pkg.testing und verwendet dessen Dateisystemspeicherort, um Tests zu finden und auszuführen.
Argumente aus Datei lesen
Hinzugefügt in Version 8.2.
Alle oben genannten können mit dem Präfix @ aus einer Datei gelesen werden
pytest @tests_to_run.txt
wobei tests_to_run.txt einen Eintrag pro Zeile enthält, z.B.
tests/test_file.py
tests/test_mod.py::test_func[x1,y2]
tests/test_mod.py::TestClass
-m slow
Diese Datei kann auch mit pytest --collect-only -q generiert und nach Bedarf geändert werden.
Hilfe zu Version, Optionsnamen, Umgebungsvariablen erhalten¶
pytest --version # shows where pytest was imported from
pytest --fixtures # show available builtin function arguments
pytest -h | --help # show help on command line and config file options
Profiling der Testausführungsdauer¶
Geändert in Version 6.0.
Die langsamsten 10 Testdauern über 1,0 s anzeigen
pytest --durations=10 --durations-min=1.0
Standardmäßig zeigt pytest keine zu kurzen Testdauern (<0,005 s) an, es sei denn, -vv wird auf der Kommandozeile übergeben.
Verwaltung des Ladens von Plugins¶
Frühes Laden von Plugins¶
Sie können Plugins (intern und extern) explizit über die Kommandozeile mit der Option -p frühzeitig laden
pytest -p mypluginmodule
Die Option erhält einen Parameter name, der sein kann
Ein vollständiger Modul-Punktname, z.B.
myproject.plugins. Dieser Punktname muss importierbar sein.Der Entry-Point-Name eines Plugins. Dies ist der Name, der an
importlibübergeben wird, wenn das Plugin registriert wird. Um beispielsweise das Plugin pytest-cov frühzeitig zu laden, können Sie verwendenpytest -p pytest_cov
Deaktivieren von Plugins¶
Um das Laden bestimmter Plugins zur Laufzeit zu deaktivieren, verwenden Sie die Option -p zusammen mit dem Präfix no:.
Beispiel: Um das Laden des Plugins doctest, das für die Ausführung von Doctest-Tests aus Textdateien zuständig ist, zu deaktivieren, rufen Sie pytest wie folgt auf
pytest -p no:doctest
Andere Möglichkeiten, pytest aufzurufen¶
Aufruf von pytest über python -m pytest¶
Sie können Tests über den Python-Interpreter von der Kommandozeile aus aufrufen
python -m pytest [...]
Dies ist fast äquivalent zum direkten Aufruf des Kommandozeilen-Skripts pytest [...], außer dass der Aufruf über python auch das aktuelle Verzeichnis zu sys.path hinzufügt.
Aufruf von pytest aus Python-Code¶
Sie können pytest direkt aus Python-Code aufrufen
retcode = pytest.main()
dies verhält sich so, als würden Sie "pytest" von der Kommandozeile aus aufrufen. Es wird keine SystemExit ausgelöst, sondern stattdessen der Exit-Code zurückgegeben. Wenn Sie keine Argumente übergeben, liest main die Argumente aus den Kommandozeilenargumenten des Prozesses (sys.argv), was unerwünscht sein kann. Sie können Optionen und Argumente explizit übergeben
retcode = pytest.main(["-x", "mytestdir"])
Sie können zusätzliche Plugins an pytest.main übergeben
# content of myinvoke.py
import sys
import pytest
class MyPlugin:
def pytest_sessionfinish(self):
print("*** test run reporting finishing")
if __name__ == "__main__":
sys.exit(pytest.main(["-qq"], plugins=[MyPlugin()]))
Beim Ausführen wird angezeigt, dass MyPlugin hinzugefügt wurde und sein Hook aufgerufen wurde
$ python myinvoke.py
*** test run reporting finishing
Hinweis
Der Aufruf von pytest.main() führt zum Import Ihrer Tests und aller von ihnen importierten Module. Aufgrund des Caching-Mechanismus des Importsystems von Python spiegeln nachfolgende Aufrufe von pytest.main() aus demselben Prozess Änderungen an diesen Dateien zwischen den Aufrufen nicht wider. Aus diesem Grund wird die mehrfache Ausführung von pytest.main() aus demselben Prozess (um beispielsweise Tests erneut auszuführen) nicht empfohlen.