提高Python单元测试中类的日志详细性

3 投票
2 回答
1007 浏览
提问于 2025-04-18 08:34

我有一个用Python写的类,它使用了日志模块来输出一些调试信息:

文件 someclass.py:

import logging

class SomeClass:

    def do_stuff(self):
        # do some things
        logging.debug("I just did some stuff")
        # do some more stuff
        return True

我用unittest模块对这个类进行单元测试。

文件 test_someclass.py

import unittest
from someclass import SomeClass

class SomeClassTests(unittest.TestCase):

    def test_do_stuff(self):
        obj = SomeClass()
        self.assertFalse(obj.do_stuff())

def main():
    unittest.main()

if __name__ == '__main__':
    main()

我想在运行单元测试的时候显示调试信息。我尝试从单元测试模块把详细程度设置为调试:

import logging

# ....

def main():
    unittest.main()
    logging.basicConfig(level=logging.DEBUG)

但是这样并没有成功。那有什么办法可以做到这一点呢?如果能只为一个测试启用调试详细程度就更好了。

更新:

显然在Python命令行中运行是可以的,但在PyDev中就不行了(可能是因为它使用了不同的测试运行器)。

2 个回答

1

在你的 main() 函数里调用 unittest.main()

def main():
    logging.basicConfig(level=logging.DEBUG)
    unittest.main()

我的输出结果是:

DEBUG:root:I just did some stuff
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

在单元测试文档的基本示例中:https://docs.python.org/2/library/unittest.html,展示了从主函数调用和运行单元测试的简单方法。

1

如果你只想在出错的时候输出调试信息,使用nose这个测试工具是最简单的选择,因为nose会自动捕捉标准输出(也就是你在程序中打印的内容),并在出错时显示出来。这是开箱即用的功能:

$ nosetests test.py
F
======================================================================
FAIL: test_stuff (test.SomeClass)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/../../test.py", line 7, in test_stuff
    self.assertFalse(True)
AssertionError: True is not false
-------------------- >> begin captured stdout << ---------------------
I just did some stuff

--------------------- >> end captured stdout << ----------------------

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)

其中test.py文件的内容是:

from unittest import TestCase

class SomeClass(TestCase):
    def test_stuff(self):
        print "I just did some stuff"
        self.assertFalse(True)

撰写回答