Enable unittest.TestCase to be instantiated without providing a method name.

Changed unittestgui to show number of discovered tests in the status bar.
This commit is contained in:
Michael Foord 2011-01-03 17:00:11 +00:00
parent faa8c13ef4
commit 32e1d8340c
5 changed files with 30 additions and 5 deletions

View File

@ -721,6 +721,11 @@ Test cases
Here, we create two instances of :class:`WidgetTestCase`, each of which runs a Here, we create two instances of :class:`WidgetTestCase`, each of which runs a
single test. single test.
.. versionchanged::
`TestCase` can be instantiated successfully without providing a method
name. This makes it easier to experiment with `TestCase` from the
interactive interpreter.
*methodName* defaults to :meth:`runTest`. *methodName* defaults to :meth:`runTest`.
:class:`TestCase` instances provide three groups of methods: one group used :class:`TestCase` instances provide three groups of methods: one group used

View File

@ -274,12 +274,17 @@ class TestCase(object):
""" """
self._testMethodName = methodName self._testMethodName = methodName
self._outcomeForDoCleanups = None self._outcomeForDoCleanups = None
self._testMethodDoc = 'No test'
try: try:
testMethod = getattr(self, methodName) testMethod = getattr(self, methodName)
except AttributeError: except AttributeError:
raise ValueError("no such test method in %s: %s" % if methodName != 'runTest':
(self.__class__, methodName)) # we allow instantiation with no explicit method name
self._testMethodDoc = testMethod.__doc__ # but not an *incorrect* or missing method name
raise ValueError("no such test method in %s: %s" %
(self.__class__, methodName))
else:
self._testMethodDoc = testMethod.__doc__
self._cleanups = [] self._cleanups = []
# Map types to custom assertEqual functions that will compare # Map types to custom assertEqual functions that will compare

View File

@ -77,6 +77,16 @@ class Test_TestCase(unittest.TestCase, TestEquality, TestHashing):
self.assertEqual(Test().id()[-13:], '.Test.runTest') self.assertEqual(Test().id()[-13:], '.Test.runTest')
# test that TestCase can be instantiated with no args
# primarily for use at the interactive interpreter
test = unittest.TestCase()
test.assertEqual(3, 3)
with test.assertRaises(test.failureException):
test.assertEqual(3, 2)
with self.assertRaises(AttributeError):
test.run()
# "class TestCase([methodName])" # "class TestCase([methodName])"
# ... # ...
# "Each instance of TestCase will run a single test method: the # "Each instance of TestCase will run a single test method: the

View File

@ -23,6 +23,9 @@ Core and Builtins
Library Library
------- -------
- `unittest.TestCase` can be instantiated without a method name; for simpler
exploration from the interactive interpreter.
- Issue #10798: Reject supporting concurrent.futures if the system has too - Issue #10798: Reject supporting concurrent.futures if the system has too
few POSIX semaphores. few POSIX semaphores.

View File

@ -276,13 +276,15 @@ class TkTestRunner(BaseGUITestRunner):
self.test_file_glob_pattern = d.test_file_glob_pattern self.test_file_glob_pattern = d.test_file_glob_pattern
def notifyTestsDiscovered(self, test_suite): def notifyTestsDiscovered(self, test_suite):
discovered = test_suite.countTestCases()
self.runCountVar.set(0) self.runCountVar.set(0)
self.failCountVar.set(0) self.failCountVar.set(0)
self.errorCountVar.set(0) self.errorCountVar.set(0)
self.remainingCountVar.set(test_suite.countTestCases()) self.remainingCountVar.set(discovered)
self.progressBar.setProgressFraction(0.0) self.progressBar.setProgressFraction(0.0)
self.errorListbox.delete(0, tk.END) self.errorListbox.delete(0, tk.END)
self.statusVar.set("Discovering tests from %s" % self.directory_to_read) self.statusVar.set("Discovering tests from %s. Found: %s" %
(self.directory_to_read, discovered))
self.stopGoButton['state'] = tk.NORMAL self.stopGoButton['state'] = tk.NORMAL
def createWidgets(self): def createWidgets(self):