Py.test No module named *

Solution 1:

Working with Python 3 and getting the same error on a similar project layout, I solved it by adding an __init__ file to my tests module.

$ touch tests/__init__.py

I'm not great at packaging and importing, but I think that this helps pytest work out where the target App module is located.

Solution 2:

I already had an __init__.py file in the /App/App directory and wanted to run tests from the project root without any path-mangling magic:

 python -m pytest tests

The output immediately looks like this:

➟  python -m pytest tests
====================================== test session starts ======================================
platform linux -- Python 3.5.1, pytest-2.9.0, py-1.4.31, pluggy-0.3.1
rootdir: /home/andrew/code/app, inifile: 
plugins: teamcity-messages-1.17
collected 46 items 

... lines omitted ...

============================= 44 passed, 2 skipped in 1.61 seconds ==============================

Solution 3:

So you are running py.test from /App. Are you sure /App/App is in your $PYTHONPATH?

If it's not, code that tries to import app will fail with such a message.

EDIT0: including the info from my comment below, for completeness.

An attempt to import app will only succeed if it was executed inside /App/App, which is not the case here. You probably want to make /App/App a package by putting __init__.py inside it, and change your import to qualify app as from App import app.

EDIT1: by request, adding further explanation from my second comment below.

By putting __init__.py inside /App/App, that directory becomes a package. Which means you can import from it, as long as it - the directory - is visible in the $PYTHONPATH. I.e. you can do from App import app if /App is in the $PYTHONPATH. Your current working directory gets automatically added to $PYTHONPATH, so when you run a script from /App, the import will work.

Solution 4:

I had a similar problem and had to delete __init__.py from the root and add an __init__.py to the tests folder.

Solution 5:

Running pytest with the python -m pytest command helps with this exact thing.

Since your current package is not yet in your $PYTHONPATH or sys.path - pytest gets this error.

By using python -m pytest you automatically add the working directory into sys.path for running pytest. Their documentation also mentions:

This is almost equivalent to invoking the command line script pytest