tutorial - Error de importación de la nariz de Python
pyunit (9)
¿Estás en un virtualenv? En mi caso, nosetests
fue el que estaba en /usr/bin/nosetests
, que usaba /usr/bin/python
. Los paquetes en el virtualenv definitivamente no estarán en la ruta del sistema. Lo siguiente solucionó esto:
source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
Parece que no puedo obtener el marco de prueba de la nariz para reconocer los módulos debajo de mi script de prueba en la estructura del archivo. Configuré el ejemplo más simple que demuestra el problema. Lo explicaré a continuación.
Aquí está la estructura del archivo del paquete:
./__init__.py
./foo.py
./tests
./__init__.py
./test_foo.py
foo.py contiene:
def dumb_true():
return True
tests / test_foo.py contiene:
import foo
def test_foo():
assert foo.dumb_true()
Ambos archivos init .py están vacíos
Si ejecuto nosetests -vv
en el directorio principal (donde foo.py es), obtengo:
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)
Obtengo el mismo error cuando corro desde el directorio de tests /. De acuerdo con la documentación y un ejemplo que encontré, nose se supone que debe agregar todos los paquetes principales a la ruta, así como el directorio desde el que se llama, pero esto no parece estar sucediendo en mi caso.
Estoy ejecutando Ubuntu 8.04 con Python 2.6.2. He construido e instalado la nariz manualmente (no con setup_tools) si eso importa.
Acabo de toparme con una cosa más que podría causar este problema: nombrar pruebas en la forma testname.test.py
. Eso extra .
confunde la nariz y lo lleva a importar cosas que no debería. Supongo que puede ser obvio que el uso de convenciones de nomenclatura de pruebas no convencionales romperá las cosas, pero pensé que podría valer la pena.
Otro problema potencial parece ser guiones / guiones en el árbol de directorios. Recientemente arreglé un problema de ImportError nose cambiando el nombre de un directorio de sub-dir
a sub_dir
.
Para aquellos de ustedes que encuentren esta pregunta más adelante: obtengo el error de importación si no tengo un archivo __init__.py
en mi directorio de pruebas.
Mi estructura de directorio era así:
./tests/
./test_some_random_stuff.py
Si ejecuté nosetests:
nosetests -w tests
Le daría ImportError
que todos los demás están viendo. Si agrego un archivo __init__.py
blanco, funciona bien:
./tests/
./__init__.py
./test_some_random_stuff.py
Por ejemplo, con la siguiente estructura de directorios, si desea ejecutar nosetests
de nosetests
en m1
, m2
o m3
para probar algunas funciones en n.py
, debe usar from m2.m3 import n
en test.py
m1
└── m2
├── __init__.py
└── m3
├── __init__.py
├── n.py
└── test
└── test.py
Por supuesto, si tiene un error de sintaxis en el módulo que se está importando, esto causará esto. Para mí, el problema surgió cuando tuve una copia de seguridad de un archivo de prueba con una ruta como module / tests.bak.py en el mismo directorio que tests.py. Además, para resolver el problema del paquete / módulo de init en una aplicación de Django, puede ejecutar lo siguiente (en un shell bash / OSX) para asegurarse de que no tiene ningún archivo .pyc de inicio :
find . -name ''*.pyc'' -delete
Recibí este mensaje de error porque ejecuto el comando nosetests
del directorio incorrecto.
Tonto, pero sucede.
Solo para completar la pregunta: si estás luchando con una estructura como esta:
project
├── m1
├ ├── __init__.py
├ ├── foo1.py
├ └──m2
├ ├── __init__.py
├ └── foo2.py
├
└── test
├── __init__.py
└── test.py
Y tal vez desee ejecutar una prueba desde un camino fuera del proyecto, incluya la ruta de su proyecto dentro de su PYTHONPATH.
export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project
pégalo dentro de tu .profile. Si se encuentra en un entorno virtual, péguelo dentro de la activación en su raíz venv
Tienes un __init__.py
en tu directorio de nivel superior. Eso lo convierte en un paquete. Si lo quitas, tus nosetests
deberían funcionar.
Si no lo elimina, tendrá que cambiar la import
para import dir.foo
, donde dir
es el nombre de su directorio.