2017-12-21 47 views
5

में एचटीएमएल लॉगर मैं कंसोल और टेक्स्ट फ़ाइल में लॉग इन करने के लिए पाइथन logging module का उपयोग कर रहा हूं। मैं HTML फ़ाइल में लॉग इन करने के लिए HTMLTestRunner का उपयोग कर रहा हूं। मुझे लगता है कि मैं HTMLTestRunner का उपयोग कर रहा हूं 0.8.0पाइथन

हालांकि समस्या यह है कि HTMLTestRunner प्रिंट केवल print कथन और लॉगिंग मॉड्यूल प्रिंट स्टेटमेंट प्रिंट नहीं करता है। वहाँ किसी भी तरह से मैं html फ़ाइल

नीचे अंदर प्रवेश बयान प्राप्त कर सकते हैं htmlrunner कोड

runner = HTMLTestRunner.HTMLTestRunner(
       stream=outfile, 
       title='Test Report', 
       description='Regression Test Suite', 
       verbosity=3 
       ) 
result = runner.run(suite) 

है संपादित: मैं import unittest उपयोग कर रहा हूँ, और प्रवेश के लिए मैं import logging उपयोग कर रहा हूँ। एचटीएमएल रनर के लिए मैं import HTMLTestRunner

कंसोल पर प्रिंटिंग स्टेटमेंट के लिए उपयोग कर रहा हूं, मैं logging.info और logging.debug का उपयोग कर रहा हूं। अगर मैं पाइथन print का उपयोग कर प्रिंट स्टेटमेंट का उपयोग करता हूं, तो मुझे न तो यह आउटपुट कंसोल में और न ही लॉग में मिल रहा है। लेकिन एचटीएमएल लॉगिंग के लिए, मेरे पास केवल print कथन और stderr है।

मेरे प्रश्न: वहाँ किसी न किसी प्रकार है कि HTMLTestRunner.HTMLTestRunner बयान जो सांत्वना logging.debug और logging.info

+3

मैं मदद करने की कोशिश करने में खुशी होगी, लेकिन मुझे नहीं पता आगे बढ़ने के लिए पर्याप्त जानकारी देखें। आप किस HTML उपयोग कर रहे हैं: https://pypi.python.org/pypi/HTMLTestRunner, या https://pypi.python.org/pypi/html-testRunner/, या कुछ और? लॉगर कथन के उदाहरण के साथ, आप 'HTMLTestRunner' से क्या देखना चाहते हैं, और वास्तव में जो देखते हैं, उसके साथ हमें एक उदाहरण स्थिरता दिखाएं। –

+1

@JimDeLaHunt: मैंने सवाल संपादित किया है। अगर मुझे अभी भी अस्पष्ट है तो कृपया मुझे बताएं – Nitesh

+0

अतिरिक्त विवरण मदद करता है। लेकिन कृपया वास्तविक लॉगिंग और 'प्रिंट' कथन के साथ हमें एक वास्तविक परीक्षण केस भी दिखाएं। हमें आपके द्वारा प्राप्त आउटपुट दिखाएं, और आउटपुट जो आप उम्मीद करते हैं। –

उत्तर

5

HTMLTestRunner मॉड्यूल कि आप वर्तमान में उपयोग कर रहे हैं के बारे में 6 साल पुराना है और गंभीरता से पुराना हो चुका है के प्रयोग पर मुद्रित कर रहे हैं होगा। सक्षम के साथ html-testRunner या यहां तक ​​कि एक बेहतर एक - pytest से बेहतर विकल्प हैं।

:

लेकिन, यदि आप पैच करने के लिए तैयार कर रहे हैं/HTMLTestRunner कार्यान्वयन को बदलने, यहाँ हम लॉगिंग काम करते हैं और रिपोर्ट में प्रदर्शित संदेशों बनाने के लिए (यह यह करने के लिए सिर्फ एक ही रास्ता है) क्या करने की जरूरत है

  • HTMLTestRunner वर्ग निर्माता के लिए एक नया logger तर्क जोड़ सकते हैं और लकड़हारा के लिए एक नया हैंडलर देते हैं:

    class HTMLTestRunner(Template_mixin): 
        def __init__(self, stream=sys.stdout, verbosity=1, title=None, description=None, logger=None): # CHANGE HERE 
         # ... 
    
         # CHANGE BELOW 
         self.log_capture = None 
         if logger: 
          self.log_capture = StringIO.StringIO() 
    
          ch = logging.StreamHandler(self.log_capture) 
          ch.setLevel(logging.DEBUG) 
    
          formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
          ch.setFormatter(formatter) 
    
          logger.addHandler(ch) 
    
  • संपादित HEADING_TMPL टेम्पलेट और लॉगिंग संदेश के लिए एक प्लेसहोल्डर जोड़ने रों:

    heading = self.HEADING_TMPL % dict(
        title = saxutils.escape(self.title), 
        parameters = ''.join(a_lines), 
        description = saxutils.escape(self.description), 
        logs='<br>'.join(self.log_capture.getvalue().split("\n")) if self.log_capture else "" 
    ) 
    
  • भूल नहीं import logging

