将来,我将需要添加许多具有不同参数的相同测试。现在,我正在制作一个示例测试套件:
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来单独运行测试?
我在做什么错了?
谢谢。
答案 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为我指出单元测试框架文档