2012-03-02 4 views
11

Ho un test python in cui voglio testare se la registrazione funziona correttamente. Ad esempio, ho una funzione che crea un utente e alla fine la registrazione scrive per registrare il file della risposta.Connessione Python al gestore StringIO

logger = logging.getLogger('mylogger') 
logger.setLevel(logging.DEBUG) 
handler = logging.handlers.WatchedFileHandler('mylogfile.log') 
formatter = logging.Formatter('%(asctime)s: %(message)s', 
           '%d/%b/%Y:%H:%M:%S %z') 
handler.setFormatter(formatter) 
logger.addHandler(handler) 
logger.info('Some log text') 

Nel mio caso di test voglio inviare l'output del registro a StringIO.

class MyTest(unittest.TestCase): 
    def setUp(self): 
     stream = StringIO() 
     self.handler = logging.StreamHandler(stream) 
     log = logging.getLogger('mylogger') 
     log.removeHandler(log.handlers[0]) 
     log.addHandler(self.handler) 

    def tearDown(self): 
     log = logging.getLogger('mylogger') 
     log.removeHandler(self.handler) 
     self.handler.close() 

Il problema è che non sono sicuro di come dovrei eseguire il test se il mio registratore funziona.

+1

spiace, ma questo potrebbe essere solo al di là di me, ma non ti basta fare 'stream.getvalue()'? – macduff

+0

related: [PyDev unittesting: come catturare il testo registrato su un logging.Logger in "Captured Output"] (http://stackoverflow.com/q/7472863/321973) –

risposta

18

Ecco un esempio che funziona, assicurarsi di impostare il livello del registro e svuotare il buffer.

class MyTest(unittest.TestCase): 
    def setUp(self): 
     self.stream = StringIO() 
     self.handler = logging.StreamHandler(self.stream) 
     self.log = logging.getLogger('mylogger') 
     self.log.setLevel(logging.INFO) 
     for handler in self.log.handlers: 
      self.log.removeHandler(handler) 
     self.log.addHandler(self.handler) 
    def testLog(self): 
     self.log.info("test") 
     self.handler.flush() 
     print '[', self.stream.getvalue(), ']' 
     self.assertTrue(self.stream.getvalue(), 'test') 

    def tearDown(self): 
     self.log.removeHandler(self.handler) 
     self.handler.close() 

if __name__=='__main__': 
    unittest.main() 

Ulteriore lettura, ecco un esempio Temporily Capturing Python Logging to a string buffer che illustrano come si potrebbe anche fare la formattazione.