Cómo importar el src desde el módulo de pruebas en python

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