web-dev-qa-db-fra.com

Py.test Aucun module nommé *

J'ai une structure de dossier comme celle-ci

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py

Dans mon test_app.py file, j'ai une ligne pour importer mon module d'application. Lorsque j'exécute py.test sur le dossier racine, j'obtiens cette erreur concernant aucun module nommé app. Comment dois-je configurer cela?

21
zsljulius

Donc, vous exécutez py.test à partir de /App. Etes-vous sûr que /App/App est dans votre $PYTHONPATH?

Si ce n'est pas le cas, le code qui tente de import app échouera avec un tel message.

EDIT0: y compris les informations de mon commentaire ci-dessous, par souci d'exhaustivité.

Une tentative d'importation d'application ne réussira que si elle a été exécutée dans /App/App, ce qui n'est pas le cas ici. Vous voudrez probablement faire de /App/App un paquet en y mettant __init__.py et modifier votre importation pour que l'application soit qualifiée en tant que from App import app.

EDIT1: par demande, en ajoutant des explications supplémentaires de mon deuxième commentaire ci-dessous.

En plaçant __init__.py dans /App/App, ce répertoire devient un paquet. Ce qui signifie que vous pouvez en importer, à condition que celui-ci - le répertoire - soit visible dans le $PYTHONPATH. C'est à dire. vous pouvez faire à partir de App import app si /App est dans le $PYTHONPATH. Votre répertoire de travail actuel est automatiquement ajouté à $PYTHONPATH. Ainsi, lorsque vous exécutez un script à partir de /App, l'importation fonctionne.

11
Dun Peal

En travaillant avec Python 3 et en obtenant la même erreur sur une structure de projet similaire, je l'ai résolue en ajoutant un fichier __init__ à mon module tests.

$ touch tests/__init__.py

Je ne suis pas très bon pour empaqueter et importer, mais je pense que cela aide pytest à déterminer où se trouve le module App cible.

27
jamesc

J'avais déjà un fichier __init__.py dans le répertoire /App/App et je voulais exécuter des tests à partir de la racine du projet sans magie de modification de chemin:

 python -m pytest tests

La sortie ressemble immédiatement à ceci:

➟  python -m pytest tests
====================================== test session starts ======================================
platform linux -- Python 3.5.1, pytest-2.9.0, py-1.4.31, pluggy-0.3.1
rootdir: /home/andrew/code/app, inifile: 
plugins: teamcity-messages-1.17
collected 46 items 

... lines omitted ...

============================= 44 passed, 2 skipped in 1.61 seconds ==============================
27
berezovskyi

J'ai également eu la même erreur lors de l'exécution des cas de test pour mon application situés comme suit

myproject
  --app1
    --__init.py__
    --test.py
  --app2
    --__init.py__
    --test.py
  --__init.py__

J'ai supprimé mon fichier myproject _INIT.PY_et mon boom, des scénarios de test sont en cours d'exécution.

1
Jay