Python 2.6:正确使用 unittest.TestSuite

dav*_*off 3 python unit-testing

使用 Python 2.6,我在一个目录中的 python 文件中有一个非常简单的测试:

#mytest.py
import unittest

class BasicTests(unittest.TestCase):
    def test_ok(self):
        self.assertTrue(True)

suite = unittest.TestLoader().loadTestsFromTestCase(BasicTests)
Run Code Online (Sandbox Code Playgroud)

我切换到目录并运行python -m unittest mytest.suite,但出现以下错误:

Traceback (most recent call last):
  File "/usr/lib/python2.6/runpy.py", line 122, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.6/runpy.py", line 34, in _run_code
    exec code in run_globals
  File "/usr/lib/python2.6/unittest.py", line 875, in <module>
    main(module=None)
  File "/usr/lib/python2.6/unittest.py", line 816, in __init__
    self.parseArgs(argv)
  File "/usr/lib/python2.6/unittest.py", line 843, in parseArgs
    self.createTests()
  File "/usr/lib/python2.6/unittest.py", line 849, in createTests
    self.module)
  File "/usr/lib/python2.6/unittest.py", line 613, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib/python2.6/unittest.py", line 598, in loadTestsFromName
    test = obj()
  File "/usr/lib/python2.6/unittest.py", line 464, in __call__
    return self.run(*args, **kwds)
TypeError: run() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

我尝试了几种变体(例如unittest.makeSuiteunittest.LoadTestFromNames),但它们都给了我相同的基本错误。我错过了什么?我一直在阅读文档,并且似乎遵循规范。

And*_*Dog 5

我通常不使用unittest命令行,但有自己的测试运行脚本。

您需要suite在模块中添加一个函数

def suite():
    return unittest.TestLoader().loadTestsFromTestCase(BasicTests)
Run Code Online (Sandbox Code Playgroud)

然后像python -m unittest mytest.suite. 但是后来我遇到了以下问题:

TypeError: calling <function suite at 0x00C1FB70> returned <unittest.TestSuite tests=[<mysite.BasicTests testMethod=test_ok>]>, not a test
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为unittest使用了类似isinstance(mytest.suite(), TestSuite)但通过执行 with 的东西-m,您将获得TestSuite该类的两个不同版本(一个是__main__.TestSuite,另一个是unittest.TestSuite),因此isinstance返回 false。
对我来说,这看起来像是一个错误。unittest.py通过from unittest import TestSuite, TestCase在开头插入来修补loadTestsFromName解决了isinstance问题。对不起,我不能给你“正确”的解决方案(如果有的话)。