我编写了一些代码,试图在下面执行与unittest.main()类似的操作。总之,我遍历模块,对于不以“unittest”名称开头的模块,我检查其成员。如果这些成员是一个类,并且是unittest.TestCase的子类,那么我将解析该类的成员。然后,如果这些类成员是以“test”开头的函数或方法,则将其添加到测试列表中。类对象的__dict__用于内省方法/函数,因为使用inspect.getmembers可能会显示太多。最后,这个测试列表被转换成一个元组并打包成一个套件。然后使用运行程序在详细级别2运行该套件。请注意,当然,如果您不需要此限制,可以删除在函数/方法名开头检查“test”的正则表达式,以便将bar_test()包含到测试列表中。#!/usr/bin/env python
import unittest
import inspect
import sys
import re
class Foo(unittest.TestCase):
@staticmethod
def test_baz():
pass
@classmethod
def test_mu(cls):
pass
def test_foo(self):
self.assertEqual('foo', 'foo')
def bar_test(self):
self.assertEqual('bar', 'bar')
class Bar:
pass
if __name__ == '__main__':
runner = unittest.TextTestRunner(verbosity=2)
tests = []
is_member_valid_test_class = lambda member: inspect.isclass(member) and \
issubclass(member, unittest.TestCase)
for module_name, module_obj in sys.modules.items():
if not re.match(r'unittest', module_name):
for cls_name, cls in inspect.getmembers(
module_obj, is_member_valid_test_class):
for methname, methobj in cls.__dict__.items():
if inspect.isroutine(methobj) and re.match(r'test', methname):
tests.append(cls(methname))
suite = unittest.TestSuite(tests=tuple(tests))
runner.run(suite)
结果是:test_foo (__main__.Foo) ... ok
test_baz (__main__.Foo) ... ok
test_mu (__main__.Foo) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK