Gibt es eine Möglichkeit anzugeben, welche Pytest-Tests aus einer Datei ausgeführt werden sollen?

189

Gibt es eine Möglichkeit, pytestTests auszuwählen , die aus einer Datei ausgeführt werden sollen? Beispiel: Eine Datei foo.txtmit einer Liste der auszuführenden Tests:

tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test

Oder gibt es eine Möglichkeit, mehrere Tests ohne gemeinsames Muster im Testnamen aus verschiedenen Verzeichnissen mit pytest auszuwählen?

pytest -k <pattern> ermöglicht ein einzelnes Muster.

Eine Möglichkeit besteht darin, einen pytest.markTest gegen jeden Test durchzuführen, aber meine Anforderung besteht darin, verschiedene Testkombinationen aus verschiedenen Dateien auszuführen.

Gibt es eine Möglichkeit, mehrere Muster und einen Testdateinamen für jedes Muster anzugeben?

Oder

Gibt es eine Möglichkeit, die genauen Testpfade in einer Datei anzugeben und diese Datei als Eingabe zu füttern pytest?

Oder

Gibt es eine Hook-Funktion, die für diesen Zweck verwendet werden kann?

Scharade
quelle

Antworten:

230

Mit der -kOption können Sie Testfälle mit verschiedenen Mustern ausführen:

py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'

Dadurch werden Testfälle mit den Namen test_001 und test_some_other_test ausgeführt, wobei die Auswahl der restlichen Testfälle aufgehoben wird.

Hinweis: Hiermit wird jeder Testfall ausgewählt, der mit test_001 oder test_some_other_test beginnt . Wenn Sie beispielsweise den Testfall test_0012 haben, wird dieser ebenfalls ausgewählt.

supamaze
quelle
1
Vielen Dank. Wenn es jedoch einen Test mit demselben Namen in foo.py und bar.py gibt (z. B. test_001), wird er von beiden ausgeführt.
Sharad
2
Ja, alles, was mit dem Muster übereinstimmt, wird ausgeführt, wie ich in der Notiz erwähnt habe
supamaze
Aber das ist ein Problem für mich. Ich möchte auswählen, welche Tests aus welcher Datei ausgeführt werden sollen.
Sharad
@NamGVU `-k <Name der Testmethode>`
supamaze
4
Es sollte seinpy.test path/to/test/file.py -k function_name_test
LittleZero
91

Tests festlegen / Tests auswählen

Pytest unterstützt verschiedene Möglichkeiten zum Ausführen und Auswählen von Tests über die Befehlszeile.

Führen Sie Tests in einem Modul aus

pytest test_mod.py

Führen Sie Tests in einem Verzeichnis aus

pytest testing/

Führen Sie Tests mit Schlüsselwortausdrücken aus

pytest -k "MyClass and not method"

Dadurch werden Tests ausgeführt, die Namen enthalten, die mit dem angegebenen Zeichenfolgenausdruck übereinstimmen. Dazu können Python-Operatoren gehören, die Dateinamen, Klassennamen und Funktionsnamen als Variablen verwenden. Das obige Beispiel wird ausgeführt, TestMyClass.test_somethingaber nicht TestMyClass.test_method_simple.

Führen Sie Tests nach Knoten-IDs aus

Jedem gesammelten Test wird eine eindeutige Zuordnung zugewiesen, nodeiddie aus dem Moduldateinamen gefolgt von Bezeichnern wie Klassennamen, Funktionsnamen und Parametern aus der Parametrisierung besteht, die durch ::Zeichen getrennt sind .

So führen Sie einen bestimmten Test innerhalb eines Moduls aus:

pytest test_mod.py::test_func

Ein weiteres Beispiel für die Angabe einer Testmethode in der Befehlszeile:

pytest test_mod.py::TestClass::test_method

Führen Sie Tests mit Markerausdrücken aus

pytest -m slow

Führt alle Tests durch, die mit dem @pytest.mark.slowDekorateur dekoriert sind .

Weitere Informationen finden Sie unter Markierungen .

Führen Sie Tests aus Paketen aus

pytest --pyargs pkg.testing

Dadurch wird der pkg.testingSpeicherort des Dateisystems importiert und verwendet, um Tests zu suchen und auszuführen.

Quelle: https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests

Amritpal Singh
quelle
Die test_mod.py::TestClass::test_method hat am besten für mich funktioniert
StephenGodderidge
1
sollte dies als akzeptiert anser markieren
Adam Hughes
13

Wenn Sie denselben Methodennamen in zwei verschiedenen Klassen haben und nur eine davon ausführen möchten, funktioniert dies:

pytest tests.py -k 'TestClassName and test_method_name'
Peter
quelle
6

Methode 1 : Zufällig ausgewählte Tests. Lang und hässlich.

python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config

Methode 2: Verwenden Sie Schlüsselwortausdrücke.

Hinweis: Ich suche nach Testfallnamen. Gleiches gilt für TestClass-Namen.

Fall 1: Das Folgende wird ausgeführt, je nachdem, was gefunden wird. Da haben wir 'OR' verwendet.

