From 32e1d8340c05fa62ba51dbd942bdc09a21e65f6e Mon Sep 17 00:00:00 2001 From: Michael Foord Date: Mon, 3 Jan 2011 17:00:11 +0000 Subject: Enable unittest.TestCase to be instantiated without providing a method name. Changed unittestgui to show number of discovered tests in the status bar. --- Doc/library/unittest.rst | 5 +++++ Lib/unittest/case.py | 11 ++++++++--- Lib/unittest/test/test_case.py | 10 ++++++++++ Misc/NEWS | 3 +++ Tools/unittestgui/unittestgui.py | 6 ++++-- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index ad6d314..564ff72 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -721,6 +721,11 @@ Test cases Here, we create two instances of :class:`WidgetTestCase`, each of which runs a 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`. :class:`TestCase` instances provide three groups of methods: one group used diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 004a9f5..0277ac8 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -274,12 +274,17 @@ class TestCase(object): """ self._testMethodName = methodName self._outcomeForDoCleanups = None + self._testMethodDoc = 'No test' try: testMethod = getattr(self, methodName) except AttributeError: - raise ValueError("no such test method in %s: %s" % - (self.__class__, methodName)) - self._testMethodDoc = testMethod.__doc__ + if methodName != 'runTest': + # we allow instantiation with no explicit method name + # 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 = [] # Map types to custom assertEqual functions that will compare diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py index 9a09dfa..1513fbe 100644 --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -77,6 +77,16 @@ class Test_TestCase(unittest.TestCase, TestEquality, TestHashing): 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])" # ... # "Each instance of TestCase will run a single test method: the diff --git a/Misc/NEWS b/Misc/NEWS index ec870e7..930b47e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -23,6 +23,9 @@ Core and Builtins 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 few POSIX semaphores. diff --git a/Tools/unittestgui/unittestgui.py b/Tools/unittestgui/unittestgui.py index 0c48b49..b526646 100644 --- a/Tools/unittestgui/unittestgui.py +++ b/Tools/unittestgui/unittestgui.py @@ -276,13 +276,15 @@ class TkTestRunner(BaseGUITestRunner): self.test_file_glob_pattern = d.test_file_glob_pattern def notifyTestsDiscovered(self, test_suite): + discovered = test_suite.countTestCases() self.runCountVar.set(0) self.failCountVar.set(0) self.errorCountVar.set(0) - self.remainingCountVar.set(test_suite.countTestCases()) + self.remainingCountVar.set(discovered) self.progressBar.setProgressFraction(0.0) 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 def createWidgets(self): -- cgit v0.12