Je n'arrive pas à faire en sorte que le framework de test du nez reconnaisse les modules sous mon script de test dans la structure de fichiers. 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 du 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 cours nosetests -vv
dans le répertoire principal (où se trouve 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 cours depuis le répertoire tests /. D'après la documentation et un exemple que j'ai trouvé, nose est censé ajouter tous les packages parents au chemin ainsi que le 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 compte.
la source
Êtes-vous dans une virtualenv? Dans mon cas,
nosetests
c'était celui/usr/bin/nosetests
qui utilisait/usr/bin/python
. Les packages de virtualenv ne seront certainement pas dans le chemin du système. Ce qui suit a corrigé ce problème:la source
nosetests
été mis en cache parbash
le système one in/usr/local/bin
(tout enwhich nosetests
donnant le résultat approprié). Je cela pour l' effacer.À ceux d'entre vous qui trouveront cette question plus tard: j'obtiens l'erreur d'importation si je n'ai pas de
__init__.py
fichier dans mon répertoire de tests.Ma structure de répertoires était comme ceci:
Si j'ai effectué nos tests:
Cela donnerait ce
ImportError
que tout le monde voit. Si j'ajoute un__init__.py
fichier vierge , cela fonctionne très bien:la source
Un autre problème potentiel semble être les traits d'union / tirets dans l'arborescence des répertoires. J'ai récemment corrigé un problème d'ImportError de nez en renommant un répertoire de
sub-dir
àsub_dir
.la source
Bien sûr, si vous avez une erreur de syntaxe dans le module importé, cela en sera la cause. Pour moi, le problème a surgi lorsque 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 résoudre le problème du package / module init dans une application Django, vous pouvez exécuter ce qui suit (dans un shell bash / OSX) pour vous assurer que vous n'avez pas de fichiers init .pyc qui traînent:
la source
J'ai reçu ce message d'erreur car j'exécute la
nosetests
commande à partir du mauvais répertoire.C'est idiot, mais ça arrive.
la source
nosetests
dans un répertoire sans test du tout entraîneraRan 0 tests
une erreur d'importation. Dans sa forme actuelle, cette réponse n'est pas utile.Je viens de rencontrer une dernière chose qui pourrait causer ce problème: la dénomination des tests dans le formulaire
testname.test.py
. Ce supplément.
confond le nez et le conduit à 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 brisera les choses, mais j'ai pensé que cela mériterait d'être noté.la source
Par exemple, avec la structure de répertoire suivant, si vous voulez exécuter
nosetests
dansm1
,m2
oum3
pour tester certaines fonctionsn.py
, vous devez utiliserfrom m2.m3 import n
danstest.py
.la source
Juste pour compléter la question: si vous avez du mal avec une structure comme celle-ci:
Et peut-être souhaitez-vous exécuter un test à partir d'un chemin en dehors du projet, incluez le chemin de votre projet dans votre PYTHONPATH.
collez-le dans votre .profile. Si vous êtes dans un environnement virtuel, collez-le dans le activate de votre racine venv
la source