python中的HTML记录器

Nit*_*esh 5 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)
Run Code Online (Sandbox Code Playgroud)

编辑:我正在使用import unittest,我正在使用日志import logging.对于我正在使用的HTML runnerimport HTMLTestRunner

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

我的问题:是否有 HTMLTestRunner.HTMLTestRunner某些语句将使用logging.debug和打印在控制台上logging.info

ale*_*cxe 7

HTMLTestRunner您目前使用的模块大约有6年的历史,并且严重过时.有更好的选择-从开始html-testRunner或者,甚至更好的一个- pytestHTML报告插件启用.

但是,如果您准备修补/更改HTMLTestRunner实现,那么我们需要做的是使报告工作和消息显示在报告中(这只是一种方法):

  • loggerHTMLTestRunner类构造函数添加一个新参数,并将新处理程序附加到记录器:

    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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 编辑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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 更改_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 ""
    )
    
    Run Code Online (Sandbox Code Playgroud)
  • 别忘了 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)
Run Code Online (Sandbox Code Playgroud)

report.html运行测试后的内容:

在此输入图像描述