Using Python 2.6, I have a very simple test in a python file in a directory:
#mytest.py
import unittest
class BasicTests(unittest.TestCase):
def test_ok(self):
self.assertTrue(True)
suite = unittest.TestLoader().loadTestsFromTestCase(BasicTests)
I change into the directory and run python -m unittest mytest.suite and I get the following error:
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)
I've tried several variations (such as unittest.makeSuite and unittest.LoadTestFromNames) but they all give me the same basic error. What am I missing? I keep reading the documentation and I seem to be following the spec.
I don't usually work with unittest on the command line, but have my own test running scripts.
You need to add a function suite to the module
def suite():
return unittest.TestLoader().loadTestsFromTestCase(BasicTests)
and then call it like python -m unittest mytest.suite. But then I run into the following problem:
TypeError: calling <function suite at 0x00C1FB70> returned <unittest.TestSuite tests=[<mysite.BasicTests testMethod=test_ok>]>, not a test
which happens because unittest uses something like isinstance(mytest.suite(), TestSuite) but through executing with -m, you get two different versions of the TestSuite class (one is __main__.TestSuite, the other is unittest.TestSuite), so isinstance returns false.
To me, this looks like a bug. Patching unittest.py by inserting from unittest import TestSuite, TestCase at the beginning of loadTestsFromName solves the isinstance problem. Sorry I can't give you the "correct" solution (if there is one).
Update: it looks like what I have above is in fact, correct. When I installed a copy of Python 2.7, everything worked fine. I dug through the unittest.py source code and found that this line of code was not working the way one would expect:
elif isinstance(obj, TestSuite):
return obj
elif hasattr(obj, '__call__'):
test = obj()
The first elif condition is failing, and thus it falls down into the one after where the exception is raised. I'm still not sure how that could even remotely happen — maybe a bad compilation — but I've gone ahead and filed a bug with the provider.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With