68 votes

Django - comment détecter l'environnement de test

Le problème semble simple, mais malheureusement, il est un peu difficile à chercher sur Google.

Ma question est la suivante: comment puis-je détecter à l'intérieur d'une vue qu'elle soit appelée dans un environnement de test ou non?

 #pseudo_code
def my_view(request):
    if not request.is_secure() and not TEST_ENVIRONMENT:
        return HttpResponseForbidden()
 

144voto

Tobia Points 2978

Mettez ceci dans votre settings.py:

 import sys

TESTING = 'test' in sys.argv
 

Ceci teste si l'un des arguments de la ligne de commande était 'test'. Ensuite, vous pouvez accéder à cette variable à partir d'autres modules, comme suit:

 from django.conf import settings

if settings.TESTING:
    ...
 

Il y a de bonnes raisons pour cela: supposons que vous accédiez à un service principal, autre que les modèles de Django et les connexions à la base de données. Ensuite, vous devrez peut-être savoir quand appeler le service de production par rapport au service de test.

26voto

Travis Jensen Points 2166

Créez votre propre sous-classe TestSuiteRunner et modifiez un paramètre ou effectuez les autres tâches nécessaires pour le reste de votre application. Vous spécifiez le testeur dans vos paramètres:

 TEST_RUNNER = 'your.project.MyTestSuiteRunner'
 

En général, vous ne voulez pas faire cela, mais cela fonctionne si vous en avez absolument besoin.

 from django.conf import settings
from django.test.simple import DjangoTestSuiteRunner

class MyTestSuiteRunner(DjangoTestSuiteRunner):
    def __init__(self, *args, **kwargs):
        settings.IM_IN_TEST_MODE = True
        super(MyTestSuiteRunner, self).__init__(*args, **kwargs)
 

15voto

Il suffit de regarder request.META['SERVER_NAME']

 def my_view(request):
    if request.META['SERVER_NAME'] == "testserver":
        print "This is test environment!"
 

9voto

rednaw Points 3856

Il y a aussi une façon de remplacer temporairement les paramètres dans un test unitaire dans Django. Cela pourrait être un plus facile/solution de nettoyage pour certains cas.

Vous pouvez le faire à l'intérieur d'un test:

with self.settings(MY_SETTING='my_value'):
    # test code

Ou les ajouter en tant que décorateur sur la méthode de test:

@override_settings(MY_SETTING='my_value')
def test_my_test(self):
    # test code

Vous pouvez également définir le décorateur pour l'ensemble de la classe de cas de test:

@override_settings(MY_SETTING='my_value')
class MyTestCase(TestCase):
    # test methods

Pour plus d'informations, consultez le Django docs: https://docs.djangoproject.com/en/1.6/topics/testing/tools/#overriding-settings

7voto

pymarco Points 360

Je pense que la meilleure approche consiste à exécuter vos tests en utilisant leur propre fichier de paramètres (c.-à-d. Settings / tests.py). Ce fichier peut ressembler à ceci (la première ligne importe les paramètres depuis un fichier de paramètres local.py):

 from local import *
TEST_MODE = True
 

Ensuite, faites un type de chiffrage pour vérifier si vous êtes en mode test.

 try:
    if settings.TEST_MODE:
        print 'foo'
except AttributeError:
    pass
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X