Search code examples
pythonunit-testingtestingpytestsystem

Unable to Access pytest Test Features Without Modifying sys.path


I am working on a Python project where I have the following project structure:

project_directory/
├── src/
│   └── my_functions.py   # Contains functions to test
├── tests/
│   └── test_my_functions.py   # pytest test file
└── other_files_and_folders/   # Additional files or folders in the project

In the project_directory, I have a src directory containing the source code with functions that I want to test using pytest. The tests directory holds the pytest test file test_my_functions.py, which contains the test functions.

Initially, to import and access the functions from the src directory in the test_my_functions.py file, I used the following code to modify the Python path:

import sys
import os

# Get the path of the current directory (where test_my_functions.py is located)
current_directory = os.path.dirname(os.path.abspath(__file__))

# Add the parent directory of 'src' to the Python path
parent_directory = os.path.dirname(current_directory)
sys.path.append(parent_directory)

While this approach works, I am seeking a cleaner and more efficient way to access the pytest test features without explicitly modifying the Python path in the test script. I want to ensure that my test script can import the modules from the src directory seamlessly while following best practices and avoiding any potential pitfalls.

Is there a more elegant solution to achieve this without explicitly modifying the Python path in the test script? I am looking for insights and suggestions on how to accomplish this while maintaining a clean and maintainable project structure. Thank you for your help!


Solution

  • If you don't mind using plugins, try pytest-pythonpath.

    Install:

    pip install pytest-pythonpath
    

    Then create a file called pyproject.toml:

    # pyproject.toml
    [tool.pytest.ini_options]
    python_paths = ["src", "other_files_and_folders"]
    

    Then in your test_my_functions.py:

    import my_functions
    
    # tests to follow...