我可以通过Python中的单元测试确定应用程序是否正常运行吗?

时间:2014-10-23 14:56:42

标签: python logging python-unittest

我继承了一个迫切需要进行单元测试的应用程序。我遇到的问题是应用程序有一个日志设置,它记录到控制台和文件,如下所示:

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运行应用程序,以便我可以删除控制台日志事件?

这是一个烧瓶应用程序,但我不认为这对最终结果很重要。

3 个答案:

答案 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',用于文件和控制台日志记录。