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 verwenden

    pytest -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.