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
у кореневому пакеті dir (той, що містить пакунки, але не є самим пакетом, тому не містить __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
модулів: У py.test, для чого використовують файли conftest.py?