2010-07-27 8 views
8

Je voudrais utiliser le module de journalisation python pour enregistrer toutes les sorties de unittest afin de pouvoir l'incorporer dans un framework de test que j'essaie d'écrire. Le but de ceci est d'exécuter les tests avec 2 ensembles de sortie, un avec une sortie simple qui indique les étapes du cas de test et une sortie de niveau plus debug afin que lorsque les choses tournent mal, nous avons autant d'informations que possible. La sortie serait placée dans deux fichiers, un que je pourrais envoyer par courrier électronique aux gens, et un autre gardé en cas d'échecs. J'ai remarqué que TextTestRunner peut utiliser un flux, cela pourrait-il être utilisé avec le module de journalisation? Je prévois d'utiliser certaines des nouvelles fonctionnalités de python 2.7.Comment utiliser le module de journalisation en python avec le module unittest?

Répondre

1

Vous pourriez, mais je ne suis pas sûr que ce soit votre meilleure approche.

Pour cette approche, vous devez:

  1. instancier un flux en mémoire qui peut être utilisé par TextTestRunner. C'est le genre de chose qui serait presque parfait pour io.StringIO, sauf que cela fonctionne uniquement avec l'entrée Unicode, et je ne suis pas sûr que TextTestRunner écrit Unicode correctement dans le flux. Votre autre option serait de coder votre propre flux en mémoire qui remplit votre rôle, peut-être en enveloppant StringIO avec un encodeur.

  2. Créez votre propre TextTestRunner et initialisez-le avec ce flux en mémoire.

  3. Créez une classe qui lit le flux et l'écrit dans le journal.

Cela pourrait être aussi simple que:

class StreamLogger(object): 
    def __init__(self, input_stream, output_logger): 
     self.input_stream = input_stream 
     self.output_logger 
    def run(self): 
     while True: 
      line = input_stream.readline() 
      if not line: 
       break 
      output_logger.error(line) 

problèmes avec cette approche:

  • Vous n'avez pas beaucoup si une certaine flexibilité pour diriger les différentes parties de sortie TextTestRunner à différents niveaux de journalisation. TextTestRunner, s'il est mal configuré, écrira un tas de choses que vous ne voulez probablement pas. La verbosité par défaut est 1, ce qui écrira des points de progrès pendant que vous testez ... ce qui ne vous gênera probablement pas dans la sortie de journalisation.
  • Si vous le faites naïvement, vous appelez stream_logger.run() uniquement après avoir écrit toutes vos sorties dans le flux. Ainsi, vous n'obtiendrez pas votre sortie de journalisation en temps réel, et vos horodatages de journalisation seront inutiles. Vous pouvez résoudre ce problème en générant un thread séparé pour la lecture, par exemple, mais vous devez alors choisir/lancer un flux capable de gérer un thread de lecture et d'écriture simultanément, ou un fork et un flux in-memory ou quelque chose de relativement compliqué.

L'approche que je vous suggère est au lieu de renoncer à des flux et simplement rouler votre propre lanceur de test - appelé, par exemple, LoggingTestRunner - qui écrit la sortie de test à l'enregistreur précisément la façon dont vous voulez sortie. Cela vous permettra d'éviter ces trois problèmes.

+0

Merci. Cela ressemble à ce que je dois faire de toute façon pour le reste des choses que je dois faire. – user197674

Questions connexes