캡처 및 nose
와 함께 기록 메시지에 대한 주장을 만드는 간단한 방법이 있나요?Python + nose : 로그 된 텍스트에 대한 어설 션을 하시겠습니까?
예를 들어, 내가 좋아하는 뭔가를 할 수 있도록하고 싶습니다 :
cook_eggs()
assert_logged("eggs are ready!")
캡처 및 nose
와 함께 기록 메시지에 대한 주장을 만드는 간단한 방법이 있나요?Python + nose : 로그 된 텍스트에 대한 어설 션을 하시겠습니까?
예를 들어, 내가 좋아하는 뭔가를 할 수 있도록하고 싶습니다 :
cook_eggs()
assert_logged("eggs are ready!")
당신은 로깅을 통해 전송되는 메시지를 확인 할 수있는 사용자 정의 핸들러를 만들 수 있습니다. BufferingHandler은이 작업에 가장 적합합니다. 같은 logging.getLogger('foo').addHandler(...)
으로 당신은 또한 당신의 코드에서 사용중인 모든 로거에 테스트 핸들러를 첨부 할 수 있습니다
. 결국 테스트 케이스의 setUp
및 tearDown
메소드에 핸들러를 첨부 할 수 있습니다.
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()
이 "모의 객체는"위한 것입니다. 나중에 그들에 대한 주장을 할 수 있도록
당신은 제대로 로그 메시지를 버퍼링 할 로그의 모의 버전을 사용할 수 있습니다.
데이터 래드 프로젝트에서 우리는 비슷한 기능이 필요했지만 로그를 삼킨 (그리고 아마도 인트로 스펙트 일 수도 있습니다). 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
괜찮습니까? 그렇다면 어떻게'logging' 모듈을 올바르게 모의 할 수 있을까요? 예를 들어,'logging.warn (...)'과'logging.getLogger ("foo"). warn (...)'호출을 모의하고 싶습니다. –
는 (분명히 나는 코드의 각각의 비트가 로거에 대한 참조를 잡는 위치를 다음 알아낼 해당 참조를 오버라이드 (override) ...하지만 간단한 방법이 바라고 있습니다) –
@ 데이비드 Wolever가. 모의'logging' - 모듈. 관련 API가있는 클래스의 객체 (getLogger 및 일부 모의 Logger 클래스)로 바꿉니다. 이 문제를 해결할 수있는 도구가 있습니다. http://www.voidspace.org.uk/python/mock/. –