conftest Solution
La solution la moins invasive consiste à ajouter un fichier vide nommé conftest.pydans le repo/répertoire:
$ touch repo/conftest.py
C'est tout. Pas besoin d'écrire du code personnalisé pour manipuler le sys.pathou n'oubliez pas de le faire glisser PYTHONPATH, ou de le placer __init__.pydans des répertoires où il n'appartient pas.
Le répertoire du projet ensuite:
repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
└── test_app.py
Explication
pytestrecherche les conftestmodules sur la collection de tests pour rassembler des crochets et des fixtures personnalisés, et afin d'en importer les objets personnalisés, pytestajoute le répertoire parent de conftest.pyàsys.path (dans ce cas, le reporépertoire).
Autres structures de projet
Si vous avez une autre structure de projet, placez le conftest.pydans le répertoire racine du package (celui qui contient les packages mais n'est pas un package lui-même, donc ne contient pas de __init__.py), par exemple:
repo
├── conftest.py
├── spam
│ ├── __init__.py
│ ├── bacon.py
│ └── egg.py
├── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
src disposition
Bien que cette approche puisse être utilisée avec la srcmise en page (place conftest.pydans le srcrépertoire):
repo
├── src
│ ├── conftest.py
│ ├── spam
│ │ ├── __init__.py
│ │ ├── bacon.py
│ │ └── egg.py
│ └── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
méfiez-vous que l'ajout srcpour PYTHONPATHatténuer le sens et les avantages de la srcmise en page! Vous finirez par tester le code du référentiel et non le package installé. Si vous devez le faire, vous n'avez peut-être pas du tout besoin du srcrépertoire.
Où aller en partant d'ici
Bien sûr, les conftestmodules ne sont pas seulement des fichiers pour faciliter la découverte du code source; c'est là que toutes les améliorations spécifiques au projet du pytestcadre et la personnalisation de votre suite de tests se produisent. pytesta beaucoup d'informations sur les conftestmodules dispersés dans leurs documents ; commencer par conftest.py: plugins locaux par répertoire
Aussi, SO a une excellente question sur les conftestmodules: dans py.test, à quoi sert les fichiers conftest.py?