如何在 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 为我指点单元测试框架文档
将来,我需要添加许多具有不同参数的相同测试。现在我正在制作一个示例测试套件:
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 为我指点单元测试框架文档