Python import src modules when running tests

Question:

My source files are located under src and my test files are located under tests. When I want to run a test file, say python myTest.py, I get an import error: “No module named ASourceModule.py”.

How do I import all the modules from source needed to run my tests?

Asked By: Karan

||

Answers:

You need to add that directory to the path:

import sys
sys.path.append('../src')

Maybe put this into a module if you are using it a lot.

Answered By: Thomas

The best (most manageable) solution appears to be using a virtualenv and setuptools/distribute to install a development copy of your (src) package. That way your tests execute against a fully "installed" system.

In the pystest docs there is a section on "good practices" explaining this approach, see here.

Answered By: Barry Wark

If you don’t want to add the source path to each test file or change your PYTHONPATH, you can use nose to run the tests.

Suppose your directory structure is like this:

project
    package
        __init__.py
        module.py
    tests
        __init__.py
        test_module.py

You should import the module normally in the test_module.py (e.g. from package import module). Then run the tests by running nosetests in the project folder. You can also run specific tests by doing nosetests tests/test_module.py.

The __init__.py in the tests directory is necessary if you want to run the tests from inside it.

You can install nose easily with easy_install or pip:

easy_install nose

or

pip install nose

nose extends unittest in a lot more ways, to learn more about it you can check their website: https://nose.readthedocs.org/en/latest/

Answered By: Anderson Vieira

On my system (Windows 10), I was required to do something like this:

import sys
import os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../src")

Appending the relative directory directly to sys.path did not work

Answered By: Frank Bryce

For those using Pytest:

  • Make sure src is recognized as a package by putting an empty__init__.py inside.
  • Put an empty conftest.py in the project folder.
  • Make sure there is no __init__.py in the test directory.

Looks like this:

project
    conftest.py
    src
        __init__.py
        module.py
    test
        test_module.py

And make sure test_module.py contains the line:

from src import module

Source: Pytest docs

Answered By: Joooeey
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.