pytest no puede encontrar el módulo

Estoy siguiendo las buenas prácticas de Pytest o al menos creo que lo estoy . Sin embargo, pytest no puede encontrar mi módulo. Parece que no incluye el directorio actual en su PYTHONPATH .

El archivo fuente:

 def add(x, y): return x + y 

El archivo de prueba:

 import pytest from junk.ook import add def test_add_true(): assert add(1, 1) == 2 

Y la salida de shell con un entorno virtual Python 3 llamado “p3”.

 p3; pwd /home/usr/tmp/junk p3; ls total 0 0 junk/ 0 tests/ p3; ls junk total 4.0K 4.0K ook.py 0 __init__.py p3; ls tests total 4.0K 4.0K test_ook.py 0 __pycache__/ p3; pytest ============================= test session starts ============================== platform linux -- Python 3.4.5, pytest-3.4.1, py-1.5.2, pluggy-0.6.0 rootdir: /home/usr/tmp/junk, inifile: collected 0 items / 1 errors ==================================== ERRORS ==================================== ______________________ ERROR collecting tests/test_ook.py ______________________ ImportError while importing test module '/home/usr/tmp/junk/tests/test_ook.py'. Hint: make sure your test modules/packages have valid Python names. Traceback: tests/test_ook.py:2: in  from junk.ook import add E ImportError: No module named 'junk' !!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!! =========================== 1 error in 0.08 seconds ============================ def test_add_true(): assert add(1, 1) == 2 

Sin embargo, ejecutar lo siguiente funciona bien.

 p3; python -m pytest tests/ ============================= test session starts ============================== platform linux -- Python 3.4.5, pytest-3.4.1, py-1.5.2, pluggy-0.6.0 rootdir: /home/usr/tmp/junk, inifile: collected 1 item tests/test_ook.py . [100%] =========================== 1 passed in 0.02 seconds =========================== 

¿Qué estoy haciendo mal?

Simplemente coloque un archivo conftest.py vacío en el directorio raíz del proyecto:

 $ pwd /home/usr/tmp/junk $ touch conftest.py 

Su estructura de proyecto debe convertirse en:

 junk ├── conftest.py ├── junk │ ├── __init__.py │ └── ook.py └── tests └── test_ook.py 

Lo que sucede aquí: cuando pytest descubre un conftest.py , modifica sys.path para que pueda importar cosas del módulo conftest. Entonces, como ahora se encuentra un conftest.py vacío en rootdir, pytest se verá obligado a adjuntarlo a sys.path . El efecto secundario de esto es que su módulo de junk se vuelve importable.

Simplemente agregue __init__.py al directorio de tests y a todos los directorios recursivamente dentro que contengan archivos de prueba.