Existe-t-il un moyen de spécifier les tests pytest à exécuter à partir d'un fichier?

190

Existe-t-il un moyen de sélectionner des pytesttests à exécuter à partir d'un fichier? Par exemple, un fichier foo.txtcontenant une liste de tests à exécuter:

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

Ou existe-t-il un moyen de sélectionner plusieurs tests, n'ayant pas de modèle commun dans le nom du test, à partir de différents répertoires avec pytest?

pytest -k <pattern> permet un seul motif.

Une option est d'avoir un pytest.markcontre chaque test, mais mon exigence est d'exécuter différentes combinaisons de tests à partir de différents fichiers.

Existe-t-il un moyen de spécifier plusieurs modèles et un nom de fichier de test pour chaque modèle?

Ou

Existe-t-il un moyen de spécifier les chemins de test exacts dans un fichier et d'alimenter ce fichier en entrée pytest?

Ou

Existe-t-il une fonction de crochet qui peut être utilisée à cette fin?

Sharad
la source

Réponses:

232

Vous pouvez utiliser l' -koption pour exécuter des cas de test avec différents modèles:

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

Cela exécutera des cas de test avec le nom test_001 et test_some_other_test désélectionnant le reste des cas de test.

Remarque: Ceci sélectionnera n'importe quel cas de test commençant par test_001 ou test_some_other_test . Par exemple, si vous avez le cas de test test_0012, il sera également sélectionné.

supamaze
la source
1
Merci. Mais s'il y a un test avec le même nom dans foo.py et bar.py (disons test_001), il finira par s'exécuter à partir des deux.
Sharad
2
oui, tout ce qui correspond au modèle sera exécuté comme je l'ai mentionné dans la note
supamaze
Mais c'est un problème pour moi. J'aimerais choisir quels tests exécuter à partir de quel fichier.
Sharad
@NamGVU `-k <nom de la méthode de test>`
supamaze
4
Ça devrait êtrepy.test path/to/test/file.py -k function_name_test
LittleZero
91

Spécification des tests / sélection des tests

Pytest prend en charge plusieurs méthodes pour exécuter et sélectionner des tests à partir de la ligne de commande.

Exécuter des tests dans un module

pytest test_mod.py

Exécuter des tests dans un répertoire

pytest testing/

Exécuter des tests par expressions de mots-clés

pytest -k "MyClass and not method"

Cela exécutera des tests qui contiennent des noms qui correspondent à l'expression de chaîne donnée, qui peuvent inclure des opérateurs Python qui utilisent des noms de fichiers, des noms de classes et des noms de fonctions comme variables. L'exemple ci-dessus fonctionnera TestMyClass.test_somethingmais pas TestMyClass.test_method_simple.

Exécuter des tests par ID de nœud

Chaque test collecté se voit attribuer un unique nodeidqui se compose du nom de fichier du module suivi de spécificateurs tels que les noms de classe, les noms de fonction et les paramètres de paramétrage, séparés par des ::caractères.

Pour exécuter un test spécifique dans un module:

pytest test_mod.py::test_func

Un autre exemple spécifiant une méthode de test dans la ligne de commande:

pytest test_mod.py::TestClass::test_method

Exécuter des tests par expressions de marqueur

pytest -m slow

Exécutera tous les tests décorés avec le @pytest.mark.slowdécorateur.

Pour plus d'informations, voir les marques .

Exécuter des tests à partir de packages

pytest --pyargs pkg.testing

Cela importera pkg.testinget utilisera l'emplacement de son système de fichiers pour rechercher et exécuter des tests à partir de.

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

Amritpal Singh
la source
le test_mod.py::TestClass::test_method a fonctionné le mieux pour moi
StephenGodderidge
1
devrait marquer cela comme accepté anser
Adam Hughes
13

Si vous avez le même nom de méthode dans deux classes différentes et que vous souhaitez simplement en exécuter une, cela fonctionne:

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

Méthode 1 : tests sélectionnés au hasard. Long et laid.

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

Méthode 2: utilisez des expressions de mots-clés.

Remarque: je recherche par nom de test. Il en va de même pour les noms TestClass.

Cas 1: ce qui suit fonctionnera selon ce qui est trouvé. Depuis que nous avons utilisé «OU».

