[Python-checkins] r62313 - python/trunk/Lib/test/test_warnings.py

brett.cannon python-checkins at python.org
Sun Apr 13 04:42:37 CEST 2008


Author: brett.cannon
Date: Sun Apr 13 04:42:36 2008
New Revision: 62313

Log:
Fix test_warnings by making the state of things more consistent for each test
when it is run.


Modified:
   python/trunk/Lib/test/test_warnings.py

Modified: python/trunk/Lib/test/test_warnings.py
==============================================================================
--- python/trunk/Lib/test/test_warnings.py	(original)
+++ python/trunk/Lib/test/test_warnings.py	Sun Apr 13 04:42:36 2008
@@ -8,9 +8,10 @@
 
 import warning_tests
 
+import warnings as original_warnings
+
 sys.modules['_warnings'] = 0
-if 'warnings' in sys.modules:
-    del sys.modules['warnings']
+del sys.modules['warnings']
 
 import warnings as py_warnings
 
@@ -19,6 +20,9 @@
 
 import warnings as c_warnings
 
+sys.modules['warnings'] = original_warnings
+
+
 @contextmanager
 def warnings_state(module):
     """Use a specific warnings implementation in warning_tests."""
@@ -40,16 +44,32 @@
         warning_tests.warnings = original_warnings
 
 
-class FilterTests(unittest.TestCase):
+class BaseTest(unittest.TestCase):
 
-    """Testing the filtering functionality."""
+    """Basic bookkeeping required for testing."""
 
     def setUp(self):
-        global __warningregistry__
-        try:
-            __warningregistry__.clear()
-        except NameError:
-            pass
+        # The __warningregistry__ needs to be in a pristine state for tests
+        # to work properly.
+        if '__warningregistry__' in globals():
+            del globals()['__warningregistry__']
+        if hasattr(warning_tests, '__warningregistry__'):
+            del warning_tests.__warningregistry__
+        if hasattr(sys, '__warningregistry__'):
+            del sys.__warningregistry__
+        # The 'warnings' module must be explicitly set so that the proper
+        # interaction between _warnings and 'warnings' can be controlled.
+        sys.modules['warnings'] = self.module
+        super(BaseTest, self).setUp()
+
+    def tearDown(self):
+        sys.modules['warnings'] = original_warnings
+        super(BaseTest, self).tearDown()
+
+
+class FilterTests(object):
+
+    """Testing the filtering functionality."""
 
     def test_error(self):
         with test_support.catch_warning(self.module) as w:
@@ -164,10 +184,10 @@
             self.assertEqual(str(w.message), text)
             self.assert_(w.category is UserWarning)
 
-class CFilterTests(FilterTests):
+class CFilterTests(BaseTest, FilterTests):
     module = c_warnings
 
-class PyFilterTests(FilterTests):
+class PyFilterTests(BaseTest, FilterTests):
     module = py_warnings
 
 
@@ -210,10 +230,10 @@
                 self.assertEqual(os.path.basename(w.filename), "sys")
 
 
-class CWarnTests(WarnTests):
+class CWarnTests(BaseTest, WarnTests):
     module = c_warnings
 
-class PyWarnTests(WarnTests):
+class PyWarnTests(BaseTest, WarnTests):
     module = py_warnings
 
 
@@ -232,14 +252,14 @@
             self.module._setoption('error::Warning::0')
             self.assertRaises(UserWarning, self.module.warn, 'convert to error')
 
-class CWCmdLineTests(WCmdLineTests):
+class CWCmdLineTests(BaseTest, WCmdLineTests):
     module = c_warnings
 
-class PyWCmdLineTests(WCmdLineTests):
+class PyWCmdLineTests(BaseTest, WCmdLineTests):
     module = py_warnings
 
 
-class _WarningsTests(unittest.TestCase):
+class _WarningsTests(BaseTest):
 
     """Tests specific to the _warnings module."""
 
@@ -362,30 +382,23 @@
                                 file_object, expected_file_line)
         self.failUnlessEqual(expect, file_object.getvalue())
 
-class CWarningsDisplayTests(WarningsDisplayTests):
+class CWarningsDisplayTests(BaseTest, WarningsDisplayTests):
     module = c_warnings
 
-class PyWarningsDisplayTests(WarningsDisplayTests):
+class PyWarningsDisplayTests(BaseTest, WarningsDisplayTests):
     module = py_warnings
 
 
 def test_main():
-    # Obscure hack so that this test passes after reloads or repeated calls
-    # to test_main (regrtest -R).
-    if '__warningregistry__' in globals():
-        del globals()['__warningregistry__']
-    if hasattr(warning_tests, '__warningregistry__'):
-        del warning_tests.__warningregistry__
-    if hasattr(sys, '__warningregistry__'):
-        del sys.__warningregistry__
-    test_support.run_unittest(CFilterTests, PyFilterTests,
-                                CWarnTests, PyWarnTests,
+    test_support.run_unittest(CFilterTests,
+                                PyFilterTests,
+                                CWarnTests,
+                                PyWarnTests,
                                 CWCmdLineTests, PyWCmdLineTests,
                                 _WarningsTests,
                                 CWarningsDisplayTests, PyWarningsDisplayTests,
                              )
 
 
-
 if __name__ == "__main__":
     test_main()


More information about the Python-checkins mailing list