325 votes

Problème de PATH avec pytest 'ImportError : Pas de module nommé YadaYadaYada'.

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 celle-ci :

repo/
   |--app.py
   |--settings.py
   |--models.py
   |--tests/
          |--test_app.py

exécuter py.test alors que dans le répertoire repo, tout se comporte comme on peut s'y attendre

mais quand j'essaie la même chose sous linux ou Windows (les deux ont pytest 2.2.3 sur eux), il aboie dès qu'il rencontre sa première importation de quelque chose de mon chemin d'application. Disons par exemple from app import some_def_in_app

Dois-je modifier mon PATH pour exécuter py.test sur ces systèmes ? Quelqu'un a-t-il déjà rencontré ce problème ?

2voto

Oppy Points 855

J'ai obtenu cette erreur car j'ai utilisé des importations relatives de manière incorrecte. Dans l'exemple du PO, test_app.py devrait importer des fonctions en utilisant par exemple

from repo.app import *

Même si les fichiers __init__.py sont disséminés dans la structure des fichiers, cela n'a pas d'incidence sur le fonctionnement du système. no fonctionne et crée le type d'ImportError vu à moins que les fichiers et les fichiers de test ne soient dans le même répertoire.

from app import *

Voici un exemple de ce que j'ai dû faire pour l'un de mes projets :

Voici la structure de mon projet :

microbit/
microbit/activity_indicator/activity_indicator.py
microbit/tests/test_activity_indicator.py

Pour pouvoir accéder à activity_indicator.py depuis test_activity_indicator.py, j'avais besoin de :

  • démarrer test_activity_indicatory.py avec l'import relatif correct :

    from microbit.activity_indicator.activity_indicator import *
  • placer les fichiers __init__.py dans toute la structure du projet :

    microbit/
    microbit/__init__.py
    microbit/activity_indicator/__init__.py
    microbit/activity_indicator/activity_indicator.py
    microbit/tests/__init__.py
    microbit/tests/test_activity_indicator.py

1voto

craq Points 98

J'obtenais cette erreur à cause de quelque chose d'encore plus simple (on pourrait même dire trivial). Je n'avais pas installé le pytest module. Ainsi, un simple apt install python-pytest l'a réparé pour moi.

pytest aurait été listé dans le fichier setup.py comme une dépendance de test. Assurez-vous que vous installez également les exigences de test.

1voto

thoroc Points 21

Puisque personne ne l'a suggéré, vous pourriez aussi passer le chemin vers les tests dans votre fichier d'aide. pytest.ini fichier :

[pytest]
...
testpaths = repo/tests

voir la documentation : https://docs.pytest.org/en/6.2.x/customize.html#pytest-ini

Effet secondaire pour VScode : le test unitaire devrait apparaître dans l'interface utilisateur.

0voto

Einhaender Points 69

Según un post sur Medium par Dirk Avery (et confirmé 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é dans les deux endroits, il suffit d'exécuter la commande pytest 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 la commande python -m pytest au lieu de pytest Cela fonctionne car il utilise la version de pytest de l'environnement. Alternativement, vous pouvez simplement désinstaller la version de pytest du système ; après avoir réactivé l'environnement virtuel, la fonction pytest devrait fonctionner.

0voto

Comme l'a souligné Luiz Lezcano Arialdi la solution correcte est d'installer votre paquet comme un paquet modifiable.

Comme j'utilise pipenv, j'ai pensé ajouter à sa réponse un pas à pas pour installer le chemin actuel comme un comestible avec pipenv, permettant de lancer pytest sans avoir besoin de manipuler du code ou des fichiers lâches.

Vous devrez disposer de la structure minimale de dossiers suivante ( documentation ) :

package/
    package/
        __init__.py
        module.py
    tests/
        module_test.py
    setup.py

Le fichier setup.py doit contenir le code minimum suivant ( documentation ) :

import setuptools

setuptools.setup(name='package', # Change to your package name
                 packages=setuptools.find_packages())

Ensuite, il suffit d'exécuter pipenv install --dev -e . et pipenv installera le chemin actuel en tant que paquet modifiable (le drapeau --dev est optionnel) ( documentation ).

Maintenant, vous devriez être en mesure d'exécuter pytest sans problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X