From 176a56c69b1563c4a8ac0d8f974b4271177c80ee Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Mon, 25 May 2009 00:48:58 +0000 Subject: [PATCH] make class skipping decorators the same as skipping every test of the class This removes ClassTestSuite and a good bit of hacks. --- Doc/library/unittest.rst | 26 +++++------------------ Lib/test/test_unittest.py | 17 ++++++++------- Lib/unittest.py | 44 ++++++++------------------------------- Misc/NEWS | 3 +++ 4 files changed, 26 insertions(+), 64 deletions(-) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 0af3ea36b12..39fbb79c54e 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -62,8 +62,7 @@ so a new fixture is created for each test. Test suites are implemented by the :class:`TestSuite` class. This class allows individual tests and test suites to be aggregated; when the suite is executed, -all tests added directly to the suite and in "child" test suites are run. A -:class:`ClassTestSuite` contains the test cases of a class. +all tests added directly to the suite and in "child" test suites are run. A test runner is an object that provides a single method, :meth:`~TestRunner.run`, which accepts a :class:`TestCase` or :class:`TestSuite` @@ -1057,11 +1056,10 @@ Grouping tests test suites that will be used to build the suite initially. Additional methods are provided to add test cases and suites to the collection later on. - :class:`TestSuite` (including :class:`ClassTestSuite`) objects behave much - like :class:`TestCase` objects, except they do not actually implement a test. - Instead, they are used to aggregate tests into groups of tests that should be - run together. Some additional methods are available to add tests to - :class:`TestSuite` instances: + :class:`TestSuite` objects behave much like :class:`TestCase` objects, except + they do not actually implement a test. Instead, they are used to aggregate + tests into groups of tests that should be run together. Some additional + methods are available to add tests to :class:`TestSuite` instances: .. method:: TestSuite.addTest(test) @@ -1118,14 +1116,6 @@ Grouping tests is invoked by a :class:`TestRunner` rather than by the end-user test harness. -.. class:: ClassTestSuite(tests, collected_from) - - This subclass of :class:`TestSuite` repesents an aggregation of individuals - tests from one :class:`TestCase` class. *tests* is an iterable of - :class:`TestCase` instances created from the class. *collected_from* is the - class they came from. - - Loading and running tests ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1229,12 +1219,6 @@ Loading and running tests This affects all the :meth:`loadTestsFrom\*` methods. - .. attribute:: classSuiteClass - - Callable object that constructs a test suite for the tests cases from one - class. The default value is :class:`ClassTestSuite`. - - .. class:: TestResult This class is used to compile information about which tests have succeeded diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py index 4f89d87a513..9c1fe2a3d2f 100644 --- a/Lib/test/test_unittest.py +++ b/Lib/test/test_unittest.py @@ -107,7 +107,7 @@ class TestHashing(object): # List subclass we can add attributes to. class MyClassSuite(list): - def __init__(self, tests, klass): + def __init__(self, tests): super(MyClassSuite, self).__init__(tests) @@ -1262,7 +1262,7 @@ class Test_TestLoader(TestCase): tests = [Foo('test_1'), Foo('test_2')] loader = unittest.TestLoader() - loader.classSuiteClass = MyClassSuite + loader.suiteClass = list self.assertEqual(loader.loadTestsFromTestCase(Foo), tests) # It is implicit in the documentation for TestLoader.suiteClass that @@ -1275,7 +1275,7 @@ class Test_TestLoader(TestCase): def foo_bar(self): pass m.Foo = Foo - tests = [unittest.ClassTestSuite([Foo('test_1'), Foo('test_2')], Foo)] + tests = [[Foo('test_1'), Foo('test_2')]] loader = unittest.TestLoader() loader.suiteClass = list @@ -1294,7 +1294,7 @@ class Test_TestLoader(TestCase): tests = [Foo('test_1'), Foo('test_2')] loader = unittest.TestLoader() - loader.classSuiteClass = MyClassSuite + loader.suiteClass = list self.assertEqual(loader.loadTestsFromName('Foo', m), tests) # It is implicit in the documentation for TestLoader.suiteClass that @@ -1307,7 +1307,7 @@ class Test_TestLoader(TestCase): def foo_bar(self): pass m.Foo = Foo - tests = [unittest.ClassTestSuite([Foo('test_1'), Foo('test_2')], Foo)] + tests = [[Foo('test_1'), Foo('test_2')]] loader = unittest.TestLoader() loader.suiteClass = list @@ -2871,7 +2871,7 @@ class Test_TestSkipping(TestCase): def test_dont_skip(self): pass test_do_skip = Foo("test_skip") test_dont_skip = Foo("test_dont_skip") - suite = unittest.ClassTestSuite([test_do_skip, test_dont_skip], Foo) + suite = unittest.TestSuite([test_do_skip, test_dont_skip]) events = [] result = LoggingResult(events) suite.run(result) @@ -2890,9 +2890,10 @@ class Test_TestSkipping(TestCase): record.append(1) record = [] result = unittest.TestResult() - suite = unittest.ClassTestSuite([Foo("test_1")], Foo) + test = Foo("test_1") + suite = unittest.TestSuite([test]) suite.run(result) - self.assertEqual(result.skipped, [(suite, "testing")]) + self.assertEqual(result.skipped, [(test, "testing")]) self.assertEqual(record, []) def test_expected_failure(self): diff --git a/Lib/unittest.py b/Lib/unittest.py index fce70f80103..d2716753e71 100644 --- a/Lib/unittest.py +++ b/Lib/unittest.py @@ -59,7 +59,7 @@ import warnings ############################################################################## # Exported classes and functions ############################################################################## -__all__ = ['TestResult', 'TestCase', 'TestSuite', 'ClassTestSuite', +__all__ = ['TestResult', 'TestCase', 'TestSuite', 'TextTestRunner', 'TestLoader', 'FunctionTestCase', 'main', 'defaultTestLoader', 'SkipTest', 'skip', 'skipIf', 'skipUnless', 'expectedFailure'] @@ -458,6 +458,13 @@ class TestCase(object): self._resultForDoCleanups = result result.startTest(self) + if getattr(self.__class__, "__unittest_skip__", False): + # If the whole class was skipped. + try: + result.addSkip(self, self.__class__.__unittest_skip_why__) + finally: + result.stopTest(self) + return testMethod = getattr(self, self._testMethodName) try: success = False @@ -1110,37 +1117,6 @@ class TestSuite(object): test.debug() -class ClassTestSuite(TestSuite): - """ - Suite of tests derived from a single TestCase class. - """ - - def __init__(self, tests, class_collected_from): - super(ClassTestSuite, self).__init__(tests) - self.collected_from = class_collected_from - - def id(self): - module = getattr(self.collected_from, "__module__", None) - if module is not None: - return "{0}.{1}".format(module, self.collected_from.__name__) - return self.collected_from.__name__ - - def run(self, result): - if getattr(self.collected_from, "__unittest_skip__", False): - # ClassTestSuite result pretends to be a TestCase enough to be - # reported. - result.startTest(self) - try: - result.addSkip(self, self.collected_from.__unittest_skip_why__) - finally: - result.stopTest(self) - else: - result = super(ClassTestSuite, self).run(result) - return result - - shortDescription = id - - class FunctionTestCase(TestCase): """A test case that wraps a test function. @@ -1213,7 +1189,6 @@ class TestLoader(object): testMethodPrefix = 'test' sortTestMethodsUsing = cmp suiteClass = TestSuite - classSuiteClass = ClassTestSuite def loadTestsFromTestCase(self, testCaseClass): """Return a suite of all tests cases contained in testCaseClass""" @@ -1223,8 +1198,7 @@ class TestLoader(object): testCaseNames = self.getTestCaseNames(testCaseClass) if not testCaseNames and hasattr(testCaseClass, 'runTest'): testCaseNames = ['runTest'] - suite = self.classSuiteClass(map(testCaseClass, testCaseNames), - testCaseClass) + suite = self.suiteClass(map(testCaseClass, testCaseNames)) return suite def loadTestsFromModule(self, module): diff --git a/Misc/NEWS b/Misc/NEWS index 89160ff7736..5526d9c098a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -302,6 +302,9 @@ Core and Builtins Library ------- +- In unittest, using a skipping decorator on a class is now equivalent to + skipping every test on the class. The ClassTestSuite class has been removed. + - Issue #6050: Don't fail extracting a directory from a zipfile if the directory already exists.