python - 如何使用日志记录模块将 Python 的单元测试模块错误回溯重定向到日志文件?
问题描述
我有一个 python 测试脚本,我正在尝试将其输出(stdout 和 stderr)都重定向到控制台和日志文件。脚本在控制台中产生以下输出,这是我想要的。
test_valid_timerange (testapp.TestApp) ... FAIL
test_has_dashboard_description (testapp.TestApp) ... ok
======================================================================
FAIL: test_valid_timerange (testapp.TestApp)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/himanshu/git/content/test/testapp.py", line 135, in test_valid_timerange
"%s: panel %s in dashboard %s does not use relative url" % (self.appname, dash.get("name"), panel.get("name")))
AssertionError: Kubernetes: panel Kubernetes - Kube-System in dashboard Pod and Container Running in Kube-System does not use relative url
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)
但是在日志文件中我只得到这个。
2018-06-29 18:29:56,289 [MainThread ] [INFO ] Starting Tests for manifestfile: /Users/himanshu/git/content/src/main/app-package/kubernetes/kops/kubernetes.manifest.json appfile: /Users/himanshu/git/content/src/main/app-package/kubernetes/kops/kubernetes.json
2018-06-29 18:29:56,341 [MainThread ] [INFO ] testing Kubernetes: test_valid_timerange
2018-06-29 18:29:56,341 [MainThread ] [INFO ] testing Kubernetes: test_has_dashboard_description
2018-06-29 18:29:56,342 [MainThread ] [DEBUG] Results - Total TestCases: 2 Total Failed: 1
我知道这样做的一种方法是从测试的结果对象中显式获取失败和错误,并使用其处理程序仅输出到文件的记录器打印它们(这是因为如果我使用当前的记录器,它同时具有流处理程序和文件处理程序,它将在控制台中打印两次失败消息)。这是我当前的代码
def get_logger():
log = logging.getLogger(__name__)
if not log.handlers:
log.setLevel(logging.DEBUG)
logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s")
consoleHandler = logging.StreamHandler(sys.stdout)
consoleHandler.setFormatter(logFormatter)
log.addHandler(consoleHandler)
filehandler = RotatingFileHandler(LOGFILE, maxBytes=(1024*1024*25), backupCount=7)
filehandler.setFormatter(logFormatter)
log.addHandler(filehandler)
return log
logger = get_logger()
suite = unittest.TestSuite()
// using suite.addTest to add tests and using logger in each test function
result = unittest.TextTestRunner().run(suite)
如果不使用单个处理程序创建另一个记录器,还有其他更好的方法吗?我正在寻找替代方法,例如在创建测试套件时传递记录器 (unittest.TestSuite(logger=mylogger)) 或使用相同的记录器但显式传递参数以使用特定的处理程序(logger.info(msg, using=filehandler))或将一些停止打印失败消息的参数传递给控制台,我可以使用我的自定义记录器打印到控制台和文件。
解决方案
我使用了类似于这里提到的东西
class LoggerWriter:
def __init__(self, logger):
self.logger = logger
def write(self, message):
if message != '\n' and message != " ... ":
self.logger.debug(message)
def flush(self):
pass
suite = unittest.TestSuite()
result = unittest.TextTestRunner(stream=LoggerWriter(logger), verbosity=3).run(suite)
PS我仍然不知道这是否是解决问题的最佳方法。
推荐阅读
- gatsby - 同时从 Markdown 和 JSON 中获取博客文章的数据
- sql - Postgres 解决由破折号 (-) 引起的语法错误
- json - 如何在 Laravel 中使用 Api 从两个表中获取所有记录
- django - 单击提交按钮后未添加评论
- javascript - 我正在尝试使用 jquery toggle 在文本和图像之间交换
- android - 附加 Firebase 令牌以启动 URL -Trusted Web 活动
- vim - 一个简单的解决方案,我可以使用 Vim 将 3 行文本连接/连接在一起
- javascript - 从枚举创建通用类型
- linux - 我的 Linux 可执行程序中的段 00 是什么(64 位)
- python - 将 Python Selenium 用于 SVG 元素