Python 2.6:正确使用unittest.TestSuite

时间:2011-02-27 21:36:41

标签: 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)

我切换到目录并运行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)

我尝试了多种变体(例如unittest.makeSuiteunittest.LoadTestFromNames),但它们都给了我相同的基本错误。我错过了什么?我保留reading the documentation,我似乎遵循规范。

3 个答案:

答案 0 :(得分:4)

我通常不会在命令行上使用unittest,而是让我自己的测试运行脚本。

您需要向模块添加函数suite

def suite():
    return unittest.TestLoader().loadTestsFromTestCase(BasicTests)

然后将其称为python -m unittest mytest.suite。但后来我遇到了以下问题:

TypeError: calling <function suite at 0x00C1FB70> returned <unittest.TestSuite tests=[<mysite.BasicTests testMethod=test_ok>]>, not a test
发生这种情况是因为unittest使用isinstance(mytest.suite(), TestSuite)之类的内容,但通过-m执行,您会得到TestSuite类的两个不同版本(一个是__main__.TestSuite ,另一个是unittest.TestSuite),因此isinstance返回false。
对我来说,这看起来像个bug。通过在unittest.py开头插入from unittest import TestSuite, TestCase来修补loadTestsFromName可解决isinstance问题。抱歉,我无法向您提供“正确的”解决方案(如果有的话)。

答案 1 :(得分:1)

更新:看起来我上面的内容实际上是正确的。当我安装Python 2.7的副本时,一切正常。我挖掘了unittest.py源代码,发现这行代码没有按照预期的方式工作:

    elif isinstance(obj, TestSuite):
        return obj
    elif hasattr(obj, '__call__'):
        test = obj()

第一个elif条件失败,因此它落入引发异常之后的条件。我仍然不确定这怎么可能发生 - 也许是一个糟糕的编译 - 但我已经和提供者一起filed a bug了。

答案 2 :(得分:0)

您可能想尝试:

<强> mytest.py:

import unittest

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

if __name__ == '__main__':
    unittest.sys.argv.insert(1,'--verbose')
    unittest.main(argv = unittest.sys.argv)    

然后,

% python mytest.py

TestCase

的所有子类中运行所有测试
% python mytest.py BasicTests.test_ok

只运行test_ok。当您知道一个测试存在问题并且不希望每个测试都运行时,该命令的第二种形式很有用。