web-dev-qa-db-fra.com

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

Existe-t-il un moyen de sélectionner les tests pytest à exécuter à partir d'un fichier? Par exemple, un fichier foo.txt contenant une liste de tests à exécuter:

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

Ouest-il possible 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?

py.test -k <pattern> permet un seul motif.

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

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 de pytest? Existe-t-il une fonction de hook qui peut être utilisée à cette fin?

81
Sharad

Vous pouvez utiliser -k option pour exécuter des scénarios 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 scénarios de test portant les noms test_001 et test_some_other_test en désélectionnant le reste des scénarios de test.

Remarque: Ceci sélectionnera tout scénario de test commençant par test_001 ou test_some_other_test. Par exemple, si vous avez le scénario de test test_0012, il sera également sélectionné.

118
supamaze

Spécifier des tests/sélectionner des tests

Pytest prend en charge plusieurs manières d'exécuter et de 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 contenant des noms correspondant à l'expression de chaîne donnée, pouvant inclure des opérateurs Python utilisant des noms de fichier, des noms de classe et des noms de fonction en tant que variables. L'exemple ci-dessus exécute TestMyClass.test_something mais pas TestMyClass.test_method_simple.

Exécuter les tests par identifiant de noeud

Chaque variable collectée se voit attribuer une variable nodeid unique, composée 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étrisation, 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 avec des expressions de marqueur

pytest -m slow

Tous les tests exécutés avec le décorateur @pytest.mark.slow seront exécutés.

Pour plus d'informations, voir marques .

Exécuter des tests à partir de packages

pytest --pyargs pkg.testing

Ceci importera pkg.testing et utilisera son emplacement de système de fichiers pour rechercher et exécuter des tests.

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

2
Amritpal Singh

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

pytest tests.py -k 'TestClassName and test_method_name'
2
Peter

Peut-être qu’à l’aide du crochet pytest_collect_file(), vous pourrez analyser le contenu d’un fichier .txt o .yaml dans lequel les tests sont spécifiés comme vous le souhaitez et les renvoyer au noyau pytest.

Un exemple intéressant est présenté dans la documentation pytest . Je pense ce que tu cherches.

0
asterio gonzalez

Selon la doc sur Exécuter les tests par identifiant de noeud

puisque vous avez tous les identifiants de nœud dans foo.txt, lancez 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
0
接口夏季

Voici une réponse partielle possible, car elle permet uniquement de sélectionner les scripts de test, et non des tests individuels au sein de ces scripts.

Et cela est également limité par l’utilisation du mode de compatibilité hérité avec les scripts unittest, ce qui ne garantit pas que cela fonctionnerait avec pytest natif.

Voici:

  1. créez un nouveau dictée, par exemple 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 sont en test_directory. Je devais en réparer plusieurs en exécutant python foo.py, à partir de subset_tests_directory et en le corrigeant au besoin.

  5. Une fois que les scripts de test sont correctement exécutés, il suffit de placer cd subset_tests_directory et pytest. Pytest ne prendra que les scripts qu’il voit.

Une autre possibilité est de créer des liens symboliques dans votre répertoire de test actuel, sous la forme ln -s foo.py subset_foo.py puis pytest subset*.py. Cela éviterait de devoir ajuster vos importations, mais cela encombrerait les choses jusqu'à ce que vous supprimiez les liens symboliques. Travaillé pour moi aussi.

0
JL Peyret