Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Erreur avec py.test et Django

+1 vote

J'ai une erreur lorsque j'utilise conjointement py.test dans mon projet Django. J'ai suivi les tutoriels liés à pytest-django concernant la mise à disposition d'un fichier pytest.ini contenant le module de configuration de l'application, mais à l'exécution j'ai l'erreur suivante :

(nouvelleoffre) C:\Git\nouvelleoffre>py.test
============================= test session starts =============================
platform win32 -- Python 3.4.2 -- py-1.4.26 -- pytest-2.6.4
plugins: django, pythonpath
collected 0 items / 5 errors

=================================== ERRORS ====================================
_________ ERROR collecting nouvelleoffre/apps/core/tests/test_api.py __________
C:\VirtualEnvs\nouvelleoffre\lib\site-packages\py\_path\local.py:641: in pyimport
    __import__(modname)
E   ImportError: No module named 'nouvelleoffre.nouvelleoffre'
______ ERROR collecting nouvelleoffre/apps/core/tests/test_api_views.py _______
C:\VirtualEnvs\nouvelleoffre\lib\site-packages\py\_path\local.py:641: in pyimport
    __import__(modname)
E   ImportError: No module named 'nouvelleoffre.nouvelleoffre'
__________ ERROR collecting nouvelleoffre/apps/dsn/tests/test_api.py __________
C:\VirtualEnvs\nouvelleoffre\lib\site-packages\py\_path\local.py:641: in pyimport
    __import__(modname)
E   ImportError: No module named 'nouvelleoffre.nouvelleoffre'
________ ERROR collecting nouvelleoffre/apps/produit/tests/test_api.py ________
C:\VirtualEnvs\nouvelleoffre\lib\site-packages\py\_path\local.py:641: in pyimport
    __import__(modname)
E   ImportError: No module named 'nouvelleoffre.nouvelleoffre'
_____ ERROR collecting nouvelleoffre/apps/produit/tests/test_api_views.py _____
C:\VirtualEnvs\nouvelleoffre\lib\site-packages\py\_path\local.py:641: in pyimport
    __import__(modname)
E   ImportError: No module named 'nouvelleoffre.nouvelleoffre'
=========================== 5 error in 1.57 seconds ===========================

Et le fichier pytest.ini :

[pytest]
DJANGO_SETTINGS_MODULE=nouvelleoffre.settings
django_find_project=false

Je n'importe pas directement nouvelleoffre mais j'ai souvent des imports absolus (par exemple from nouvelleoffre.apps.produit.models import Produit), c'est gênant ?

demandé 5-Jan-2015 par debnet (1,014 points)
edité 5-Jan-2015 par debnet

Arborescence du projet

Poste ton fichier de config py.test please car j'ai vu que tu avais l'extension pythonpath installée. Et aussi le fichier de test qui déclenche cette erreur : ou importe tu nouvelleoffre ?

Il t'es possible de modifier ta question après l'avoir posé. Ce genre d'info par exemple, peut se rajouter dans ta question originale par exemple.

si tu mets pas django_find_project à false ca dit quoi ? parce que chez moi avec ça à false il pete de partout. Bon après je sais pas comment tu fais pour que py.test s'en sorte quand meme

Les imports absolus c'est très bien.

1 Réponse

+3 votes
 
Meilleure réponse

Ah mon avis, c'est juste une question de Python Path (au doigt mouillé).

La solution simple, c'est d'ajouter le chemin du dossier contenant ton projet dans ton fichier de config pytest :

[pytest]
DJANGO_SETTINGS_MODULE=nouvelleoffre.settings
django_find_project=false
python_paths = chemin/vers/dossier/qui/contient/manage.py

Ca doit marcher car j'ai vu que tu avais le plugin pytest-pythonpath installé. Retires aussi le fichier __init__.py qui est à côté de ton manage.py. Et lance py.test depuis le dossier qui contient le fichier manage.py. En cas d'erreur, renomme le dossier qui contient le fichier manage.py en nouvelle_offre (avec le underscore).

Je donne plein de trucs en vracs, je pense qu'une seule chose suffit, mais je n'ai pas une vision suffisament globale de ton projet pour bien délimiter le problème.

La solution la plus propre est de faire un fichier setup.py pour ton projet et de l'installer avec python setup.py develop

répondu 6-Jan-2015 par Sam (4,980 points)
edité 9-Jan-2015 par foxmask

Apparemment c'est le __init__.py à la racine du projet qui fout la merde. Je regarde plus en avant que tout fonctionne bien avant de valider !

...