Py.test Нет модуля с именем *

У меня такая структура папок

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

В моем test_app.py file у меня есть строка для импорта моего модуля приложения. Когда я запускаю py.test в корневой папке, я получаю эту ошибку без модуля с именем app. Как мне настроить это?

Ответ 1

Итак, вы используете py.test из /App. Вы уверены, что /App/App находится в вашем $PYTHONPATH?

Если это не так, код, который пытается выполнить import app, с таким сообщением не удастся.

EDIT0: включая информацию из моего комментария ниже, для полноты.

Попытка импортировать приложение будет успешной только в том случае, если она была выполнена внутри /App/App, что здесь не так. Вероятно, вы захотите сделать /App/App пакет, поместив __init__.py внутри него и изменив свой импорт, чтобы квалифицировать приложение как from App import app.

EDIT1: по запросу добавив дополнительное объяснение из моего второго комментария ниже.

Поместив __init__.py внутри /App/App, этот каталог станет пакетом. Это означает, что вы можете импортировать из него, если он - каталог - отображается в $PYTHONPATH. То есть вы можете сделать из App import app, если /App находится в $PYTHONPATH. Ваш текущий рабочий каталог автоматически добавляется в $PYTHONPATH, поэтому при запуске script из /App импорт будет работать.

Ответ 2

У меня уже был файл __init__.py в каталоге /App/App и вы хотели запускать тесты из корня проекта без какой-либо магии управления траекторией:

 python -m pytest tests

Результат немедленно выглядит следующим образом:

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

Ответ 3

Работая с Python 3 и получая ту же ошибку в подобном макете проекта, я решил ее, добавив файл __init__ в мой модуль tests.

$ touch tests/__init__.py

Я не очень разбираюсь в упаковке и импорте, но я думаю, что это помогает pytest работать там, где находится целевой App модуль.

Ответ 4

Я также получил ту же ошибку при выполнении тестовых случаев для моего приложения, как показано ниже

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

Я удалил файл myproject __init.py__ и boom, сейчас выполняются тестовые случаи.