No matter what I do sys.exit() is called by unittest, even the most trivial examples. I can\'t tell if my install is messed up or what is going on.
IDLE 1.2
try:
sys.exit()
except SystemExit:
print('Simple as that, but you should really use a TestRunner instead')
Pop open the source code to unittest.py
. unittest.main()
is hard-coded to call sys.exit()
after running all tests. Use TextTestRunner
to run test suites from the prompt.
Your example is exiting on my install too. I can make it execute the tests and stay within Python by changing
unittest.main()
to
unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(Test))
More information is available here in the Python Library Reference.
Don't try to run unittest.main()
from IDLE. It's trying to access sys.argv
, and it's getting the args that IDLE was started with. Either run your tests in a different way from IDLE, or call unittest.main()
in its own Python process.
In new Python 2.7 release, unittest.main() has a new argument.
If 'exit' is set to False
, sys.exit()
is not called during the execution of unittest.main()
.
It's nice to be able to demonstrate that your tests work when first trying out the unittest module, and to know that you won't exit your Python shell. However, these solutions are version dependent.
I'm using Python 2.6 at work, import
ing unittest2 as unittest
(which is the unittest
module supposedly found in Python 2.7).
The unittest.main(exit=False)
doesn't work in Python 2.6's unittest2, while JoeSkora's solution does, and to reiterate it:
unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(Test))
To break this down into its components and default arguments, with correct semantic names for the various composed objects:
import sys # sys.stderr is used in below default args
test_loader = unittest.TestLoader()
loaded_test_suite = test_loader.loadTestsFromTestCase(Test)
# Default args:
text_test_runner = unittest.TextTestRunner(stream=sys.stderr,
descriptions=True,
verbosity=1)
text_test_runner.run(loaded_test_suite)
In Python 2.7 and higher, the following should work.
unittest.main(exit=False)