Saturday 17 August 2019

Tests and python package structure




I have some problems in structuring my python project. Currently it is a bunch of files in the same folder. I have tried to structure it like



proj/
__init__.py
foo.py
...
bar/
__init__.py
foobar.py

...
tests/
foo_test.py
foobar_test.py
...


The problem is that I'm not able, from inner directories, to import modules from the outer directories. This is particularly annoying with tests.



I have read PEP 328 about relative imports and PEP 366 about relative imports from the main module. But both these methods require the base package to be in my PYTHONPATH. Indeed I obtain the following error





ValueError: Attempted relative import in non-package.




So I added the following boilerplate code on top of the test files



import os, sys
sys.path.append(os.path.join(os.getcwd(), os.path.pardir))



Still I get the same error. What is the correct way to




  • structure a package, complete with tests, and

  • add the base directory to the path to allow imports?



EDIT As requested in the comment, I add an example import that fails (in the file foo_test.py)




import os, sys
sys.path.append(os.path.join(os.getcwd(), os.path.pardir))
from ..foo import Foo

Answer



When you use the -m switch to run code, the current directory is added to sys.path. So the easiest way to run your tests is from the parent directory of proj, using the command:



python -m proj.tests.foo_test



To make that work, you will need to include an __init__.py file in your tests directory so that the tests are correctly recognised as part of the package.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...