PyDev未捕获unittest.TextTestRunner输出?

1 投票
1 回答
903 浏览
提问于 2025-04-17 00:13

当我从包含单元测试的模块中以“Python unit-test”的方式运行测试时,PyDev的PyUnit视图能够正确显示我的测试结果,使用的基本方式如下:

import unittest

class MyTest(unittest.TestCase):
    def test_something(self):
        pass

if __name__ == '__main__':
    unittest.main()

但是,当我像这样从另一个模块导入测试时……

import unittest
import mypackage.mytests

if __name__ == '__main__':
    unittest.main(module=mypackage.mytests)

……就没有测试被运行。当我以“Python Run”方式运行同一个模块,或者从终端运行时,它的表现是正常的,所以不知道为什么PyUnit视图没有正确加载测试。我用另一种方法也得到了同样的结果:

import unittest
import mypackage.mytests

tests = unittest.TestLoader().loadTestsFromModule(mypackage.mytests)
unittest.TextTestRunner().run(tests)

有没有其他方法可以导入包含TestCase派生类的模块,并让PyDev捕捉测试运行器的输出呢?

1 个回答

1

PyDev不会直接运行你的__main__,它会自己收集类,所以你需要确保你的类已经加载到模块中,这样它才能找到它们(然后选择“运行为 > Python Unittest”,或者直接使用Ctrl+F9快捷键 -- 在这种情况下,它不会显示类,但在按下Ctrl+F9后直接按Enter应该可以运行模块中的所有测试,在最新的PyDev中是这样)。

比如:

import unittest 
from mypackage.mytests import *

如果你有多个测试类,而且这些类的名字是一样的,你就需要做一些类似这样的事情:

import unittest
from mypackage.mytests import Test as Test1
from mypackage.mytests2 import Test as Test2
...

在这种情况下,你可能更好地创建一个简单的助手,来加载模块中的所有类,并把TestCase的子类放在当前模块中,使用不同的名字(通过模块中的dir/getattr来做到这一点应该很简单)。

不过,要注意的是,在PyDev中,你可以选择多个文件或文件夹,然后选择“运行为 > Python unittest”,它会运行模块中找到的所有测试(或者在一个目录中递归查找),所以根据你的使用情况,这可能已经足够了。

撰写回答