【问题标题】:How to use unittest.TestSuite in VS Code?如何在 VS Code 中使用 unittest.TestSuite?
【发布时间】:2023-03-02 21:33:01
【问题描述】:

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

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 自行运行测试?

我做错了什么?

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    附:感谢 Brett Cannon 将我指向单元测试框架文档

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果我删除 if __name__ == "__main__" 条件,那么测试会执行两次:一次按预期在套件中执行,一次作为单独测试执行。它们也会在发现时执行。
      • 所以在使用 unittest 的 CLI 时,我意识到这不是 VS Code 的问题,而是 unittest 本身的问题。我从 CLI 得到相同的行为。如果不让它们独立执行,我就无法在套件中执行测试。
      猜你喜欢
      • 2018-02-11
      • 2020-02-12
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 2019-09-15
      相关资源
      最近更新 更多