test_program.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. from cStringIO import StringIO
  2. import os
  3. import sys
  4. import unittest
  5. import unittest.test
  6. class Test_TestProgram(unittest.TestCase):
  7. def test_discovery_from_dotted_path(self):
  8. loader = unittest.TestLoader()
  9. tests = [self]
  10. expectedPath = os.path.abspath(os.path.dirname(unittest.test.__file__))
  11. self.wasRun = False
  12. def _find_tests(start_dir, pattern):
  13. self.wasRun = True
  14. self.assertEqual(start_dir, expectedPath)
  15. return tests
  16. loader._find_tests = _find_tests
  17. suite = loader.discover('unittest.test')
  18. self.assertTrue(self.wasRun)
  19. self.assertEqual(suite._tests, tests)
  20. # Horrible white box test
  21. def testNoExit(self):
  22. result = object()
  23. test = object()
  24. class FakeRunner(object):
  25. def run(self, test):
  26. self.test = test
  27. return result
  28. runner = FakeRunner()
  29. oldParseArgs = unittest.TestProgram.parseArgs
  30. def restoreParseArgs():
  31. unittest.TestProgram.parseArgs = oldParseArgs
  32. unittest.TestProgram.parseArgs = lambda *args: None
  33. self.addCleanup(restoreParseArgs)
  34. def removeTest():
  35. del unittest.TestProgram.test
  36. unittest.TestProgram.test = test
  37. self.addCleanup(removeTest)
  38. program = unittest.TestProgram(testRunner=runner, exit=False, verbosity=2)
  39. self.assertEqual(program.result, result)
  40. self.assertEqual(runner.test, test)
  41. self.assertEqual(program.verbosity, 2)
  42. class FooBar(unittest.TestCase):
  43. def testPass(self):
  44. assert True
  45. def testFail(self):
  46. assert False
  47. class FooBarLoader(unittest.TestLoader):
  48. """Test loader that returns a suite containing FooBar."""
  49. def loadTestsFromModule(self, module):
  50. return self.suiteClass(
  51. [self.loadTestsFromTestCase(Test_TestProgram.FooBar)])
  52. def test_NonExit(self):
  53. program = unittest.main(exit=False,
  54. argv=["foobar"],
  55. testRunner=unittest.TextTestRunner(stream=StringIO()),
  56. testLoader=self.FooBarLoader())
  57. self.assertTrue(hasattr(program, 'result'))
  58. def test_Exit(self):
  59. self.assertRaises(
  60. SystemExit,
  61. unittest.main,
  62. argv=["foobar"],
  63. testRunner=unittest.TextTestRunner(stream=StringIO()),
  64. exit=True,
  65. testLoader=self.FooBarLoader())
  66. def test_ExitAsDefault(self):
  67. self.assertRaises(
  68. SystemExit,
  69. unittest.main,
  70. argv=["foobar"],
  71. testRunner=unittest.TextTestRunner(stream=StringIO()),
  72. testLoader=self.FooBarLoader())
  73. class InitialisableProgram(unittest.TestProgram):
  74. exit = False
  75. result = None
  76. verbosity = 1
  77. defaultTest = None
  78. testRunner = None
  79. testLoader = unittest.defaultTestLoader
  80. progName = 'test'
  81. test = 'test'
  82. def __init__(self, *args):
  83. pass
  84. RESULT = object()
  85. class FakeRunner(object):
  86. initArgs = None
  87. test = None
  88. raiseError = False
  89. def __init__(self, **kwargs):
  90. FakeRunner.initArgs = kwargs
  91. if FakeRunner.raiseError:
  92. FakeRunner.raiseError = False
  93. raise TypeError
  94. def run(self, test):
  95. FakeRunner.test = test
  96. return RESULT
  97. class TestCommandLineArgs(unittest.TestCase):
  98. def setUp(self):
  99. self.program = InitialisableProgram()
  100. self.program.createTests = lambda: None
  101. FakeRunner.initArgs = None
  102. FakeRunner.test = None
  103. FakeRunner.raiseError = False
  104. def testHelpAndUnknown(self):
  105. program = self.program
  106. def usageExit(msg=None):
  107. program.msg = msg
  108. program.exit = True
  109. program.usageExit = usageExit
  110. for opt in '-h', '-H', '--help':
  111. program.exit = False
  112. program.parseArgs([None, opt])
  113. self.assertTrue(program.exit)
  114. self.assertIsNone(program.msg)
  115. program.parseArgs([None, '-$'])
  116. self.assertTrue(program.exit)
  117. self.assertIsNotNone(program.msg)
  118. def testVerbosity(self):
  119. program = self.program
  120. for opt in '-q', '--quiet':
  121. program.verbosity = 1
  122. program.parseArgs([None, opt])
  123. self.assertEqual(program.verbosity, 0)
  124. for opt in '-v', '--verbose':
  125. program.verbosity = 1
  126. program.parseArgs([None, opt])
  127. self.assertEqual(program.verbosity, 2)
  128. def testBufferCatchFailfast(self):
  129. program = self.program
  130. for arg, attr in (('buffer', 'buffer'), ('failfast', 'failfast'),
  131. ('catch', 'catchbreak')):
  132. if attr == 'catch' and not hasInstallHandler:
  133. continue
  134. short_opt = '-%s' % arg[0]
  135. long_opt = '--%s' % arg
  136. for opt in short_opt, long_opt:
  137. setattr(program, attr, None)
  138. program.parseArgs([None, opt])
  139. self.assertTrue(getattr(program, attr))
  140. for opt in short_opt, long_opt:
  141. not_none = object()
  142. setattr(program, attr, not_none)
  143. program.parseArgs([None, opt])
  144. self.assertEqual(getattr(program, attr), not_none)
  145. def testRunTestsRunnerClass(self):
  146. program = self.program
  147. program.testRunner = FakeRunner
  148. program.verbosity = 'verbosity'
  149. program.failfast = 'failfast'
  150. program.buffer = 'buffer'
  151. program.runTests()
  152. self.assertEqual(FakeRunner.initArgs, {'verbosity': 'verbosity',
  153. 'failfast': 'failfast',
  154. 'buffer': 'buffer'})
  155. self.assertEqual(FakeRunner.test, 'test')
  156. self.assertIs(program.result, RESULT)
  157. def testRunTestsRunnerInstance(self):
  158. program = self.program
  159. program.testRunner = FakeRunner()
  160. FakeRunner.initArgs = None
  161. program.runTests()
  162. # A new FakeRunner should not have been instantiated
  163. self.assertIsNone(FakeRunner.initArgs)
  164. self.assertEqual(FakeRunner.test, 'test')
  165. self.assertIs(program.result, RESULT)
  166. def testRunTestsOldRunnerClass(self):
  167. program = self.program
  168. FakeRunner.raiseError = True
  169. program.testRunner = FakeRunner
  170. program.verbosity = 'verbosity'
  171. program.failfast = 'failfast'
  172. program.buffer = 'buffer'
  173. program.test = 'test'
  174. program.runTests()
  175. # If initializing raises a type error it should be retried
  176. # without the new keyword arguments
  177. self.assertEqual(FakeRunner.initArgs, {})
  178. self.assertEqual(FakeRunner.test, 'test')
  179. self.assertIs(program.result, RESULT)
  180. def testCatchBreakInstallsHandler(self):
  181. module = sys.modules['unittest.main']
  182. original = module.installHandler
  183. def restore():
  184. module.installHandler = original
  185. self.addCleanup(restore)
  186. self.installed = False
  187. def fakeInstallHandler():
  188. self.installed = True
  189. module.installHandler = fakeInstallHandler
  190. program = self.program
  191. program.catchbreak = True
  192. program.testRunner = FakeRunner
  193. program.runTests()
  194. self.assertTrue(self.installed)
  195. if __name__ == '__main__':
  196. unittest.main()