web-dev-qa-db-fra.com

Tester si le code est exécuté à partir d'une session py.test

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?

43
Laizer

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.

33
Laizer

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.

41
ramnes

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...
10
cgons

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!')
3
duhaime

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')
1
AlexG