J'ai utilisé easy_install pour installer pytest sur un mac et j'ai commencé à écrire des tests pour un projet avec une structure de fichiers comme ceci:
repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py
exécuter py.test
dans le répertoire repo, tout se comporte comme vous vous en doutez
mais quand j'essaye la même chose sur Linux ou Windows (les deux ont pytest 2.2.3 sur eux), il aboie chaque fois qu'il frappe sa première importation de quelque chose de mon chemin d'application. Dites par exemplefrom app import some_def_in_app
Dois-je modifier mon CHEMIN pour exécuter py.test sur ces systèmes? Quelqu'un at-il vécu cela?
python
unit-testing
pytest
MattoTodd
la source
la source
Réponses:
Oui, le dossier source n'est pas dans le chemin de Python si vous accédez
cd
au répertoire tests.Vous avez 2 choix:
Ajoutez le chemin manuellement aux fichiers de test, quelque chose comme ceci:
Exécutez les tests avec la var env
PYTHONPATH=../
.la source
cd
dans un répertoire? je courspy.test
depuis ma racine. sauf si je me trompe et que vous voulez dire que pytest marche dans mes dossierscd
problème, ne le toucherais-je pas également sur mac?Je ne sais pas pourquoi py.test n'ajoute pas le répertoire courant dans le PYTHONPATH lui-même, mais voici une solution de contournement (à exécuter à partir de la racine de votre référentiel):
Cela fonctionne parce que Python ajoute le répertoire actuel dans le PYTHONPATH pour vous.
la source
project/test/all-my-tests
etproject/src/app.py
et à cause de ce changement, il faut appelerapp.py
indirectement en utilisant un__main__.py
fichier dansproject/src
, afin que l'on puisse utiliser l'appelpython -m src
. Des choses assez désordonnées pour autant que je sache./home/user/dev/projectxyz/src ...
seraient vraiment mauvaises et ne fonctionneraient pas sur d'autres machines dans la plupart des cas. Je pense que ce que je voulais dire, c'est que je dois toujours écrire la racine du projet dans son intégralité, même si un module se trouve dans le même dossier que le fichier exécuté. Je ne savais pas que c'était considéré comme la meilleure pratique, c'est donc une information utile, merci. Je suis d'accord avec la plupart des pep8, même si ce n'est toujours pas parfait.__init__.py
tests qui ont résolu le problème. Maintenant, je peux utiliserpytest
conftest
SolutionLa solution la moins invasive consiste à ajouter un fichier vide nommé
conftest.py
dans lerepo/
répertoire:C'est tout. Pas besoin d'écrire du code personnalisé pour manipuler le
sys.path
ou n'oubliez pas de le faire glisserPYTHONPATH
, ou de le placer__init__.py
dans des répertoires où il n'appartient pas.Le répertoire du projet ensuite:
Explication
pytest
recherche lesconftest
modules sur la collection de tests pour rassembler des crochets et des fixtures personnalisés, et afin d'en importer les objets personnalisés,pytest
ajoute le répertoire parent deconftest.py
àsys.path
(dans ce cas, lerepo
répertoire).Autres structures de projet
Si vous avez une autre structure de projet, placez le
conftest.py
dans le répertoire racine du package (celui qui contient les packages mais n'est pas un package lui-même, donc ne contient pas de__init__.py
), par exemple:src
dispositionBien que cette approche puisse être utilisée avec la
src
mise en page (placeconftest.py
dans lesrc
répertoire):méfiez-vous que l'ajout
src
pourPYTHONPATH
atténuer le sens et les avantages de lasrc
mise en page! Vous finirez par tester le code du référentiel et non le package installé. Si vous devez le faire, vous n'avez peut-être pas du tout besoin dusrc
répertoire.Où aller en partant d'ici
Bien sûr, les
conftest
modules ne sont pas seulement des fichiers pour faciliter la découverte du code source; c'est là que toutes les améliorations spécifiques au projet dupytest
cadre et la personnalisation de votre suite de tests se produisent.pytest
a beaucoup d'informations sur lesconftest
modules dispersés dans leurs documents ; commencer parconftest.py
: plugins locaux par répertoireAussi, SO a une excellente question sur les
conftest
modules: dans py.test, à quoi sert les fichiers conftest.py?la source
pytest
et il est fortement déconseillé de le faire. En faisant cela, vous plantez des graines pour de futures erreurs. Créez un autre module nomméutils.py
et placez-y le code à réutiliser dans les tests.conftest.py
n'appartient pas au code d'application et, imo, le placer soussrc/
n'est pas correct.J'ai eu le même problème. Je l'ai corrigé en ajoutant un
__init__.py
fichier vide à montests
répertoire.la source
avoid “__init__.py” files in your test directories. This way your tests can run easily against an installed version of mypkg, independently from the installed package if it contains the tests or not.
SRC: pytest.org/latest/goodpractises.html__init__.py
j'ai trouvé que la suppression de mon répertoire de tests l'avait résolu pour moi.__init__.py
sous-répertoire danstest/
rend le travail d'importation absolu pour l'exécution de tests spécifiques dans ce sous-répertoire par rapport aux modules à installer. Merci.S'exécute
pytest
en tant que module avec:python -m pytest tests
la source
python -m pytest
sans autre explication que "parce que ça marche"package/src package/tests
et quetests
vous importez depuissrc
. L'exécution en tant que module considérera les importations comme absolues par rapport à l'emplacement d'exécution.Vous pouvez exécuter avec PYTHONPATH à la racine du projet
Ou utilisez l'installation de pip comme importation modifiable
la source
test
répertoire qui n'est pas dans lasrc
structure du répertoire et qui appelle depuis le répertoire contenant à la fois le répertoiretest
etsrc
.J'ai créé cela comme une réponse à votre question et à ma propre confusion. J'espère que ça aide. Faites attention à PYTHONPATH dans la ligne de commande py.test et dans le tox.ini.
https://github.com/jeffmacdonald/pytest_test
Plus précisément: vous devez indiquer à py.test et tox où trouver les modules que vous incluez.
Avec py.test, vous pouvez le faire:
Et avec tox, ajoutez ceci à votre tox.ini:
la source
J'ai eu le même problème à Flask.
Quand j'ai ajouté:
dans le dossier des tests, le problème a disparu :)
L'application n'a probablement pas reconnu les tests de dossier comme module
la source
Je l'ai corrigé en supprimant le niveau supérieur
__init__.py
dans le dossier parent de mes sources.la source
J'ai commencé à obtenir des
ConftestImportFailure: ImportError('No module named ...
erreurs étranges lorsque j'ai accidentellement ajouté un__init__.py
fichier à mon répertoire src (qui n'était pas censé être un package Python, juste un conteneur de toutes les sources).la source
J'obtenais cette erreur en raison de quelque chose d'encore plus simple (on pourrait même dire trivial). Je n'avais pas installé le
pytest
module. Un simpleapt install python-pytest
problème m'a donc été résolu.'pytest' aurait été répertorié dans setup.py comme dépendance de test. Assurez-vous d'installer également les exigences de test.
la source
J'ai eu un problème similaire.
pytest
n'a pas reconnu un module installé dans l'environnement dans lequel je travaillais.Je l'ai résolu en installant également
pytest
dans le même environnement.la source
Pour moi, le problème a été
tests.py
généré par Django avec letests
répertoire. La suppression atests.py
résolu le problème.la source
J'ai eu cette erreur car j'ai mal utilisé les importations relatives. Dans l'exemple OP, test_app.py devrait importer des fonctions en utilisant par exemple
Cependant, les fichiers __init__.py sont généreusement dispersés dans la structure de fichiers, cela ne fonctionne pas et crée le type d'ImportError vu à moins que les fichiers et les fichiers de test ne se trouvent dans le même répertoire.
Voici un exemple de ce que j'avais à faire avec l'un de mes projets:
Voici ma structure de projet:
Pour pouvoir accéder à activity_indicator.py à partir de test_activity_indicator.py, je devais:
la source
Très souvent, les tests ont été interrompus en raison de l'impossibilité d'importer le module.Après la recherche, j'ai découvert que le système examine le fichier au mauvais endroit et nous pouvons facilement surmonter le problème en copiant le fichier contenant le module dans le même dossier que celui indiqué, afin d'être correctement importé. Une autre proposition de solution serait de changer la déclaration d'importation et de montrer à MutPy le chemin correct de l'unité. Cependant, étant donné que plusieurs unités peuvent avoir cette dépendance, ce qui signifie que nous devons également valider les modifications dans leurs déclarations, nous préférons simplement déplacer l'unité dans le dossier.
la source
Selon un article sur Dirk Avery sur Medium (et soutenu par mon expérience personnelle), si vous utilisez un environnement virtuel pour votre projet, vous ne pouvez pas utiliser une installation de pytest à l'échelle du système; vous devez l'installer dans l'environnement virtuel et utiliser cette installation.
En particulier, si vous l'avez installé aux deux endroits, l'exécution de la
pytest
commande ne fonctionnera pas, car elle utilisera l'installation du système. Comme les autres réponses l'ont décrit, une solution simple consiste à exécuter à lapython -m pytest
place depytest
; cela fonctionne car il utilise la version de l'environnement de pytest. Alternativement, vous pouvez simplement désinstaller la version système de pytest; après avoir réactivé l'environnement virtuel, lapytest
commande devrait fonctionner.la source
python -m pytest tests/
.Je faisais le même problème en suivant le tutoriel Flask et j'ai trouvé la réponse sur les Pytest officielles docs Il est un peu passer de la façon dont je (et je pense que beaucoup d' autres) sont utilisées pour faire des choses.
Vous devez créer un
setup.py
fichier dans le répertoire racine de votre projet avec au moins les deux lignes suivantes:où PACKAGENAME est le nom de votre application. Ensuite, vous devez l'installer avec pip:
L'
-e
indicateur indique à pip d'intaller le paquetage en mode modifiable ou "développement". Donc, la prochaine fois que vous l'exécutez,pytest
votre application devrait trouver la normePYTHONPATH
.la source
Ma solution:
créez le
conftest.py
fichier dans letest
répertoire contenant:Cela ajoutera le dossier d'intérêt au chemin python sans modifier chaque fichier de test , définir la variable env ou jouer avec les chemins absolus / relatifs.
la source