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

时间:2018-11-20 18:25:50

标签: python visual-studio-code python-unittest

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

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来单独运行测试?

我在做什么错了?

谢谢。

2 个答案:

答案 0 :(得分:1)

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

如果您可以使用unittest's command-line interface使其正常工作,则扩展程序应按您希望的方式运行它。

答案 1 :(得分:0)

关键是实现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

文档说:

  

如果load_tests存在,则发现不会递归到软件包中,load_tests负责加载软件包中的所有测试。

现在我的测试按预期运行。

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