Я использовал easy_install для установки pytest на Mac и начал писать тесты для проекта с файловой структурой, например:
repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py
бегать py.test
в каталоге репо, все ведет себя так, как вы ожидаете
но когда я пытаюсь сделать то же самое в Linux или Windows (оба имеют pytest 2.2.3 на них), он лает всякий раз, когда ему удается выполнить первый импорт чего-либо из пути моего приложения. Скажем напримерfrom app import some_def_in_app
Нужно ли редактировать мой PATH для запуска py.test на этих системах? Кто-нибудь испытывал это?
python
unit-testing
pytest
MattoTodd
источник
источник
Ответы:
Да, исходная папка не находится в пути Python, если вы находитесь
cd
в каталоге tests.У вас есть 2 варианта:
Добавьте путь вручную к тестовым файлам, примерно так:
Запустите тесты с помощью env var
PYTHONPATH=../
.источник
cd
в каталог? Я бегуpy.test
от своего корня. если я не ошибаюсь, и вы имеете в виду, как pytest проходит через мои папкиcd
проблемой, разве я не ударил бы это и на Mac?Я не уверен, почему py.test не добавляет текущий каталог в сам PYTHONPATH, но вот обходной путь (который должен выполняться из корня вашего репозитория):
Это работает, потому что Python добавляет текущий каталог в PYTHONPATH для вас.
источник
project/test/all-my-tests
иproject/src/app.py
из-за этого изменения нужно вызватьapp.py
косвенно, используя__main__.py
файлproject/src
, чтобы можно было использовать вызовpython -m src
. Насколько я могу судить, довольно грязные вещи./home/user/dev/projectxyz/src ...
были бы очень плохими и не работали на других машинах в большинстве случаев. Я думаю, что я имел в виду, что я должен всегда записывать весь корень проекта в путь к модулю, даже если модуль находится в той же папке, что и файл. Я не знал, что это считается лучшей практикой, так что это полезная информация, спасибо. Я согласен с большинством pep8, хотя это все еще не идеально.__init__.py
в тестах, что решил проблему. Теперь я могу использоватьpytest
conftest
решениеНаименее инвазивным решением является добавление пустого файла с именем
conftest.py
вrepo/
каталоге:Вот и все. Нет необходимости писать собственный код для искажения
sys.path
или не забудьте перетащитьPYTHONPATH
или разместить__init__.py
в каталог, где он не принадлежит.Каталог проекта впоследствии:
объяснение
pytest
внешний вид дляconftest
модулей на тестовой коллекции , чтобы собрать пользовательские крючки и крепления, а также для того , чтобы импортировать пользовательские объекты из них,pytest
добавляет родительский каталогconftest.py
кsys.path
(в данном случаеrepo
каталога).Другие структуры проекта
Если у вас есть другая структура проекта, поместите
conftest.py
в корневой каталог пакета (тот, который содержит пакеты, но не сам пакет, поэтому не содержит__init__.py
), например:src
расположениеХотя этот подход можно использовать с
src
макетом (местоconftest.py
вsrc
директории):Имейте в виду, что добавление
src
кPYTHONPATH
смягчает значение и преимуществаsrc
макета! Вы закончите тестированием кода из репозитория, а не установленного пакета. Если вам нужно сделать это, возможно, вам вообще не нуженsrc
каталог.Куда пойти отсюда
Конечно,
conftest
модули - это не просто файлы, помогающие в обнаружении исходного кода; это то место, где происходят все специфичные для проекта улучшенияpytest
инфраструктуры и настройки вашего набора тестов.pytest
имеет много информации оconftest
модулях, разбросанных по всем документам ; начать сconftest.py
: локальные плагины для каждого каталогаКроме того, у SO есть отличный вопрос по
conftest
модулям: что такое использование файлов conftest.py в py.test?источник
pytest
и настоятельно рекомендуется не делать этого. Делая это, вы сажаете семена для будущих ошибок. Создайте другой модуль с именемutils.py
и поместите туда код для повторного использования в тестах.conftest.py
не относится к коду приложения, и, следовательно, размещение его подsrc/
неправильным кодом .У меня такая же проблема. Я исправил это, добавив пустой
__init__.py
файл в мойtests
каталог.источник
avoid “__init__.py” files in your test directories. This way your tests can run easily against an installed version of mypkg, independently from the installed package if it contains the tests or not.
SRC: pytest.org/latest/goodpractises.html__init__.py
из моего каталога тестов решило его для меня.__init__.py
в подкаталоги intest/
делает абсолютный импорт работающим для запуска определенных тестов в этом подкаталоге для устанавливаемых модулей. Спасибо.Запустите
pytest
себя как модуль с:python -m pytest tests
источник
python -m pytest
без объяснения причин, кроме «потому что это работает»package/src package/tests
иtests
вы импортируете изsrc
. Выполнение в качестве модуля будет рассматривать импорт как абсолютный, чем относительно места выполнения.Вы можете запустить с PYTHONPATH в корне проекта
Или используйте pip install в качестве редактируемого импорта
источник
test
каталогом, неsrc
входящим в структуру каталогов и вызывающим из каталога, содержащегоtest
иsrc
каталог, и каталог.Я создал это как ответ на ваш вопрос и мое собственное замешательство. Я надеюсь, что это помогает. Обратите внимание на PYTHONPATH как в командной строке py.test, так и в tox.ini.
https://github.com/jeffmacdonald/pytest_test
В частности: Вы должны указать py.test и tox, где найти модули, которые вы включаете.
С py.test вы можете сделать это:
А с помощью tox добавьте это в ваш tox.ini:
источник
У меня была такая же проблема во Фляске.
Когда я добавил:
в папку тестов, проблема исчезла :)
Возможно, приложение не может распознать тесты папок как модуль
источник
Я исправил это, удалив верхний уровень
__init__.py
в родительской папке моих источников.источник
Я начал получать странные
ConftestImportFailure: ImportError('No module named ...
ошибки, когда случайно добавил__init__.py
файл в свой каталог src (который не должен был быть пакетом Python, а просто контейнером из всех источников).источник
Я получал эту ошибку из-за чего-то еще более простого (можно даже сказать тривиального). Я не установил
pytest
модуль. Так простоapt install python-pytest
исправил это для меня.'pytest' был бы указан в setup.py как тестовая зависимость. Убедитесь, что вы также установили требования к тестированию.
источник
У меня была похожая проблема.
pytest
не распознал модуль, установленный в среде, в которой я работал.Я решил это, также установив
pytest
в ту же среду.источник
Для меня проблема была
tests.py
сгенерирована Django вместе сtests
каталогом. Удалениеtests.py
решило проблему.источник
Я получил эту ошибку, так как неправильно использовал относительный импорт. В примере OP test_app.py должен импортировать функции, используя, например,
Однако в общем случае __init__.py файлы разбросаны по файловой структуре, это не работает и создает вид импортируемой ошибки, если только файлы и тестовые файлы не находятся в одном каталоге.
Вот пример того, что я должен был сделать с одним из моих проектов:
Вот моя структура проекта:
Чтобы получить доступ к activity_indicator.py из test_activity_indicator.py, мне нужно было:
источник
Очень часто тесты прерывались из-за невозможности импорта модуля. После исследования я обнаружил, что система ищет файл в неправильном месте, и мы легко можем решить проблему, скопировав файл, содержащий модуль, в та же папка, как указано, для правильного импорта. Еще одно решение - изменить декларацию для импорта и показать MutPy правильный путь к блоку. Однако из-за того, что несколько модулей могут иметь эту зависимость, а это означает, что нам необходимо зафиксировать изменения и в их объявлениях, мы предпочитаем просто переместить модуль в папку.
источник
Согласно сообщению на Medium Дирка Эйвери (и подтверждается моим личным опытом), если вы используете виртуальную среду для своего проекта, то вы не можете использовать общесистемную установку pytest; Вы должны установить его в виртуальной среде и использовать эту установку.
В частности, если она установлена в обоих местах, то просто запустить
pytest
команду не получится, поскольку она будет использовать установку системы. Как описано в других ответах, одно простое решение - запуститьpython -m pytest
вместоpytest
; это работает, потому что он использует версию среды pytest. Кроме того, вы можете просто удалить системную версию pytest; после реактивации виртуальной средыpytest
команда должна работать.источник
python -m pytest tests/
.У меня возникла та же проблема, когда я следовал учебнику по Flask, и я нашел ответ в официальных документах Pytest. Это немного отличается от того, как я (и я думаю, что многие другие) используются для того, чтобы что-то делать.
Вы должны создать
setup.py
файл в корневом каталоге вашего проекта, по крайней мере, со следующими двумя строками:где PACKAGENAME - это имя вашего приложения. Затем вы должны установить его с помощью pip:
-e
Флаг говорит ПГИ intall пакета в редактируемом или «развивать» режим. Поэтому при следующем запускеpytest
приложение должно найти ваше приложение в стандартеPYTHONPATH
.источник
Мое решение:
создать
conftest.py
файл вtest
каталоге, содержащем:Это добавит интересующую папку к пути python без изменения каждого тестового файла , установки переменной env или работы с абсолютными / относительными путями.
источник