Django - 测试失败时记录日志

5 投票
3 回答
1329 浏览
提问于 2025-04-18 11:29

我在Django中有很多单元测试,如果某个测试失败了,我通常需要查看日志(最好是在控制台里)。我不太能用日志文件,因为那样会变得非常混乱。
我现在的做法是:在settings.py中开启控制台日志记录,然后只运行一个特定的测试。我希望能有更方便的方法。我只想看到失败测试的日志,而不是完整的日志。

编辑:虽然已经有人回答了这个问题——而且我也接受了那个答案——但我还是不太满意。我想只看到失败测试的日志输出。我在寻找一个像PHPUnit那样的解决方案。它会捕捉完整的输出(包括日志和打印),只有在测试失败时才会写入stdout

3 个回答

0

一种快速简单的方法来查看你在控制台上的日志输出,就是对日志功能进行一些临时的修改。比如,如果你想要覆盖掉日志中的info信息,可以这样做:

def monkey_print(*args):
   print args
setattr(logging, 'info', monkey_print)

完成后只需删除这些修改就可以了。这种方法简单有效,也适用于单元测试(unittest)。

1

在运行测试的时候,设置根日志记录器只使用控制台处理器。最简单的方法是检查第二个参数是否是“test”。确保所有重要的日志记录器都设置了 "propagate": True,这样它们就能把日志转发到根日志记录器。

# settings.py
import sys

if sys.argv[1] == 'test':
    LOGGING['root'] = {
        'handlers': ['console'],
        'level': 'DEBUG',
    }
1

我刚刚找到了解决办法。
原来有一个 -b 选项,它的作用是“缓存输出”,也就是说在运行单元测试的时候,只有测试失败时才会显示输出。如果你的 tests.py 文件里有执行 unittest.main() 的代码,这个用起来非常简单。只需要输入 python tests.py -b,这样在测试通过的情况下,所有的输出都会被缓存,只有测试失败时才会显示出来。

...........F
Stdout:
OK :)
OK :)

======================================================================
FAIL: testStr (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests.py", line 93, in testStr
    self.fail()
AssertionError: None

Stdout:
OK :)
OK :)

----------------------------------------------------------------------
Ran 12 tests in 0.005s

在这种情况下,每个测试都会向标准输出(stdout)打印一些内容,但只有最后一个失败的测试会被显示出来。因为日志也可以打印到控制台(参考 @Thomas 的回答),所以你只会看到相关的日志信息。

撰写回答