Pytest-django: Fournir un moyen de détecter si Django exécute des tests

Créé le 6 mai 2016  ·  9Commentaires  ·  Source: pytest-dev/pytest-django

Ce serait bien de faire quelque chose comme :

if settings.TESTING:
    print("py.test is being ran")

Commentaire le plus utile

"pytest" in sys.modules ?

Tous les 9 commentaires

"pytest" in sys.modules ?

Vous pouvez ajouter vous-même un paramètre avec un fichier de paramètres séparé pour les tests

Je pense que les approches suggérées par @blueyed et @adamchainz devraient être suffisantes si cela est nécessaire. En règle générale, il n'est pas recommandé de modifier le fonctionnement de votre code en vérifiant si le code est appelé ou non à partir de tests. Si cela devait être fait, cela pourrait être fait de manière pytest générale (ce n'est pas vraiment spécifique à pytest-django). Merci pour la suggestion, n'hésitez pas à rouvrir ce problème si vous avez des informations supplémentaires sur ce problème !

Exemple pertinent tiré de la documentation pytest

# content of conftest.py

def pytest_configure(config):
    import sys
    sys._called_from_test = True

def pytest_unconfigure(config):
    import sys
    del sys._called_from_test

Le problème est que pytest_configure est exécuté après settings.py . Existe-t-il un moyen d'exécuter ce code avant settings.py ?

@axil
Quel est le problème avec l'utilisation de 'pytest' in sys.modules ?

Hmm, oui, ça marche, même si ça m'a l'air un peu bidon.

Un autre moyen rapide et sale de vérifier cela dans settings.py est

TESTING = os.path.basename(sys.argv[0]) in ('pytest', 'py.test')

@axil
Quel est le problème avec l'utilisation de 'pytest' in sys.modules ?

Le fait que le pytest soit importé ne signifie pas que pytest est en cours d'exécution et que le code est invoqué à partir d'un test. Fondamentalement, un mes import pytest pour autre chose. De plus, pytest importe pytest même s'il affiche simplement une aide CLI : pytest --help

Voici un cas d'utilisation très valable :
J'ai un paramètre Django configurable avec des fichiers et des variables locaux où mettre diverses informations d'identification et d'autres configurations de développement locales. Mais je veux que mes tests unitaires n'utilisent jamais ces informations d'identification ou ces paramètres spécifiques pour ne pas les utiliser accidentellement sur un système réel (s'ils sont mal moqués) ou réussir/échouer sur la configuration de développement local. Par conséquent, je veux que ces paramètres locaux soient exclus lorsqu'ils sont exécutés avec pytest.

J'ai quelque chose comme :

import os
import os.path
import sys

from split_settings.tools import include, optional


def is_pytest_running():
    return (os.getenv('PYTEST_RUNNING') == 'true' or
            os.path.basename(sys.argv[0]) in ('pytest', 'py.test'))


ENVVAR_SETTINGS_PREFIX = 'MV_SERVER_'

local_settings_path = os.getenv(f'{ENVVAR_SETTINGS_PREFIX}SETTINGS', '../../../local/settings.py')

includes = [
    'base.py',
    'logging.py',
    'custom.py',
]

if not is_pytest_running():
    includes.append(optional(local_settings_path))
    includes.append('envvars.py')

include(*includes)

L'utilisation de os.getenv('PYTEST_RUNNING') == 'true' est une manière plus ou moins propre de le faire, mais le problème réside dans la définition de cette variable. Le définir dans conftest.py ne fonctionne pas car pytest-django importe les paramètres avant l'exécution de conftest.py. Le définir en ligne de commande lors de l'exécution de pytest n'est pas pratique et va à l'encontre de l'objectif : si quelqu'un oublie de le définir, les véritables informations d'identification seront utilisées à partir de la configuration de développement locale.

os.path.basename(sys.argv[0]) dans ('pytest', 'py.test')

J'ai dû le changer en os.path.basename(os.path.dirname(sys.argv[0])) in ('pytest', 'py.test') car sys.argv[0] sortait sous le nom /home/project/venv/lib/python3.8/site-packages/pytest/__main__.py .

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

clintonb picture clintonb  ·  4Commentaires

jedie picture jedie  ·  7Commentaires

koxu1996 picture koxu1996  ·  3Commentaires

asfaltboy picture asfaltboy  ·  5Commentaires

tolomea picture tolomea  ·  4Commentaires