2017-12-21 138 views
5

Tôi đang sử dụng python logging module để ghi nhật ký vào bảng điều khiển và tệp văn bản. Tôi đang sử dụng HTMLTestRunner để đăng nhập vào tệp html. Tôi đoán tôi đang sử dụng HTMLTestRunner 0.8.0Trình ghi HTML trong python

Tuy nhiên, vấn đề là HTMLTestRunner chỉ in các câu lệnh print và mô-đun ghi nhật ký không in báo cáo in. Có cách nào tôi có thể nhận tuyên bố khai thác gỗ bên trong tập tin html

Dưới đây là đoạn code htmlrunner

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

được sửa đổi: Tôi đang sử dụng import unittest, và cho khai thác gỗ Tôi đang sử dụng import logging. Đối với người chạy HTML Tôi đang sử dụng import HTMLTestRunner

Để in báo cáo trên bảng điều khiển, tôi đang sử dụng logging.infologging.debug. Nếu tôi sử dụng lệnh in bằng cách sử dụng python print, thì tôi không nhận được kết quả đầu ra này trong bảng điều khiển cũng như trong nhật ký. Nhưng đối với việc ghi nhật ký HTML, tôi chỉ có các tuyên bố printstderr.

truy vấn của tôi: Có cách nọ cách kia mà HTMLTestRunner.HTMLTestRunner sẽ có báo cáo được in trên giao diện điều khiển sử dụng logging.debuglogging.info

+3

Tôi rất muốn cố gắng để giúp đỡ, nhưng tôi không xem đủ thông tin để tiếp tục. Bạn đang sử dụng 'HTMLTestRunner' nào: https://pypi.python.org/pypi/HTMLTestRunner hoặc https://pypi.python.org/pypi/html-testRunner/ hoặc cái gì khác? Hiển thị cho chúng tôi một ví dụ về lịch thi đấu, với ví dụ về các câu lệnh logger, những gì bạn muốn xem từ 'HTMLTestRunner' và những gì bạn thực sự thấy. –

+1

@JimDeLaHunt: Tôi đã chỉnh sửa câu hỏi. Vui lòng cho tôi biết nếu nó vẫn chưa rõ ràng – Nitesh

+0

Chi tiết bổ sung sẽ giúp bạn. Nhưng vui lòng cho chúng tôi biết một trường hợp thử nghiệm thực tế, với ghi nhật ký thực tế và các câu lệnh 'in'. Hiển thị cho chúng tôi kết quả bạn nhận được và kết quả đầu ra bạn mong đợi. –

Trả lời

5

Các HTMLTestRunner mô-đun mà bạn đang sử dụng là khoảng 6 tuổi và là nghiêm túc hết hiệu lực. Có các tùy chọn tốt hơn - bắt đầu từ số html-testRunner hoặc thậm chí tốt hơn - pytest với kích hoạt HTML reporting plugin.

Nhưng, nếu bạn đã sẵn sàng để vá/thay đổi việc thực hiện HTMLTestRunner, đây là những gì chúng ta cần phải làm gì để thực hiện các công việc khai thác gỗ và các thông điệp hiển thị trong báo cáo (điều này chỉ là một cách để làm điều đó):

  • thêm một logger luận mới cho các nhà xây dựng lớp HTMLTestRunner và đính kèm một handler mới cho 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) 
    
  • chỉnh sửa các HEADING_TMPL mẫu và thêm một giữ chỗ cho thông điệp logging s:

    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) 
    
  • thay đổi phương pháp _generate_heading() và điền thông tin vào logs giữ chỗ:

    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 "" 
    ) 
    
  • đừng quên các import logging

Bây giờ, nếu bạn có, ví dụ , loại thử nghiệm này với một ví dụ logger viết thông điệp tường trình trong các thử nghiệm, bạn có thể chuyển logger vào HTMLTestRunner mà sau đó sẽ đổ những thông điệp ghi vào báo cáo:

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) 

Nội dung của report.html sau khi chạy thử nghiệm:

enter image description here

+0

Tôi đã thử giải pháp của bạn nó đã làm việc. Nhưng tất cả các thông tin đăng nhập đầu ra là nhận được in bên ngoài bảng. Giống như trong trường hợp của bạn quá, bạn có 2 trường hợp kiểm tra nhưng thông tin đăng nhập được in ở đầu bảng. Có thể lấy log.info của trường hợp thử nghiệm tương ứng trong bảng. Ví dụ: nếu tôi nhấp vào chi tiết của basicTestCase, thì thông tin đăng nhập liên quan đến trường hợp kiểm tra 1 sẽ được hiển thị trong chi tiết testcase1. tương tự cho trường hợp thử nghiệm-2. Có thể – Nitesh

+0

@Nitesh yeah, đặt nó vào tiêu đề cho mục đích mẫu. Để có nhật ký trong các hàng của bảng, trước hết bạn phải sửa đổi ['REPORT_CLASS_TMPL' mẫu] (https://github.com/tungwaiyip/HTMLTestRunner/blob/master/HTMLTestRunner.py#L462) để cho phép các bản ghi được ghi vào một hàng bảng - bạn sẽ cần một trình giữ chỗ cho các bản ghi. Sau đó, bạn sẽ cần điền vào trình giữ chỗ [tại đây] (https://github.com/tungwaiyip/HTMLTestRunner/blob/master/HTMLTestRunner.py#L740). Được rồi, nhưng đó chỉ là một bước chuẩn bị. – alecxe

+0

@Nitesh sau đó, bạn sẽ cần phải tìm ra một cách để nhóm tin nhắn đăng nhập cho mỗi phương pháp thử nghiệm. Bạn có thể có thể xây dựng chuỗi thông điệp tường trình để chúng chứa tên phương thức thử - hãy kiểm tra [chủ đề này] (https://stackoverflow.com/q/10973362/771848). Sau đó, bạn sẽ cần đầu ra của 'self.log_capture.getvalue(). Split (" \ n ")' để được phân tích cú pháp và nhóm lại cho mỗi phương thức thử nghiệm.Tôi hy vọng bạn có thể hiểu suy nghĩ của tôi ở đây. Tôi đề nghị bạn nên bắt đầu một chủ đề mới về SO nếu bạn cần trợ giúp với việc thực hiện ý tưởng. Điều đó nói rằng, một lần nữa, chuyển sang một phóng viên hiện đại hơn sẽ dễ dàng hơn. Cảm ơn. – alecxe

Các vấn đề liên quan