Parece que no puedo hacer que el marco de prueba de nariz reconozca los módulos debajo de mi script de prueba en la estructura de archivos. He creado el ejemplo más simple que demuestra el problema. Te 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 está foo.py), 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)
Recibo el mismo error cuando ejecuto desde dentro del directorio tests /. De acuerdo con la documentación y un ejemplo que encontré, se supone que nose 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.
fuente
¿Estás en un virtualenv? En mi caso,
nosetests
fue el/usr/bin/nosetests
que estaba usando/usr/bin/python
. Los paquetes del virtualenv definitivamente no estarán en la ruta del sistema. Lo siguiente solucionó esto:fuente
nosetests
fue almacenado en caché porbash
el sistema uno en/usr/local/bin
(mientraswhich nosetests
daba el resultado adecuado). Usé esto para borrarlo.Para aquellos de ustedes que encuentren esta pregunta más adelante: Recibo el error de importación si no tengo un
__init__.py
archivo en mi directorio de pruebas.Mi estructura de directorio era así:
Si hice pruebas de nariz:
Daría lo
ImportError
que todos los demás están viendo. Si agrego un__init__.py
archivo en blanco , funciona bien:fuente
Otro problema potencial parecen ser los guiones / guiones en el árbol de directorios. Recientemente solucioné un problema de ImportError de nariz al cambiar el nombre de un directorio de
sub-dir
asub_dir
.fuente
Por supuesto, si tiene un error de sintaxis en el módulo que se está importando, esto lo causará. Para mí, el problema surgió cuando tuve una copia de seguridad de un archivo de pruebas con una ruta como module / tests.bak.py en el mismo directorio que tests.py. Además, para solucionar el problema del módulo / paquete init en una aplicación Django, puede ejecutar lo siguiente (en un shell bash / OSX) para asegurarse de que no tiene ningún archivo init .pyc por ahí:
fuente
Recibí este mensaje de error porque ejecuté el
nosetests
comando desde el directorio incorrecto.Tonto, pero pasa.
fuente
nosetests
en un directorio sin ninguna prueba resultará enRan 0 tests
ningún error de importación. En su forma actual, esta respuesta no es útil.Me encontré con una cosa más que podría causar este problema: nombrar las pruebas en el formulario
testname.test.py
. Ese extra.
confunde la nariz y la lleva a importar cosas que no debería. Supongo que puede ser obvio que usar convenciones de nomenclatura de prueba no convencionales romperá las cosas, pero pensé que valdría la pena señalarlo.fuente
Por ejemplo, con la siguiente estructura de directorios, si se desea ejecutar
nosetests
enm1
,m2
om3
para probar algunas funciones enn.py
, usted debe utilizarfrom m2.m3 import n
entest.py
.fuente
Solo para completar la pregunta: si está luchando con una estructura como esta:
Y tal vez desee ejecutar la prueba desde una ruta fuera del proyecto, incluya la ruta de su proyecto dentro de su PYTHONPATH.
péguelo dentro de su .profile. Si se encuentra en un entorno virtual, péguelo dentro de la activación en su raíz de venv
fuente