Approche recommandée pour pytest>=7
: utiliser le pythonpath
paramètre
Récemment, pytest
a ajouté un nouveau plugin de base qui prend en charge sys.path
modifications via le pythonpath
valeur de configuration . La solution est donc beaucoup plus simple maintenant et ne nécessite plus aucune solution de contournement :
pyproject.toml
exemple :
[tool.pytest.ini_options]
pythonpath = [
"."
]
pytest.ini
exemple :
[pytest]
pythonpath = .
Les entrées de chemin sont calculées par rapport au répertoire racine, ainsi .
ajoute repo
pour sys.path
dans ce cas.
Les entrées de chemins multiples sont également autorisées : pour une disposition
repo/
src/
| lib.py
app.py
tests
test_app.py
test_lib.py
la configuration
[tool.pytest.ini_options]
pythonpath = [
".", "src",
]
ou
[pytest]
pythonpath = . src
ajoutera à la fois app
et lib
modules pour sys.path
donc
import app
import lib
fonctionneront tous les deux.
Réponse originale (non recommandée pour les versions récentes de pytest ; à utiliser pour pytest<7
uniquement) : conftest
solution
La solution la moins invasive consiste à ajouter un fichier vide nommé conftest.py
dans le repo/
répertoire :
$ touch repo/conftest.py
C'est tout. Il n'est pas nécessaire d'écrire du code personnalisé pour manipuler les fichiers sys.path
ou n'oubliez pas de faire glisser PYTHONPATH
le long, ou en plaçant __init__.py
dans des répertoires où il n'a pas sa place (en utilisant python -m pytest
comme suggéré dans Apteryx 's réponse est une bonne solution cependant !).
Le répertoire du projet après :
repo
conftest.py
app.py
settings.py
models.py
tests
test_app.py
Explication
pytest
cherche le conftest
sur la collection de tests afin de rassembler les hooks et fixtures personnalisés, et afin d'importer les objets personnalisés à partir de ceux-ci, pytest
ajoute le répertoire parent du conftest.py
à la sys.path
(dans ce cas, le repo
).
Autres structures de projet
Si vous avez une autre structure de projet, placez le conftest.py
dans le répertoire racine du paquet (celui qui contient les paquets mais qui n'est pas un paquet lui-même, donc pas de no contiennent un __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
mise en page
Bien que cette approche puisse être utilisée avec le src
disposition (place conftest.py
dans le src
dir) :
repo
src
conftest.py
spam
__init__.py
bacon.py
egg.py
eggs
__init__.py
sausage.py
tests
test_bacon.py
test_egg.py
Attention, l'ajout de src
a PYTHONPATH
atténue la signification et les avantages de la src
mise en page ! Vous finirez par tester le code du référentiel et non le paquet installé. Si vous avez besoin de le faire, peut-être n'avez-vous pas besoin de l'option src
dir du tout.
Où aller à partir de maintenant
Bien sûr, conftest
ne sont pas seulement quelques fichiers pour faciliter la découverte du code source ; c'est là que se trouvent toutes les améliorations spécifiques au projet de l'application pytest
et la personnalisation de votre suite de tests. pytest
a beaucoup d'informations sur conftest
modules dispersés dans leurs docs ; commencer par conftest.py
: plugins locaux par répertoire
Aussi, SO a une excellente question sur conftest
modules : Dans py.test, quelle est l'utilité des fichiers conftest.py ?