0

I am having an issue whereby relative imports from a .py file within a module are not recognised as such by pytest.

Consider the following directory structure:

.
├── import_pytest_issue
│   ├── __init__.py
│   ├── main.py
│   ├── user.py
│   └── utils.py
└── tests
    ├── __init__.py
    └── test_main.py

main.py, user.py, and utils.py are as follows"

# ./import_pytest_issue/main.py
from user import User

if __name__ == "__main__":
    user = User("Fred")
    print(f"The user is called {user.name}, and their favourite number is {user.favourite_number}")

# ----------------------------------------------------------------------
# ./import_pytest_issue/user.py
from utils import random_number

class User:
    favourite_number = random_number()

    def __init__(self, name: str) -> None:
        self.name = name

# ----------------------------------------------------------------------
# ./import_pytest_issue/utils.py
from random import choice

def random_number():
    return choice(range(1, 11))

...and my test_main.py file is like this:

# ./tests/test_main.py
from import_pytest_issue.user import User

def test_user():
    user = User("Larry")
    assert user.name == "Larry"
    assert user.favourite_number in range(1, 11)

main.py runs without issue:

> python import_pytest_issue/main.py
# The user is called Fred, and their favourite number is 1

...but running pytest I get a ModuleNotFoundError:

> pytest                            
# ======================================================================== test session starts ========================================================================
# platform linux -- Python 3.10.6, pytest-7.2.1, pluggy-1.0.0
# collected 0 items / 1 error                                                                                                                                         

# ============================================================================== ERRORS ===============================================================================
# ________________________________________________________________ ERROR collecting tests/test_main.py ________________________________________________________________
# ImportError while importing test module 'import-pytest-issue/tests/test_main.py'.
# Hint: make sure your test modules/packages have valid Python names.
# Traceback:
# /usr/lib/python3.10/importlib/__init__.py:126: in import_module
#     return _bootstrap._gcd_import(name[level:], package, level)
# tests/test_main.py:1: in <module>
#     from import_pytest_issue.user import User
# import_pytest_issue/user.py:1: in <module>
#     from utils import random_number
# E   ModuleNotFoundError: No module named 'utils'
# ====================================================================== short test summary info ======================================================================
# ERROR tests/test_main.py
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# ========================================================================= 1 error in 0.05s ==========================================================================

FWIW this also happens if I run `python -m pytest`.

Any ideas?
g_t_m
  • 704
  • 4
  • 9
  • 1
    Does this answer your question? [Relative imports for the billionth time](https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time) – Brian61354270 Feb 17 '23 at 20:09
  • You're mixing up scripts and modules. See the answer in the linked question for how to import and run modules in a package. – Brian61354270 Feb 17 '23 at 20:10
  • Also, do note that Python imports _do not navigate directories_. Imports are only resolved by searching the Python path. In your code, your reference the same modules as being at different package locations (e.g. `import_pytest_issue.user` vs `user`). Only one of those can be correct – Brian61354270 Feb 17 '23 at 20:13

0 Answers0