conftest решение
Наименее инвазивным решением является добавление пустого файла с именем conftest.pyв repo/каталоге:
$ touch repo/conftest.py
Вот и все. Нет необходимости писать собственный код для искажения sys.pathили не забудьте перетащить PYTHONPATHили разместить__init__.py в каталог, где он не принадлежит.
Каталог проекта впоследствии:
repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
└── test_app.py
объяснение
pytestвнешний вид для conftestмодулей на тестовой коллекции , чтобы собрать пользовательские крючки и крепления, а также для того , чтобы импортировать пользовательские объекты из них, pytestдобавляет родительский каталог conftest.pyкsys.path (в данном случаеrepo каталога).
Другие структуры проекта
Если у вас есть другая структура проекта, поместите conftest.pyв корневой каталог пакета (тот, который содержит пакеты, но не сам пакет, поэтому не содержит __init__.py), например:
repo
├── conftest.py
├── spam
│ ├── __init__.py
│ ├── bacon.py
│ └── egg.py
├── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
src расположение
Хотя этот подход можно использовать с srcмакетом (место conftest.pyв srcдиректории):
repo
├── src
│ ├── conftest.py
│ ├── spam
│ │ ├── __init__.py
│ │ ├── bacon.py
│ │ └── egg.py
│ └── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
Имейте в виду, что добавление srcк PYTHONPATHсмягчает значение и преимущества srcмакета! Вы закончите тестированием кода из репозитория, а не установленного пакета. Если вам нужно сделать это, возможно, вам вообще не нужен srcкаталог.
Куда пойти отсюда
Конечно, conftestмодули - это не просто файлы, помогающие в обнаружении исходного кода; это то место, где происходят все специфичные для проекта улучшения pytestинфраструктуры и настройки вашего набора тестов. pytestимеет много информации о conftestмодулях, разбросанных по всем документам ; начать с conftest.py: локальные плагины для каждого каталога
Кроме того, у SO есть отличный вопрос по conftestмодулям: что такое использование файлов conftest.py в py.test?