2011-02-22 9 views
6

nose के साथ लॉग इन संदेशों के बारे में कैप्चरिंग और दावा करने का कोई आसान तरीका है?पायथन + नाक: लॉग टेक्स्ट के बारे में दावा करें?

उदाहरण के लिए, मैं की तरह कुछ करने में सक्षम होना चाहते हैं:

cook_eggs() 
assert_logged("eggs are ready!") 

उत्तर

12

आप एक कस्टम हैंडलर बना सकते हैं जो लॉगिंग के माध्यम से भेजे जा रहे संदेश की जांच कर सकता है। 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() 
2

यह है कि क्या "नकली वस्तुओं" के लिए कर रहे हैं।

आप लॉगिंग के एक नकली संस्करण का उपयोग कर सकते हैं जो लॉग संदेशों को सही तरीके से बफर करेगा ताकि आप बाद में उनके बारे में दावा कर सकें।

+0

ठीक है, तो मैं सही ढंग से 'लॉगिंग' मॉड्यूल का नकल कैसे करूं? मैं कॉल करना चाहता हूं, उदाहरण के लिए, 'logging.warn (...)' और 'logging.getLogger ("foo") चेतावनी दें (...) '? –

+0

(जाहिर है, मैं यह पता लगा सकता हूं कि प्रत्येक व्यक्तिगत कोड कोड लॉगर के संदर्भ को पकड़ रहा है, फिर उस संदर्भ को ओवरराइड करें ... लेकिन मुझे उम्मीद है कि एक आसान तरीका है) –

+0

@ डेविड वोलेवर। मॉक 'लॉगिंग' - मॉड्यूल। इसे उस वर्ग की ऑब्जेक्ट के साथ बदलें जिसमें प्रासंगिक API - 'getLogger' और कुछ नकली 'लॉगर' क्लास है। इसके साथ मदद करने के लिए उपकरण हैं। http://www.voidspace.org.uk/python/mock/। –

0

बस Fwiw, datalad परियोजना में हम इसी तरह की सुविधा की जरूरत है लेकिन यह भी सिर्फ लॉग निगल करने के लिए (और संभवतः आत्मनिरीक्षण)। तो यहां समाधान आया - swallow_logs संदर्भ हैंडलर: https://github.com/datalad/datalad/blob/master/datalad/utils.py#L296 (वर्तमान में b633c9da46ab9cccde3d4767928d167a91857153 पर)। तो अब परीक्षण में हम

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 
संबंधित मुद्दे