Je n'arrive pas à obtenir framework de test de nez pour reconnaître les modules sous mon script de test dans la structure du fichier. J'ai mis en place l'exemple le plus simple qui illustre le problème. Je vais l'expliquer ci-dessous.
Voici la structure du fichier de package:
./__init__.py
./foo.py
./tests
./__init__.py
./test_foo.py
foo.py contient:
def dumb_true():
return True
tests/test_foo.py contient:
import foo
def test_foo():
assert foo.dumb_true()
Les deux fichiers init . Py sont vides
Si je lance nosetests -vv
dans le répertoire principal (où est foo.py), j'obtiens:
Failure: ImportError (No module named foo) ... ERROR
======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.Egg/nose/loader.py", line 379, in loadTestsFromName
addr.filename, addr.module)
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.Egg/nose/importer.py", line 39, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.Egg/nose/importer.py", line 86, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
import foo
ImportError: No module named foo
----------------------------------------------------------------------
Ran 1 test in 0.002s
FAILED (errors=1)
J'obtiens la même erreur lorsque je lance depuis l'intérieur du répertoire tests /. Selon la documentation et n exemple j'ai trouvé, nose est censé ajouter tous les paquets parents au chemin ainsi qu'au répertoire à partir duquel il est appelé, mais cela ne semble pas se produire dans mon Cas.
J'utilise Ubuntu 8.04 avec Python 2.6.2. J'ai construit et installé le nez manuellement (pas avec setup_tools) si cela importe.
Vous avez un __init__.py
dans votre répertoire de niveau supérieur. Cela en fait un package. Si vous le supprimez, votre nosetests
devrait fonctionner.
Si vous ne le supprimez pas, vous devrez remplacer votre import
par import dir.foo
, où dir
est le nom de votre répertoire.
Êtes-vous dans un virtualenv? Dans mon cas, nosetests
était celui de /usr/bin/nosetests
, qui utilisait /usr/bin/python
. Les packages dans virtualenv ne seront certainement pas dans le chemin du système. Les problèmes suivants ont résolu ce problème:
source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
Pour ceux d'entre vous qui trouveront cette question plus tard: j'obtiens l'erreur d'importation si je n'ai pas de fichier __init__.py
Dans mon répertoire de tests.
Ma structure de répertoires était la suivante:
./tests/
./test_some_random_stuff.py
Si je faisais des tests de nez:
nosetests -w tests
Cela donnerait le ImportError
que tout le monde voit. Si j'ajoute un fichier __init__.py
Vierge, cela fonctionne très bien:
./tests/
./__init__.py
./test_some_random_stuff.py
Un autre problème potentiel semble être les tirets/tirets dans l'arborescence des répertoires. J'ai récemment résolu un problème d'importation de nez en renommant un répertoire de sub-dir
à sub_dir
.
J'ai reçu ce message d'erreur car j'exécute la commande nosetests
à partir du mauvais répertoire.
C'est idiot, mais ça arrive.
Bien sûr, si vous avez une erreur de syntaxe dans le module importé, cela provoquera cela. Pour moi, le problème a refait surface quand j'ai eu une sauvegarde d'un fichier de tests avec un chemin comme module/tests.bak.py dans le même répertoire que tests.py. De plus, pour faire face au problème init package/module dans une application Django, vous pouvez exécuter ce qui suit (dans un shell bash/OSX) pour vous assurer de ne pas 'ai pas de fichiers init. pyc qui traînent:
find . -name '*.pyc' -delete
Je viens de rencontrer une autre chose qui pourrait provoquer ce problème: nommer les tests sous la forme testname.test.py
. Cet extra .
confond le nez et l'amène à importer des choses qu'il ne devrait pas. Je suppose qu'il peut être évident que l'utilisation de conventions de dénomination de test non conventionnelles cassera les choses, mais j'ai pensé que cela valait la peine d'être noté.
Par exemple, avec la structure de répertoires suivante, si vous souhaitez exécuter nosetests
dans m1
, m2
ou m3
pour tester certaines fonctions dans n.py
, Tu devrais utiliser from m2.m3 import n
dans test.py
.
m1
└── m2
├── __init__.py
└── m3
├── __init__.py
├── n.py
└── test
└── test.py
Juste pour compléter la question: si vous avez du mal avec une structure comme celle-ci:
project
├── m1
├ ├── __init__.py
├ ├── foo1.py
├ └──m2
├ ├── __init__.py
├ └── foo2.py
├
└── test
├── __init__.py
└── test.py
Et peut-être que vous souhaitez exécuter le test à partir d'un chemin en dehors du projet, incluez votre chemin de projet dans votre PYTHONPATH.
export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project
collez-le dans votre .profile. Si vous êtes sous un environnement virtuel, collez-le à l'intérieur de l'activer dans votre racine venv