Running pytest when the test files are in a different directory to the source files
Last updated: Jan 24, 2023
I had a battle to get my testing directory structure to work outside of an IDE. Please find my solution below. Tested on Windows 7 using python 3.6 and Linux Mint using python 3.4, running the code using the command line:
python -m pytest test_compress_files.py
The file I wrote to be tested is called compress_files.py in a directory named \src. The file containing tests to be run using pytest is called test_compress_files.py in a subdirectory \tests, so the full directory path is \src\tests. I needed to add a file called context.py to the \src\tests directory. This file is used in test_compress_files.py to enable access to compress_files.py in the directory above. The init.py files are empty.
Directory structure:
\src
__init__.py
compress_files.py
\src\tests
__init__.py
context.py
test_compress_files.py
compress_files.py contains the script to be tested.
context.py:
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import compress_files
The line:
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__)
comes from the suggestion at the hitch hikers guide to python at:
http://docs.python-guide.org/en/latest/writing/structure/.
This adds the path of the directory above the /src/tests directory to sys.path, which in this case is /src.
test_compress_files.py:
import os
import pytest
from context import compress_files
from compress_files import *
# tests start here ...
I put this up as an answer to a stackoverflow question here.