2011-02-22 5 views

답변

12

당신은 로깅을 통해 전송되는 메시지를 확인 할 수있는 사용자 정의 핸들러를 만들 수 있습니다. BufferingHandler은이 작업에 가장 적합합니다. 같은 logging.getLogger('foo').addHandler(...)으로 당신은 또한 당신의 코드에서 사용중인 모든 로거에 테스트 핸들러를 첨부 할 수 있습니다

. 결국 테스트 케이스의 setUptearDown 메소드에 핸들러를 첨부 할 수 있습니다.

import logging 
import logging.handlers 

class AssertingHandler(logging.handlers.BufferingHandler): 

    def __init__(self,capacity): 
     logging.handlers.BufferingHandler.__init__(self,capacity) 

    def assert_logged(self,test_case,msg): 
     for record in self.buffer: 
      s = self.format(record) 
      if s == msg: 
       return 
     test_case.assertTrue(False, "Failed to find log message: " + msg) 


def cook_eggs(): 
    logging.warn("eggs are ready!") 


import unittest 

class TestLogging(unittest.TestCase): 

    def test(self): 
     asserting_handler = AssertingHandler(10) 
     logging.getLogger().addHandler(asserting_handler) 
     cook_eggs() 
     asserting_handler.assert_logged(self,"eggs are ready!") 
     logging.getLogger().removeHandler(asserting_handler) 


unittest.main() 
2

이 "모의 객체는"위한 것입니다. 나중에 그들에 대한 주장을 할 수 있도록

당신은 제대로 로그 메시지를 버퍼링 할 로그의 모의 버전을 사용할 수 있습니다.

+0

괜찮습니까? 그렇다면 어떻게'logging' 모듈을 올바르게 모의 할 수 있을까요? 예를 들어,'logging.warn (...)'과'logging.getLogger ("foo"). warn (...)'호출을 모의하고 싶습니다. –

+0

는 (분명히 나는 ​​코드의 각각의 비트가 로거에 대한 참조를 잡는 위치를 다음 알아낼 해당 참조를 오버라이드 (override) ...하지만 간단한 방법이 바라고 있습니다) –

+0

@ 데이비드 Wolever가. 모의'logging' - 모듈. 관련 API가있는 클래스의 객체 (getLogger 및 일부 모의 Logger 클래스)로 바꿉니다. 이 문제를 해결할 수있는 도구가 있습니다. http://www.voidspace.org.uk/python/mock/. –

0

데이터 래드 프로젝트에서 우리는 비슷한 기능이 필요했지만 로그를 삼킨 (그리고 아마도 인트로 스펙트 일 수도 있습니다). https://github.com/datalad/datalad/blob/master/datalad/utils.py#L296 (현재 b633c9da46ab9cccde3d4767928d167a91857153에서) : swallow_logs의 문맥 처리기 - 그래서 여기에 솔루션을했다. 이제 테스트에서 우리는 똑같이 할 것입니다.

def test_swallow_logs(): 
    lgr = logging.getLogger('datalad') 
    with swallow_logs(new_level=9) as cm: 
     eq_(cm.out, '') 
     lgr.log(8, "very heavy debug") 
     eq_(cm.out, '') # not even visible at level 9 
     lgr.log(9, "debug1") 
     eq_(cm.out, 'debug1\n') # not even visible at level 9 
     lgr.info("info") 
     eq_(cm.out, 'debug1\ninfo\n') # not even visible at level 9 
관련 문제