Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pytest cannot find module [duplicate]

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?

like image 306
Sardathrion - against SE abuse Avatar asked Feb 28 '18 11:02

Sardathrion - against SE abuse


2 Answers

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.

like image 68
hoefling Avatar answered Sep 16 '22 14:09

hoefling


Simply add __init__.py to the tests directory, and to all directories recursively inside it that contain test files.

like image 30
DBedrenko Avatar answered Sep 16 '22 14:09

DBedrenko