python-guide icon indicating copy to clipboard operation
python-guide copied to clipboard

Structuring your project guide leads to a ModuleNotFoundError in the tests module

Open isaiahstjohn opened this issue 6 years ago • 2 comments

Following this section, adding from .context import sample in my tests module gives me the following error: ModuleNotFoundError: No module named '__main__.context'; '__main__' is not a package

I was able to fix it by removing the . from from .context import sample, but I suspect that's not the ideal solution. I know that the from .context import sample is a relative import statement as described in PEP 328, but I just do not understand modules, packages, absolute and relative imports, etc. enough to say what's going on here.

I tried creating ./__init__.py and ./tests/__init__.py files, but that did not help.

Finally, I tried the following:

~> git clone [email protected]:navdeep-G/samplemod.git
~> python3 samplemod/tests/test_basic.py
Traceback (most recent call last):
  File "samplemod/tests/test_basic.py", line 3, in <module>
    from .context import sample
ModuleNotFoundError: No module named '__main__.context'; '__main__' is not a package

I'm not alone in hitting this issue. @rileyweber13 originally reported this problem a year ago.

isaiahstjohn avatar Oct 20 '19 13:10 isaiahstjohn

Relative imports only work in a package that is being imported due to using the __name__ variable that is set to "__main__" if the file is ran directly. If you import test_basic.py, it should work to run test_basic.sample. If you take out the period, you lose the ability to import the tests from elsewhere so what you want depends on how you're using the tests.

AghastComet avatar Oct 23 '19 05:10 AghastComet

Python tests are usually coded to be executed through a testing framework. In this case

cd <yourproject>
python -m pytest tests
# either:
# py.test tests

nuno-andre avatar Nov 30 '19 01:11 nuno-andre