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?