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?
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é.
Pytest prend en charge plusieurs manières d'exécuter et de sélectionner des tests à partir de la ligne de commande.
pytest test_mod.py
pytest testing/
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
.
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 ::
.
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
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 .
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
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'
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.
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
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:
subset_tests_directory
.ln -s tests_directory/foo.py
ln -s tests_directory/bar.py
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.
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.