如何在 VS Code 中使用 unittest.TestSuite?

How to use unittest.TestSuite in VS Code?

将来,我需要添加许多具有不同参数的相同测试。现在我正在制作一个示例测试套件:

import unittest

class TestCase(unittest.TestCase):
    def __init__(self, methodName='runTest', param=None):
        super(TestCase, self).__init__(methodName)
        self.param = param

    def test_something(self):
        print '\n>>>>>> test_something: param =', self.param
        self.assertEqual(1, 1)

if __name__ == "__main__":
    suite = unittest.TestSuite()
    testloader = unittest.TestLoader()
    testnames = testloader.getTestCaseNames(TestCase)
    for name in testnames:
        suite.addTest(TestCase(name, param=42))
    unittest.TextTestRunner(verbosity=2).run(suite)

它被 VS Code 发现:

start
test.test_navigator.TestCase.test_something

当我运行测试时,我没有收到参数:

test_something (test.test_navigator.TestCase) ... 
>>>>>> test_something: param = None
ok

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

OK

如果我直接 运行 这个文件,一切都会按预期工作(注意 param = 42 部分)

test_something (__main__.TestCase) ...
>>>>>> test_something: param = 42
ok

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

OK

所以看起来 VS Code 运行仅通过使用发现的 类 并完全忽略 TestSuite 来自行测试?

我做错了什么?

谢谢。

问题是您的代码位于 if __name__ == "__main__" 块中,该块仅在您直接将 Python 指向文件时执行。因此,当扩展要求 unittest 获取所有测试,然后 运行 为我们进行测试时,它不会 运行 您的 if __name__ == "__main__" 块中的代码(这就是为什么它可以找到它,但它没有任何神奇的作用)。

如果您可以使用 unittest's command-line interface 让它工作,那么扩展程序应该 运行 它如您所愿。

关键是实现load_tests功能:

def load_tests(loader, tests, pattern):
    suite = unittest.TestSuite()
    testnames = loader.getTestCaseNames(TestCase)
    for name in testnames:
        suite.addTest(TestCase(name, param=42))
        suite.addTest(TestCase(name, param=84))
    return suite

文档说:

If load_tests exists then discovery does not recurse into the package, load_tests is responsible for loading all tests in the package.

现在我的测试 运行 符合预期。

P.S。感谢 Brett Cannon 为我指点单元测试框架文档