繁体   English   中英

如何在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 part)

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的命令行界面使其正常工作,则该扩展程序应按您希望的方式运行它。

关键是实现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负责加载软件包中的所有测试。

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

PS感谢Brett Cannon向我指出了单元测试框架文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM