Tengo una aplicación que me gustaría probar usando unittest
pero tengo algunos problemas. Mi estructura de directorios es la siguiente:
root_dir ├── src │ ├── cmds │ │ ├── baz.py │ │ ├── __init__.py │ │ └── bar.py │ └── foo.py └── tests ├── cmds.py └── __init__.py
Quiero probar los módulos de bar
y baz
de cmds
y estoy tratando de hacer
root_dir> python2.7 -m unittest tests.cmds
Pero en tests.cmds
no puedo importar el paquete cmds
en mi directorio src
.
¿Cómo puedo hacer que esto funcione?
Básicamente, quiero probar la aplicación desde root_dir
con los directorios src
y tests
separado.
Intenté añadir src
a sys.path
, pero al importar cmds.baz
desde tests/cmds.py
, todavía obtengo un AttributeError: 'module' object has no attribute 'cmds'
de unittest.
Edición: Mi statement de importación y sys.path
es:
import sys sys.path.append('../src') from cmds.baz import about
Y el rastreo:
Traceback (most recent call last): File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main "__main__", fname, loader, pkg_name) File "/usr/lib/python2.7/runpy.py", line 72, in _run_code exec code in run_globals File "/usr/lib/python2.7/unittest/__main__.py", line 12, in main(module=None) File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__ self.parseArgs(argv) File "/usr/lib/python2.7/unittest/main.py", line 149, in parseArgs self.createTests() File "/usr/lib/python2.7/unittest/main.py", line 158, in createTests self.module) File "/usr/lib/python2.7/unittest/loader.py", line 128, in loadTestsFromNames suites = [self.loadTestsFromName(name, module) for name in names] File "/usr/lib/python2.7/unittest/loader.py", line 100, in loadTestsFromName parent, obj = obj, getattr(obj, part) AttributeError: 'module' object has no attribute 'cmds'
Una cosa muy incorrecta es agregar una ruta relativa a sys.path
. Si desea estar seguro acerca de la ruta, haga lo siguiente:
# assuming that the code is in test's __init__.py import os import sys sys.path.insert(0, os.path.abspath( os.path.join(os.path.dirname(__file__), '../src/') )) # now you can be sure that the project_root_dir/src comes first in sys.path
Creo que lo tienes casi bien. Pero a medida que ejecuta sus pruebas desde el directorio raíz, su ruta ( '../src'
) es incorrecta, supongo. Tal vez puedas hacer algo como esto:
import os import sys ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..') sys.path.append(os.path.join(ROOT, 'src')) from cmds.baz import about