【问题标题】:HTML Logger in pythonpython中的HTML记录器
【发布时间】:2017-12-21 11:57:29
【问题描述】:

我正在使用 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 使用打印语句,那么我既不会在控制台中也不会在日志中获得此输出。但是对于 HTML 日志记录,我只有 print 语句和 stderr

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

【问题讨论】:

  • 我很想提供帮助,但我没有看到足够的信息继续下去。您使用的是哪个HTMLTestRunnerpypi.python.org/pypi/HTMLTestRunner,或pypi.python.org/pypi/html-testRunner,还是其他?向我们展示一个示例夹具,其中包含记录器语句的示例,您希望从 HTMLTestRunner 看到的内容以及您实际看到的内容。
  • @JimDeLaHunt:我已经编辑了这个问题。如果还不清楚,请告诉我
  • 额外的细节会有所帮助。但也请向我们展示一个实际的测试用例,带有实际的日志记录和print 语句。向我们展示您获得的输出以及您期望的输出。
  • "print statements" 没有做任何特别的事情。他们只是写到标准输出。您想要的是添加一个logging 处理程序,以便它在标准输出上打印所有内容(您可能不想在程序正常执行期间启用它,只是测试)

标签: python logging


【解决方案1】:

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

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

【讨论】:

  • 我试过你的解决方案,它有效。但是所有的日志信息输出都打印在表格之外。就像你的情况一样,你有 2 个测试用例,但日志信息打印在表格的顶部。是否可以在表中获取各个测试用例的 logging.info。示例:如果我单击 basicTestCase 的详细信息,则与测试用例 1 相关的日志记录信息应显示在 testcase1 详细信息中。测试用例 2 相同。有没有可能
  • @Nitesh 是的,将其放入标题中以用于示例目的。要将日志记录在表行中,您首先应该修改REPORT_CLASS_TMPL template 以允许将日志写入表行 - 您需要日志占位符。然后,您需要填写占位符here。好的,但这只是一个准备步骤。
  • @Nitesh 那么,您需要找到一种方法来对每个测试方法的日志消息进行分组。您可能可以构造日志消息字符串,以便它们包含测试方法名称 - 查看this thread。然后,您需要根据测试方法对 self.log_capture.getvalue().split("\n") 的输出进行解析和分组。我希望你能在这里理解我的想法。如果您在实施这个想法方面需要帮助,我建议您开始一个关于 SO 的新主题。也就是说,再次切换到更现代的记者会更容易。谢谢。
猜你喜欢
  • 2011-02-28
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多