我正在使用python logging module记录到控制台和文本文件。我正在使用HTMLTestRunner登录html文件。我猜我正在使用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。对于HTML运行程序,我正在使用import HTMLTestRunner
为了在控制台上打印语句,我使用了logging.infologging.debug。如果我使用python print使用print语句,那么我既不会在控制台中也不会在日志中获得此输出。但是对于HTML日志记录,我只有print语句和stderr

我的查询:某种程度上HTMLTestRunner.HTMLTestRunner是否会有使用logging.debuglogging.info打印在控制台上的语句

最佳答案

您当前使用的 HTMLTestRunner 模块大约有6年的历史,并且已严重过时。有更好的选择-从 html-testRunner 开始,甚至更好的选择-启用了HTML reporting pluginpytest

但是,如果您准备修补/更改HTMLTestRunner实现,则需要执行以下操作以使日志工作和报告中显示的消息生效(这只是其中一种方法):

  • logger类构造函数添加新的HTMLTestRunner参数,并将新的处理程序附加到记录器:
    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_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占位符:
    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

  • 现在,例如,如果您有这种测试,并带有一个logger实例在测试中写入日志消息,则可以将记录器传递到HTMLTestRunner中,然后将日志消息转储到报告中:
    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的内容:

    python - python中的HTML记录器-LMLPHP

    关于python - python中的HTML记录器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47924507/

    10-12 19:35