如何将断言输出记录到文件中?
how to make assert output be logged to file?
如何使用记录器将所有 assert
方法输出发送到日志文件?输出通常为 std.err
。也许有必要创建一个处理程序,但我没能做到。
这是简单的代码示例:
#!/usr/bin/python3
import unittest
import logging
import logging.config
# create logger
logging.config.fileConfig('example.conf')
logger = logging.getLogger('examplelogger')
logger.info("test 1")
class TestUpper(unittest.TestCase):
def test_upper(self):
self.assertEqual('fooo'.upper(), 'FOO')
if __name__ == '__main__':
unittest.main()
和我使用的记录器配置文件:
[loggers]
keys=root,examplelogger
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler
[logger_examplelogger]
level=DEBUG
handlers=fileHandler
qualname=examplelogger
propagate=0
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('example.log', 'w')
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
运行 代码的输出如下所示。我想(也)将其保存在日志文件中。
./example.py
F
======================================================================
FAIL: test_upper (__main__.TestUpper)
----------------------------------------------------------------------
Traceback (most recent call last):
File "./example.py", line 16, in test_upper
self.assertEqual('fooo'.upper(), 'FOO')
AssertionError: 'FOOO' != 'FOO'
- FOOO
? -
+ FOO
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)
我真的很喜欢你的问题我在寻找解决方案时学到了很多东西,
我制作了一个装饰器,它可能正是您正在寻找的。
我相信我回答的是你的问题标题,而不是你问的最后一个问题。
IMO 你应该问第二个问题,因为不一样。
import unittest
import logging.config
from functools import wraps
def test_logger(logger):
"""
Decorator for unitest that output assertion Error In a logger file
:param logger: a logger
:return:
"""
def deco(f):
@wraps(f)
def wrapper(*args):
try:
f(*args)
except AssertionError as assErr:
# f_name = (f.__name__) f_name is the function name of the function being decorated could be usefull
# assErr is the message of the assertion Error
# you can do more formatting here
logger.info(assErr) # send to the log
raise # if you don't raise the Error the test will be a success
return wrapper
return deco
logging.basicConfig(filename="test.log", level=logging.DEBUG)
logger = logging.getLogger('examplelogger')
logger.info("test 1")
class TestUpper(unittest.TestCase):
@test_logger(logger)
def test_upper(self):
self.assertEqual('fooo'.upper(), 'FOO')
if __name__ == '__main__':
unittest.main()
希望对您有所帮助,
编辑:
在 运行 这段代码之后创建了一个日志文件 'test.log' 内容如下:
INFO:examplelogger:test 1
INFO:examplelogger:'FOOO' != 'FOO'
- FOOO
? -
+ FOO
代码捕获断言引发的异常并将其放入日志中。这不是你要的吗?
如何使用记录器将所有 assert
方法输出发送到日志文件?输出通常为 std.err
。也许有必要创建一个处理程序,但我没能做到。
这是简单的代码示例:
#!/usr/bin/python3
import unittest
import logging
import logging.config
# create logger
logging.config.fileConfig('example.conf')
logger = logging.getLogger('examplelogger')
logger.info("test 1")
class TestUpper(unittest.TestCase):
def test_upper(self):
self.assertEqual('fooo'.upper(), 'FOO')
if __name__ == '__main__':
unittest.main()
和我使用的记录器配置文件:
[loggers]
keys=root,examplelogger
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler
[logger_examplelogger]
level=DEBUG
handlers=fileHandler
qualname=examplelogger
propagate=0
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('example.log', 'w')
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
运行 代码的输出如下所示。我想(也)将其保存在日志文件中。
./example.py
F
======================================================================
FAIL: test_upper (__main__.TestUpper)
----------------------------------------------------------------------
Traceback (most recent call last):
File "./example.py", line 16, in test_upper
self.assertEqual('fooo'.upper(), 'FOO')
AssertionError: 'FOOO' != 'FOO'
- FOOO
? -
+ FOO
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)
我真的很喜欢你的问题我在寻找解决方案时学到了很多东西,
我制作了一个装饰器,它可能正是您正在寻找的。 我相信我回答的是你的问题标题,而不是你问的最后一个问题。 IMO 你应该问第二个问题,因为不一样。
import unittest
import logging.config
from functools import wraps
def test_logger(logger):
"""
Decorator for unitest that output assertion Error In a logger file
:param logger: a logger
:return:
"""
def deco(f):
@wraps(f)
def wrapper(*args):
try:
f(*args)
except AssertionError as assErr:
# f_name = (f.__name__) f_name is the function name of the function being decorated could be usefull
# assErr is the message of the assertion Error
# you can do more formatting here
logger.info(assErr) # send to the log
raise # if you don't raise the Error the test will be a success
return wrapper
return deco
logging.basicConfig(filename="test.log", level=logging.DEBUG)
logger = logging.getLogger('examplelogger')
logger.info("test 1")
class TestUpper(unittest.TestCase):
@test_logger(logger)
def test_upper(self):
self.assertEqual('fooo'.upper(), 'FOO')
if __name__ == '__main__':
unittest.main()
希望对您有所帮助,
编辑: 在 运行 这段代码之后创建了一个日志文件 'test.log' 内容如下:
INFO:examplelogger:test 1
INFO:examplelogger:'FOOO' != 'FOO'
- FOOO
? -
+ FOO
代码捕获断言引发的异常并将其放入日志中。这不是你要的吗?