Tests separate from your code

An alternative to the method above is to organize your tests in a separate directory from the main package:

setup.py
mylib/
__init__.py
core.py
utils.py
tests/
__init__.py
test_core.py
test_utils.py

Some people prefer this layout because:

  • It keeps library code and testing code separate
  • The testing code is not included in the source package

One disadvantage of the above method is that, once you have a more complex hierarchy, you will probably want to keep the same hierarchy inside your tests directory, and that's a little harder to maintain and keep in sync:

mylib/  
__init__.py
core/
__init__.py
foundation.py
contrib/
__init__.py
text_plugin.py
tests/
__init__.py
core/
__init__.py
test_foundation.py
contrib/
__init__.py
test_text_plugin.py
So, which layout is the best? Both layouts have advantages and disadvantages. Pytest itself works perfectly well with either of them, so feel free to choose a layout that you are more comfortable with.