2010-07-27 19 views
8

Vorrei utilizzare il modulo di registrazione python per registrare tutto l'output da unittest in modo da poterlo incorporare in un framework di testing che sto tentando di scrivere. L'obiettivo è di eseguire i test con 2 set di output, uno con output semplice che indica le fasi del test case e un output di livello di debug in più in modo che quando le cose vanno male abbiamo più informazioni possibili. L'output verrebbe inserito in due file, uno che potrei inviare via email alle persone e un altro in caso di guasti. Ho notato che TextTestRunner può utilizzare un flusso, potrebbe essere utilizzato con il modulo di registrazione? Sto pensando di utilizzare alcune delle nuove funzionalità di python 2.7.Come si può usare il modulo di registrazione in python con il modulo unittest?

risposta

1

Si potrebbe, ma non sono sicuro che sia il tuo approccio migliore.

Per questo approccio, si farebbe:

  1. istanziare un flusso in memoria che può essere utilizzato da TextTestRunner. Questo è il genere di cosa per cui io.StringIO sarebbe quasi perfetto, tranne che funziona solo con l'input Unicode e non sono sicuro che TextTestRunner scriva correttamente Unicode nello stream. La tua altra opzione sarebbe quella di codificare il tuo flusso in memoria che serve al tuo scopo, magari avvolgendo StringIO con un codificatore.

  2. Crea il tuo TextTestRunner e inizializzalo con questo flusso in memoria.

  3. Creare una classe che legge dallo stream e la scrive nel registro.

Questo potrebbe essere semplice come:

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) 

problemi con questo approccio:

  • Non è molto se qualsiasi flessibilità nel dirigere diverse parti uscita TextTestRunner a diversi livelli di log.
  • TextTestRunner, se configurato in modo errato, scriverà un mucchio di cose che probabilmente non si desidera. La verbosità di default è 1, che scriverà punti di progresso mentre stai provando ... il che probabilmente si intrometterà nell'output di logging.
  • Se si esegue questa operazione in modo ingenuo, si chiamerà stream_logger.run() solo dopo aver scritto tutto l'output nello stream. Pertanto, non si otterrà l'output di registrazione in tempo reale e la data/ora di registrazione sarà inutile. Potresti risolvere questo problema creando un thread separato per la lettura, ad esempio, ma poi dovresti scegliere/rollare un flusso in grado di gestire un thread reader e writer che funzioni simultaneamente, o forgiare un processo e abbandonare il flusso in memoria, o qualcosa di relativamente complicato.

L'approccio che suggerirei invece è quello di rinunciare a corsi d'acqua e semplicemente rotolare il proprio test di runner - chiamato, per esempio, LoggingTestRunner - che scrive l'uscita di test allo strumento esattamente il modo in cui si desidera uscita. Questo ti permetterà di evitare tutti e tre questi problemi.

+0

Grazie. Sembra proprio quello che devo fare comunque per il resto delle cose che devo fare. – user197674

Problemi correlati