python中的HTML记录器

时间:2017-12-21 11:57:29

标签: python logging

我正在使用python logging module来记录控制台和文本文件。我正在使用HTMLTestRunner来登录html文件。我想我正在使用HTMLTestRunner 0.8.0

但问题是HTMLTestRunner仅打印print个语句,而日志记录模块不打印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 runner,我使用的是import HTMLTestRunner

要在控制台上打印语句,我使用的是logging.infologging.debug。如果我使用python print使用print语句,那么我既不会在控制台中也不会在日志中获得此输出。但对于HTML日志记录,我只有print个语句和stderr

我的查询:是否有HTMLTestRunner.HTMLTestRunner将使用logging.debuglogging.info和/ {p>打印在控制台上的语句

1 个答案:

答案 0 :(得分:7)

您目前使用的HTMLTestRunner模块大约有6年的历史,并且严重过时了。还有更好的选择 - 从html-testRunner开始,或者更好的选项 - pytest启用HTML reporting plugin

但是,如果您准备修补/更改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的内容:

enter image description here