我继承了一个迫切需要进行单元测试的应用程序。我遇到的问题是应用程序有一个日志设置,它记录到控制台和文件,如下所示:
def setup_logging(file_name, file_level=logging.INFO, console_level=logging.INFO):
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# Create Console handler
console_log = logging.StreamHandler()
console_log.setLevel(console_level)
formatter = logging.Formatter('%(asctime)s - %(levelname)-s - %(name)-s - %(message)s')
console_log.setFormatter(formatter)
logger.addHandler(console_log)
# Log file
file_log = RotatingFileHandler('logs/%s.log' % (file_name), 'a', MAX_LOG_SIZE, MAX_LOGS_SAVE, encoding='UTF-8')
file_log.setLevel(file_level)
formatter = logging.Formatter('%(asctime)s - %(levelname)-s - %(name)-s - %(message)s')
file_log.setFormatter(formatter)
logger.addHandler(file_log)
return logger
应用程序中的日志记录也相当广泛。当我运行单元测试并触发日志消息时,我的单元测试输出搞砸了:
>python tests.py
2014-10-23 09:47:28,857 - INFO - funct_1 - args =>
.2014-10-23 09:47:28,871 - INFO - funct_1 - args => name=unicode<Andy>
.
----------------------------------------------------------------------
Ran 2 tests in 0.040s
OK
有没有办法确定是否正在通过unittest
运行应用程序,以便我可以删除控制台日志事件?
这是一个烧瓶应用程序,但我不认为这对最终结果很重要。
答案 0 :(得分:1)
猜测。
的myapp / main.py
testing = __name__ != "__main__"
的myapp / logging.py
from myapp.main import testing
if testing:
...
或者你可以试试:
的myapp / testing.py
import myapp.main
import __main__
testing = vars(myapp.main) is not vars(__main__)
del myapp
del __main__
# import myapp.testing rather than myapp.main
虽然您真正想要的是一种告诉您的日志记录模块根据其设置方式生成不同记录器的方法。这样做的一种方法是最初让日志记录模块不产生或很少记录,然后主要做的就是在生成任何记录器之前设置具有适当记录级别的记录模块。
例如
的myapp / main.py
# start of file
import myapp.logging
myapp.logging.setlevel(myapp.logging.DEBUG)
# rest of imports
# rest of main
或者,您可以在默认情况下以高级别登录并将其关闭以进行测试。一种方法是在测试源目录中创建父包。将所有测试模块放在父包中,然后创建一个__init__
模块。在加载任何测试模块之前,将运行此init模块。因此,它可以在任何测试模块存在于内存之前关闭日志记录。
例如
testsrc / parentpackage / __初始化__。PY
import myapp.logging
myapp.logging.setlevel(myapp.logging.ERROR)
答案 1 :(得分:1)
由于这是一个Flask应用程序,您应该更改在应用程序启动时加载的配置。 Flask文档的链接是here。通常有几种方法可以解决这个问题。一旦你完成所有设置,你就可以检查app.config [&#39; TESTING&#39;]或者做一百万件事。
答案 2 :(得分:0)
运行单元测试时,我会将日志记录设置为'logging.ERROR',用于文件和控制台日志记录。