python -m pytest -k 'test_password_valid or test_no_configuration'

Disons que les deux ci-dessus sont en fait corrects, 2 tests seront exécutés.

Cas 2: maintenant un nom incorrect et un autre nom correct.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

Un seul est trouvé et exécuté.

Cas 3 : Si vous voulez que tous les tests s'exécutent ou que personne ne s'exécute, utilisez AND

python -m pytest -k 'test_password_valid and test_no_configuration'

Les deux seront exécutés s'ils sont corrects ou aucun.

Cas 4: Exécuter le test uniquement dans un dossier:

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

Cas 5: exécuter le test à partir d'un seul fichier.

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

Cas 6: Exécutez tous les tests à l'exception de la correspondance.

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'
Arindam Roychowdhury
la source
3

Ma réponse fournit un moyen d'exécuter un sous-ensemble de tests dans différents scénarios.

Exécuter tous les tests d'un projet

pytest

Exécuter des tests dans un seul répertoire

Pour exécuter tous les tests à partir d'un répertoire, utilisez le répertoire comme paramètre pour pytest:

pytest tests/my-directory

Exécuter des tests dans un seul fichier / module de test

Pour exécuter un fichier plein de tests, répertoriez le fichier avec le chemin relatif en tant que paramètre pour pytest:

pytest tests/my-directory/test_demo.py

Exécuter une seule fonction de test

Pour exécuter une seule fonction de test, ajoutez ::et le nom de la fonction de test:

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

-v est utilisé pour que vous puissiez voir quelle fonction a été exécutée.

Exécuter une seule classe de test

Pour exécuter juste une classe, faites comme nous l'avons fait avec les fonctions et ajoutez ::, puis le nom de la classe au paramètre de fichier:

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

Exécuter une méthode de test unique d'une classe de test

Si vous ne souhaitez pas exécuter toute une classe de test, une seule méthode, ajoutez simplement une autre ::et le nom de la méthode:

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

Exécuter un ensemble de tests en fonction du nom du test

L' -koption vous permet de transmettre une expression pour exécuter des tests dont certains noms sont spécifiés par l'expression en tant que sous-chaîne du nom du test. Il est possible d'utiliser et , ou , et non de créer des expressions complexes.

Par exemple, pour exécuter toutes les fonctions qui ont _raises dans leur nom:

pytest -v -k _raises
lmiguelvargasf
la source
1

Selon la documentation sur Exécuter des tests par ID de nœud

puisque vous avez tous les identifiants de nœud dans foo.txt, exécutez simplement

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

c'est la même chose avec la commande ci-dessous (avec le contenu du fichier dans la question)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test
接口 夏季
la source
0

Peut-être qu'en utilisant pytest_collect_file()hook, vous pouvez analyser le contenu d'un fichier .txto .yamloù les tests sont spécifiés comme vous le souhaitez, et les renvoyer au noyau pytest.

Un bel exemple est montré dans la documentation de pytest . Je pense ce que vous cherchez.

Asterio Gonzalez
la source
0

Voici une réponse partielle possible, car elle ne permet de sélectionner que les scripts de test, pas les tests individuels dans ces scripts.

Et il est également limité par mon utilisation du mode de compatibilité hérité par rapport aux unittestscripts, ce qui ne garantit pas qu'il fonctionnerait avec pytest natif.

Voici:

  1. créer un nouveau dictoire, disons subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. faites attention aux importations qui supposent implicitement que les fichiers se trouvent dans test_directory. J'ai dû en corriger plusieurs en exécutant python foo.py, de l'intérieur subset_tests_directoryet en les corrigeant au besoin.

  5. Une fois que les scripts de test s'exécutent correctement, juste cd subset_tests_directoryet pytestlà. Pytest ne récupérera que les scripts qu'il voit.

Une autre possibilité est un lien symbolique dans le répertoire de test en cours, par exemple comme ln -s foo.py subset_foo.pyalors pytest subset*.py. Cela éviterait d'avoir à ajuster vos importations, mais cela encombrerait les choses jusqu'à ce que vous supprimiez les liens symboliques. A travaillé pour moi aussi.

JL Peyret
la source