अब, अगर आपके पास, उदाहरण के लिए:

HEADING_TMPL = """<div class='heading'> 
<h1>%(title)s</h1> 
%(parameters)s 
<p class='description'>%(description)s</p> 
Logging output: 
<p class='logs'>%(logs)s</p> 
</div> 
""" # variables: (title, parameters, description) 
  • परिवर्तन _generate_heading() विधि और logs प्लेसहोल्डर भरें , परीक्षणों में logger उदाहरण लेखन लॉग संदेश के साथ इस प्रकार का परीक्षण, आपमें लॉगर पास कर सकते हैंजो तब रिपोर्ट में लॉग संदेशों डंप होगा: परीक्षण चलाने के बाद

    import logging 
    import unittest 
    
    import HTMLTestRunner 
    
    logger = logging.getLogger() 
    logger.setLevel(logging.DEBUG) 
    
    
    class BasicTestCase(unittest.TestCase): 
        def test_one(self): 
         logger.info('Test message 1!') 
         self.assertEqual(1, 1) 
    
        def test_two(self): 
         """Extended description""" 
         logger.error('Test message 1!') 
         self.assertEqual(2, 2) 
    
    
    if __name__ == '__main__': 
        import sys 
        logging.basicConfig(stream=sys.stderr) 
    
        with open('report.html', 'w') as report_file: 
         runner = HTMLTestRunner.HTMLTestRunner(
          stream=report_file, 
          title='Test Report', 
          description='Regression Test Suite', 
          verbosity=3, 
          logger=logger 
         ) 
    
         suite = unittest.TestLoader().loadTestsFromTestCase(BasicTestCase) 
    
         result = runner.run(suite) 
         print(result) 
    

    report.html की सामग्री:

    enter image description here

  • +0

    मैंने आपके समाधान की कोशिश की है। लेकिन सभी लॉगिंग जानकारी आउटपुट तालिका के बाहर मुद्रित हो रहा है। आपके मामले में भी, आपके पास 2 टेस्ट केस हैं लेकिन लॉगिंग जानकारी तालिका के शीर्ष पर मुद्रित हो रही है। तालिका में संबंधित परीक्षण मामले के logging.info प्राप्त करना संभव है। उदाहरण: यदि मैं BasicTestCase के विवरण पर क्लिक करता हूं, तो परीक्षण केस 1 से संबंधित लॉगिंग जानकारी टेस्टकेस 1 विवरण में प्रदर्शित की जानी चाहिए। परीक्षण मामले -2 के लिए भी वही। क्या यह संभव है – Nitesh

    +0

    @ नीतेश हाँ, इसे नमूना उद्देश्यों के लिए शीर्षलेख में रखें। तालिका पंक्तियों में लॉग इन करने के लिए, आपको पहले लॉग इन करने की अनुमति देने के लिए ['REPORT_CLASS_TMPL' टेम्पलेट] (https://github.com/tungwaiyip/HTMLTestRunner/blob/master/HTMLTestRunner.py#L462) संशोधित करना चाहिए एक टेबल पंक्ति - आपको लॉग के लिए प्लेसहोल्डर की आवश्यकता होगी। फिर, आपको प्लेसहोल्डर [यहां] भरना होगा (https://github.com/tungwaiyip/HTMLTestRunner/blob/master/HTMLTestRunner.py#L740)। ठीक है, लेकिन यह सिर्फ एक तैयारी कदम है। – alecxe

    +0

    @ नीतेश, तो आपको प्रति परीक्षण विधि समूह लॉगिंग संदेशों को समूहबद्ध करने का एक तरीका पता लगाना होगा। आप शायद लॉग संदेश स्ट्रिंग्स का निर्माण कर सकते हैं ताकि उनमें एक टेस्ट विधि नाम हो - [यह धागा] देखें (https://stackoverflow.com/q/10973362/771848)। फिर, आपको 'self.log_capture.getvalue() के विभाजन की आवश्यकता होगी। विभाजित ("\ n") 'प्रति परीक्षण विधि को पार्स और समूहीकृत किया जाना चाहिए।मुझे उम्मीद है कि आप मेरी सोच को यहां समझ सकते हैं। मेरा सुझाव है कि यदि आप इस विचार को लागू करने में मदद की ज़रूरत है तो आप SO पर एक नया विषय शुरू करें। उस ने कहा, फिर, एक और आधुनिक संवाददाता में स्विच करना आसान होगा। धन्यवाद। – alecxe