使用Django测试日志的有效方法

时间:2019-05-07 14:33:36

标签: django testing logging

在我的Django文件中,我非常简单地通过以下方式创建了一些日志条目:

# myapp/view.py

import logging

logger = logging.getLogger(__name__)

...
        # somewhere in a method
        logger.warning("display some warning")

然后,假设我要测试是否记录了此警告。在测试套件中,我通常会这样做:

# myapp/test_view.py

...
    # somewhere in a test class
    def test_logger(self):
        with self.assertLogs("myapp.view") as logger:
            # call the view

        self.assertListEqual(logger.output, [
            "WARNING:myapp.view:display some warning"
        ])

这样,记录器的输出被静音,我可以对其进行测试。当我仅使用以下命令对此视图运行测试时,这种方法可以正常工作:

./manage.py test myapp.test_view

但是当我运行所有测试时却没有:

./manage.py test

我收到此错误的地方:

Traceback (most recent call last):
  File "/home/neraste/myproject/myapp/test_view.py", line 34, in test_logger
    # the call of the view
AssertionError: no logs of level INFO or higher triggered on myapp.view

那我该怎么办?我可以使用unittest.mock.patch模拟对logger的调用,但是我发现这种方式很难看,尤其是当您将参数传递给记录器时。而且,assertLogs只是为此目的而设计的,所以我想知道哪里出了问题。

1 个答案:

答案 0 :(得分:0)

问题就在我这边。在其他测试文件中,我明确关闭了日志记录(筛选到关键级别),这就是为什么在运行所有测试时都没有记录日志的原因。