unittest tutorial test raises assert_equal python nose python-import

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.