[Python-checkins] distutils2: added a fall-through to a default unittest2 test discovery

tarek.ziade python-checkins at python.org
Sun Sep 19 10:20:22 CEST 2010


tarek.ziade pushed d92dcd5dbe63 to distutils2:
http://hg.python.org/distutils2/rev/d92dcd5dbe63
changeset: 623:d92dcd5dbe63
user: Konrad Delong <konryd at gmail.com>
date: Sat Aug 14 22:31:26 2010 +0200
summary: added a fall-through to a default unittest2 test discovery
files: src/distutils2/command/test.py, src/distutils2/tests/test_test.py
diff --git a/src/distutils2/command/test.py b/src/distutils2/command/test.py
--- a/src/distutils2/command/test.py
+++ b/src/distutils2/command/test.py
@@ -1,4 +1,5 @@
-import os, sys
+import os
+import sys
 from distutils2 import log
 from distutils2.core import Command
 from distutils2._backport.pkgutil import get_distribution
@@ -28,8 +29,18 @@
 if get_distribution(requirement) is None:
 warnings.warn("The test dependency %s is not installed which may couse the tests to fail." % requirement,
 RuntimeWarning)
- if not self.suite and not self.runner:
- self.announce("Either 'suite' or 'runner' option must be specified", log.ERROR)
+ if not self.suite and not self.runner and self.get_ut_with_discovery() is None:
+ self.announce("No test discovery available. Please specify the 'suite' or 'runner' option or install unittest2.", log.ERROR)
+ 
+ def get_ut_with_discovery(self):
+ if hasattr(unittest.TestLoader, "discover"):
+ return unittest
+ else:
+ try:
+ import unittest2
+ return unittest2
+ except ImportError:
+ return None
 
 def run(self):
 prev_cwd = os.getcwd()
@@ -45,6 +56,10 @@
 if self.runner:
 resolve_name(self.runner)()
 elif self.suite:
- unittest.main(None, None, [unittest.__file__, '--verbose', self.suite])
+ unittest.TextTestRunner(verbosity=self.verbose + 1).run(resolve_name(self.suite)())
+ elif self.get_ut_with_discovery():
+ discovery_ut = self.get_ut_with_discovery()
+ test_suite = discovery_ut.TestLoader().discover(os.curdir)
+ discovery_ut.TextTestRunner(verbosity=self.verbose + 1).run(test_suite)
 finally:
 os.chdir(prev_cwd)
diff --git a/src/distutils2/tests/test_test.py b/src/distutils2/tests/test_test.py
--- a/src/distutils2/tests/test_test.py
+++ b/src/distutils2/tests/test_test.py
@@ -26,6 +26,40 @@
 
 here = os.path.dirname(os.path.abspath(__file__))
 
+def with_mock_ut2_module(func):
+ def wrapper(*args):
+ class MockUTModule(object): pass
+ class MockUTClass(object):
+ def __init__(*_, **__): pass
+ def discover(self): pass
+ def run(self, _): pass
+ ut2 = MockUTModule()
+ ut2.TestLoader = MockUTClass
+ ut2.TextTestRunner = MockUTClass
+ orig_ut2 = sys.modules.get('unittest2', None)
+ try:
+ sys.modules['unittest2'] = ut2
+ args += (ut2,)
+ func(*args)
+ finally:
+ if orig_ut2 is not None:
+ sys.modules['unittest2'] = orig_ut2
+ else:
+ del sys.modules['unittest2']
+ return wrapper
+
+def with_ut_isolated(func):
+ def wrapper(*args):
+ import unittest as ut1
+
+ orig_discover = getattr(ut1.TestLoader, 'discover', None)
+ try:
+ args += (ut1,)
+ return func(*args)
+ finally:
+ if orig_discover is not None:
+ ut1.TestLoader.discover = orig_discover
+ return wrapper
 
 class TestTest(TempdirManager,
 #LoggingSilencer,
@@ -117,6 +151,38 @@
 finally:
 sys.path.remove(tmp_dir)
 
+ def _test_gets_unittest_discovery(self):
+ import unittest as ut1
+
+ orig_discover = getattr(ut1.TestLoader, 'discover', None)
+ try:
+ self._test_gets_unittest_discovery(ut1)
+ finally:
+ if orig_discover is not None:
+ ut1.TestLoader.discover = orig_discover
+
+ @with_ut_isolated
+ @with_mock_ut2_module
+ def test_gets_unittest_discovery(self, ut1, mock_ut2):
+ dist = Distribution()
+ cmd = test(dist)
+ ut1.TestLoader.discover = lambda: None
+ self.assertEqual(cmd.get_ut_with_discovery(), ut1)
+
+ del ut1.TestLoader.discover
+ self.assertEqual(cmd.get_ut_with_discovery(), mock_ut2)
+
+ @with_ut_isolated
+ @with_mock_ut2_module
+ def test_calls_discover(self, ut1, mock_ut2):
+ if hasattr(ut1.TestLoader, "discover"):
+ del ut1.TestLoader.discover
+ record = []
+ mock_ut2.TestLoader.discover = lambda self, path: record.append(path)
+ dist = Distribution()
+ cmd = test(dist)
+ cmd.run()
+ self.assertEqual(record, [os.curdir])
 
 def test_suite():
 return unittest.makeSuite(TestTest)
--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /