简体   繁体   中英

Py.test No module named *

I have a folder structure like this

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py

In my test_app.py file , I have a line to import my app module. When I run py.test on the root folder, I get this error about no module named app. How should I configure this?

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.

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 ==============================

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 . Ie 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.

我遇到了类似的问题,不得不从根目录中删除__init__.py并将__init__.py添加到tests文件夹中。

I also got same error while running test cases for my app located as below

myproject
  --app1
    --__init.py__
    --test.py
  --app2
    --__init.py__
    --test.py
  --__init.py__

I deleted my myproject's init.py file to run my test cases.

TL;DR

You might as well add an empty conftest.py file to your root app folder.

(if you take a look at the question folder structure, that would be the same level as the "Tests" folder, not inside of it) .

More info:

Pytest looks for conftest.py files inside all your project folders.

conftest.py provides configuration for the file tree pytest finds it in. Because pytest somehow scans all subdirectories starting from conftest.py folder, it should find packages/modules outside the tests folder (as long as a conftest.py file is in your app root folder).

Eventually, you might want to write some code in your empty conftest.py, specially to share fixtures among different tests files, in order to avoid duplicate code. Afterall, the DRY principle (Don't Repeat Yourself) should also be follwed when writing tests.

Adding __init.py__ to the tests folder also should help pytest to find modules throughout your application. However, note that Python 3.3+ has implicit namespace packages that allow it to create a packages without an __init__.py file. That been said, creating __init__.py files for this specific purpose seems more like aa workaround for pytest than a python requirement. More about that in: Is __init__.py not required for packages in Python 3.3+

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

I got the similar issue. And after trying multiple things including installing pytest on virtual environment and adding/removing __init__.py file from the package, none worked for me.

Solution that worked for me is(windows solution): Added Project folder(not package folder) to python path(set PYTHONPATH=%PYTHONPATH%;%CD%)

Ran my script from Project Folder and boom, it worked.

I have a folder structure like this

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py

In my test_app.py file , I have a line to import my app module. When I run py.test on the root folder, I get this error about no module named app. How should I configure this?

This worked for me: Went to parent app, and pip install -e . (install a local and editable app).

What worked for me: I had to make absolute imports in my test file and call python -m test in the root folder.

I hit the same issue.

my-app
--conf
--my-app
--tests

I set the __init__.py files. I added a conftest.py ( for sharing pytest.fixtures ). I added this to my Poetry file ( pyproject.toml :

[tool.pytest.ini_options]
pythonpath = [
  "."

Turned out it was my use of hyphens and not underscores. Noo...

# pytest can't find Module
--my-app

# works
--my_app

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM