使用 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.makeSuite
和 unittest.LoadTestFromNames
),但它们都给我相同的基本错误。我错过了什么?我保留 reading the documentation我似乎在遵循规范。
最佳答案
我通常不在命令行上使用 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
返回错误。
对我来说,这看起来像是一个错误。通过在 loadTestsFromName
开头插入 from unittest import TestSuite, TestCase
来修补 unittest.py
解决了 isinstance
问题。抱歉,我无法为您提供“正确的”解决方案(如果有的话)。
关于Python 2.6 : proper usage of unittest. 测试套件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5136159/