python -m pytest -k 'test_password_valid or test_no_configuration'

Nehmen wir an, die beiden oben genannten sind tatsächlich korrekt. Es werden 2 Tests ausgeführt.

Fall 2: Jetzt ein falscher Name und ein anderer korrekter Name.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

Es wird nur einer gefunden und ausgeführt.

Fall 3 : Wenn alle Tests ausgeführt werden sollen oder niemand, verwenden Sie AND

python -m pytest -k 'test_password_valid and test_no_configuration'

Beide werden ausgeführt, wenn sie korrekt sind oder keine.

Fall 4: Führen Sie den Test nur in einem Ordner aus:

python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'

Fall 5: Führen Sie den Test nur aus einer Datei aus.

python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'

Fall 6: Führen Sie alle Tests außer dem Match aus.

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'
Arindam Roychowdhury
quelle
1

Laut dem Dokument über Tests nach Knoten-IDs ausführen

Da Sie alle Knoten-IDs in foo.txt haben, führen Sie sie einfach aus

pytest `cat foo.txt | tr '\n' ' '`

Dies gilt auch für den folgenden Befehl (mit dem Dateiinhalt in der Frage).

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test
接口 夏季
quelle
1

Meine Antwort bietet eine Möglichkeit, eine Teilmenge von Tests in verschiedenen Szenarien auszuführen.

Führen Sie alle Tests in einem Projekt aus

pytest

Führen Sie Tests in einem einzelnen Verzeichnis aus

Verwenden Sie das Verzeichnis als Parameter, um alle Tests in einem Verzeichnis auszuführen pytest:

pytest tests/my-directory

Führen Sie Tests in einer einzelnen Testdatei / einem Modul aus

Um eine Datei voller Tests auszuführen, listen Sie die Datei mit dem relativen Pfad als Parameter auf pytest:

pytest tests/my-directory/test_demo.py

Führen Sie eine einzelne Testfunktion aus

Um eine einzelne Testfunktion auszuführen, fügen Sie ::den Namen der Testfunktion hinzu:

pytest -v tests/my-directory/test_demo.py::test_specific_function

-v wird verwendet, damit Sie sehen können, welche Funktion ausgeführt wurde.

Führen Sie eine einzelne Testklasse aus

Um nur eine Klasse auszuführen, gehen Sie wie bei Funktionen vor und fügen Sie ::dann den Klassennamen zum Dateiparameter hinzu:

pytest -v tests/my-directory/test_demo.py::TestClassName

Führen Sie eine einzelne Testmethode einer Testklasse aus

Wenn Sie nicht alle Testklassen ausführen möchten, sondern nur eine Methode, fügen Sie einfach eine andere ::und den Methodennamen hinzu:

pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method

Führen Sie eine Reihe von Tests basierend auf dem Testnamen aus

Mit dieser -kOption können Sie einen Ausdruck übergeben, um Tests auszuführen, bei denen bestimmte Namen durch den Ausdruck als Teilzeichenfolge des Testnamens angegeben werden. Es ist möglich , zu verwenden und , oder , und nicht komplexen Ausdrücke zu erstellen.

So führen Sie beispielsweise alle Funktionen aus, deren Name _raises enthält:

pytest -v -k _raises
lmiguelvargasf
quelle
0

Vielleicht können Sie mit pytest_collect_file()hook den Inhalt einer .txto- .yamlDatei analysieren, in der die Tests wie gewünscht angegeben sind, und sie an den pytest-Kern zurückgeben.

Ein schönes Beispiel finden Sie in der Pytest-Dokumentation . Ich denke, wonach du suchst.

asterio gonzalez
quelle
0

Hier ist eine mögliche Teilantwort, da nur die Testskripte ausgewählt werden können, nicht einzelne Tests in diesen Skripten.

Und es ist auch dadurch eingeschränkt, dass ich den Legacy-Kompatibilitätsmodus im unittestVergleich zu Skripten verwende, sodass ich nicht garantieren kann, dass es mit nativem Pytest funktioniert.

Hier geht:

  1. Erstellen Sie beispielsweise ein neues Diktat subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. Seien Sie vorsichtig bei Importen, bei denen implizit davon ausgegangen wird, dass sich Dateien in befinden test_directory. Ich musste einige davon reparieren, indem ich python foo.pyvon innen rannte subset_tests_directoryund nach Bedarf korrigierte.

  5. Sobald die Testskripte ausführen korrekt, einfach cd subset_tests_directoryund pytestdort. Pytest nimmt nur die Skripte auf, die es sieht.

Eine andere Möglichkeit ist die Verknüpfung in Ihrem aktuellen Testverzeichnis, beispielsweise wie ln -s foo.py subset_foo.pydamals pytest subset*.py. Das würde vermeiden, dass Sie Ihre Importe anpassen müssen, aber es würde die Dinge durcheinander bringen, bis Sie die Symlinks entfernt haben. Hat auch für mich gearbeitet.

JL Peyret
quelle