Existe-t-il un moyen de sélectionner des pytest
tests à 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
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.mark
contre 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?
py.test path/to/test/file.py -k function_name_test
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_something
mais pasTestMyClass.test_method_simple
.Exécuter des tests par ID de nœud
Chaque test collecté se voit attribuer un unique
nodeid
qui 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.slow
décorateur.Pour plus d'informations, voir les marques .
Exécuter des tests à partir de packages
pytest --pyargs pkg.testing
Cela importera
pkg.testing
et 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
la source
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:
la source
Méthode 1 : tests sélectionnés au hasard. Long et laid.
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».
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.
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
Les deux seront exécutés s'ils sont corrects ou aucun.
Cas 4: Exécuter le test uniquement dans un dossier:
Cas 5: exécuter le test à partir d'un seul fichier.
Cas 6: Exécutez tous les tests à l'exception de la correspondance.
la source
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
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
: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
:Exécuter une seule fonction de test
Pour exécuter une seule fonction de test, ajoutez
::
et le nom de la fonction de test:-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: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:Exécuter un ensemble de tests en fonction du nom du test
L'
-k
option 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:
la source
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
c'est la même chose avec la commande ci-dessous (avec le contenu du fichier dans la question)
la source
Peut-être qu'en utilisant
pytest_collect_file()
hook, vous pouvez analyser le contenu d'un fichier.txt
o.yaml
où 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.
la source
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
unittest
scripts, ce qui ne garantit pas qu'il 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 se trouvent dans
test_directory
. J'ai dû en corriger plusieurs en exécutantpython foo.py
, de l'intérieursubset_tests_directory
et en les corrigeant au besoin.Une fois que les scripts de test s'exécutent correctement, juste
cd subset_tests_directory
etpytest
là. 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.py
alorspytest 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.la source