我正在使用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.info
和logging.debug
。如果我使用python print
使用print语句,那么我既不会在控制台中也不会在日志中获得此输出。但对于HTML日志记录,我只有print
个语句和stderr
。
我的查询:是否有HTMLTestRunner.HTMLTestRunner
将使用logging.debug
和logging.info
和/ {p>打印在控制台上的语句
答案 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
的内容: