194 votes

Comment désactiver la journalisation lors de l’exécution de tests unitaires en python django ?

Je suis à l'aide d'un simple Unittest en fonction de testeur pour tester mon application Django.

Mon application elle-même est configuré pour utiliser une base logger settings.py à l'aide de:

logging.basicConfig(level=logging.DEBUG)

Et dans mon code de l'application à l'aide de:

logger = logging.getLogger(__name__)
logger.setLevel(getattr(settings, 'LOG_LEVEL', logging.DEBUG))

Cependant, lors de l'exécution de unittests, je voudrais désactiver la journalisation, afin de ne pas encombrer le résultat de mon test de la sortie. Est-il un moyen simple de désactiver la journalisation de manière globale, de sorte que l'application spécifique enregistreurs ne sont pas à écrire dans la console quand je lance les tests?

286voto

unutbu Points 222216
<pre><code></code><p><code></code>.</p></pre>

54voto

Hassek Points 3136

Puisque vous êtes dans Django, vous pouvez ajouter ces lignes à votre settings.py:

import sys
import logging 

if len(sys.argv) > 1 and sys.argv[1] == 'test':
    logging.disable(logging.CRITICAL)

De cette façon, vous n'avez pas à ajouter cette ligne dans chaque setUp() de vos tests. :)

Vous pouvez également faire quelques changements de pratique pour tester vos besoins de cette manière.

EDIT (03/1/2013)

Il y a un autre "plus agréable" ou "nettoyeur" de façon à ajouter des détails à vos tests et qui est de faire votre propre test runner.

il suffit de créer une classe comme ceci:

import logging

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

class MyOwnTestRunner(DjangoTestSuiteRunner):
    def run_tests(self, test_labels, extra_tests=None, **kwargs):

        # don't show logging messages while testing
        logging.disable(logging.CRITICAL)

        return super(MyOwnTestRunner, self).run_tests(test_labels, extra_tests, **kwargs)

Et maintenant, ajoutez à votre settings.py fichier:

TEST_RUNNER = "PATH.TO.PYFILE.MyOwnTestRunner" 
#(for example, 'utils.mytest_runner.MyOwnTestRunner')

Cela vous permet de faire un très pratique, la modification que l'autre approche ne l'est pas, qui est de faire de django juste des tests des applications que vous souhaitez. Vous pouvez le faire en modifiant le test_labels ajoutant cette ligne dans le test runner:

if not test_labels:
    test_labels = ['my_app1', 'my_app2', ...]

21voto

alukach Points 367

J’aime l’idée de coureur de Hassek test personnalisé. Il est à noter que n’est plus le coureur de test par défaut dans Django 1.6 +, il a été remplacé par le . Pour le comportement par défaut, le coureur de test devrait être plus comme :

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