2012-03-02 26 views
11

Mam test Pythona, w którym chcę przetestować, czy rejestrowanie działa poprawnie. Na przykład mam funkcję, która tworzy użytkownika, a na koniec rejestracja zapisuje do pliku log odpowiedzi.Logowanie w języku Python do obsługi 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') 

W moim przypadku testowym chcę wysłać wyjście dziennika do 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() 

Problemem jest to, że nie jestem pewien, w jaki sposób należy przetestować wheter lub nie moja rejestrator pracuje.

+1

Niestety, może to być po prostu poza mną, ale nie byłoby po prostu zrobić 'stream.getvalue()'? – macduff

+0

related: [PyDev unittesting: Jak przechwytywać tekst zalogowany do logowania. Logger w "Captured Output"] (http://stackoverflow.com/q/7472863/321973) –

Odpowiedz

18

Oto przykład, który działa, upewnij się, że ustawiłeś poziom swojego logu i czyścisz bufor.

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() 

Dalsze czytanie, tutaj jest przykładem Temporily Capturing Python Logging to a string buffer które pokazują w jaki sposób można to zrobić również formatowanie.

Powiązane problemy