如何在Python的单元测试中在单个测试套件中运行多个类?

39 投票
5 回答
43385 浏览
提问于 2025-04-16 14:01

我怎么在Python中使用单元测试,在一个测试套件里运行多个类呢?

5 个回答

7

unittest.TestLoader.loadTestsFromModule() 这个方法可以找到并加载指定模块中的所有类。所以你只需要这样做:

import unittest
import sys

class T1(unittest.TestCase):
  def test_A(self):
    pass
  def test_B(self):
    pass

class T2(unittest.TestCase):
  def test_A(self):
    pass
  def test_B(self):
    pass

if __name__ == "__main__":
  suite = unittest.TestLoader().loadTestsFromModule( sys.modules[__name__] )
  unittest.TextTestRunner(verbosity=3).run( suite )

运行一个名为 test_core.py 的文件,可以这样:

python .\test_core.py
test_A (__main__.T1.test_A) ... ok
test_B (__main__.T1.test_B) ... ok
test_A (__main__.T2.test_A) ... ok
test_B (__main__.T2.test_B) ... ok
26

我不太确定你在问什么,但如果你想知道怎么在同一个测试套件里测试多个类,通常你只需要在同一个Python文件里创建多个测试类,然后一起运行它们:

import unittest

class TestSomeClass(unittest.TestCase):
    def testStuff(self):
            # your testcode here
            pass

class TestSomeOtherClass(unittest.TestCase):
    def testOtherStuff(self):
            # testcode of second class here
            pass

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

然后可以用比如说这样的方式来运行:

python mytestsuite.py

更好的例子可以在 官方文档 找到。

另一方面,如果你想运行多个测试文件,详细信息可以在 “如何组织Python测试,以便我可以用一个命令运行所有测试?” 中找到,那么其他的回答可能更合适。

50

如果你想只运行某个特定测试类中的所有测试,而不是模块中所有测试类的所有测试,你可以使用 TestLoaderloadTestsFromTestCase 方法来获取每个类的测试集合 TestSuite。然后,你可以把这些测试集合放在一个列表里,创建一个合并后的 TestSuite,这样就可以用 run 来运行它们了。

import unittest

# Some tests

class TestClassA(unittest.TestCase):
    def testOne(self):
        # test code
        pass

class TestClassB(unittest.TestCase):
    def testOne(self):
        # test code
        pass

class TestClassC(unittest.TestCase):
    def testOne(self):
        # test code
        pass

def run_some_tests():
    # Run only the tests in the specified classes

    test_classes_to_run = [TestClassA, TestClassC]

    loader = unittest.TestLoader()

    suites_list = []
    for test_class in test_classes_to_run:
        suite = loader.loadTestsFromTestCase(test_class)
        suites_list.append(suite)
        
    big_suite = unittest.TestSuite(suites_list)

    runner = unittest.TextTestRunner()
    results = runner.run(big_suite)

    # ...

if __name__ == '__main__':
    run_some_tests()

撰写回答