Je voudrais me connecter à une autre base de données si mon code s'exécute sous py.test. Y a-t-il une fonction à appeler ou une variable d'environnement que je peux tester qui me dira si je suis en cours d'exécution sous une session py.test? Quelle est la meilleure façon de gérer cela?
Une solution est venue de RTFM , mais pas à un endroit évident. Le manuel contenait également une erreur de code, corrigée ci-dessous.
Détecte si l'exécution s'effectue à partir d'une exécution de test
Habituellement, c'est une mauvaise idée de faire en sorte que le code d'application se comporte différemment s'il est appelé à partir d'un test. Mais si vous devez absolument savoir si votre code d'application s'exécute à partir d'un test, vous pouvez faire quelque chose comme ceci:
# content of conftest.py def pytest_configure(config): import sys sys._called_from_test = True def pytest_unconfigure(config): import sys # This was missing from the manual del sys._called_from_test
puis vérifiez l'indicateur sys._called_from_test:
if hasattr(sys, '_called_from_test'): # called from within a test run else: # called "normally"
en conséquence dans votre candidature. C'est également une bonne idée d'utiliser votre propre module d'application plutôt que sys pour gérer l'indicateur.
Une solution plus simple à laquelle je suis parvenu:
import sys
if "pytest" in sys.modules:
...
Pytest runner chargera toujours le module pytest
, le rendant disponible dans sys.modules
.
Bien sûr, cette solution ne fonctionne que si le code que vous essayez de tester n'utilise pas pytest
lui-même.
Il existe également une autre méthode documentée dans le manuel: https://docs.pytest.org/en/latest/example/simple.html#pytest-current-test-environment-variable
Pytest définira la variable d'environnement suivante PYTEST_CURRENT_TEST
.
La vérification de l'existence de ladite variable devrait permettre de manière fiable de détecter si le code est exécuté à l'intérieur du parapluie de pytest.
import os
if "PYTEST_CURRENT_TEST" in os.environ:
# We are running under pytest, act accordingly...
Travailler avec pytest==4.3.1
les méthodes ci-dessus ont échoué, donc je suis juste allé à l'ancienne et vérifié avec:
if 'pytest' in sys.argv[0]:
print('pytest was called!')
Cela pourrait être fait en définissant une variable d'environnement dans le code de test. Par exemple, étant donné un projet
conftest.py
mypkg/
__init__.py
app.py
tests/
test_app.py
Dans test_app.py
vous pouvez ajouter
import os
os.environ['PYTEST_RUNNING'] = 'true'
Et puis vous pouvez vérifier à l'intérieur app.py
:
import os
if os.environ.get('PYTEST_RUNNING', '') == 'true':
print('pytest is running')