I am following the pytest good practices or at least I think I am. However, pytest cannot find my module. It seems not to include the current directory in its PYTHONPATH
.
The source file:
def add(x, y): return x + y
The test file:
import pytest from junk.ook import add def test_add_true(): assert add(1, 1) == 2
And the shell output with a Python 3 virtual environment called "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 <module> 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
However, running the following does work fine.
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 ===========================
What am I doing wrong?
Just put an empty conftest.py
file in the project root directory:
$ pwd /home/usr/tmp/junk $ touch conftest.py
Your project structure should become:
junk ├── conftest.py ├── junk │ ├── __init__.py │ └── ook.py └── tests └── test_ook.py
What happens here: when pytest
discovers a conftest.py
, it modifies sys.path
so it can import stuff from the conftest module. So, since now an empty conftest.py
is found in rootdir, pytest
will be forced to append it to sys.path
. The side effect of this is that your junk
module becomes importable.
Simply add __init__.py
to the tests
directory, and to all directories recursively inside it that contain test files.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With