Commits

Anonymous committed 9fb89fa

Fix minor issue in implementation of issue 10470.

Comments (0)

Files changed (3)

Lib/unittest/main.py

         long_opts = ['help', 'verbose', 'quiet', 'failfast', 'catch', 'buffer']
         try:
             options, args = getopt.getopt(argv[1:], 'hHvqfcb', long_opts)
-            for opt, value in options:
-                if opt in ('-h','-H','--help'):
-                    self.usageExit()
-                if opt in ('-q','--quiet'):
-                    self.verbosity = 0
-                if opt in ('-v','--verbose'):
-                    self.verbosity = 2
-                if opt in ('-f','--failfast'):
-                    if self.failfast is None:
-                        self.failfast = True
-                    # Should this raise an exception if -f is not valid?
-                if opt in ('-c','--catch'):
-                    if self.catchbreak is None:
-                        self.catchbreak = True
-                    # Should this raise an exception if -c is not valid?
-                if opt in ('-b','--buffer'):
-                    if self.buffer is None:
-                        self.buffer = True
-                    # Should this raise an exception if -b is not valid?
-            if len(args) == 0 and self.defaultTest is None:
-                # createTests will load tests from self.module
-                self.testNames = None
-            elif len(args) > 0:
-                self.testNames = _convert_names(args)
-                if __name__ == '__main__':
-                    # to support python -m unittest ...
-                    self.module = None
-            else:
-                self.testNames = (self.defaultTest,)
-            self.createTests()
         except getopt.error as msg:
             self.usageExit(msg)
+            return
+
+        for opt, value in options:
+            if opt in ('-h','-H','--help'):
+                self.usageExit()
+            if opt in ('-q','--quiet'):
+                self.verbosity = 0
+            if opt in ('-v','--verbose'):
+                self.verbosity = 2
+            if opt in ('-f','--failfast'):
+                if self.failfast is None:
+                    self.failfast = True
+                # Should this raise an exception if -f is not valid?
+            if opt in ('-c','--catch'):
+                if self.catchbreak is None:
+                    self.catchbreak = True
+                # Should this raise an exception if -c is not valid?
+            if opt in ('-b','--buffer'):
+                if self.buffer is None:
+                    self.buffer = True
+                # Should this raise an exception if -b is not valid?
+
+        if len(args) == 0 and self.module is None:
+            # this allows "python -m unittest -v" to still work for
+            # test discovery. This means -c / -b / -v / -f options will
+            # be handled twice, which is harmless but not ideal.
+            self._do_discovery(argv[1:])
+            return
+
+        if len(args) == 0 and self.defaultTest is None:
+            # createTests will load tests from self.module
+            self.testNames = None
+        elif len(args) > 0:
+            self.testNames = _convert_names(args)
+            if __name__ == '__main__':
+                # to support python -m unittest ...
+                self.module = None
+        else:
+            self.testNames = (self.defaultTest,)
+        self.createTests()
 
     def createTests(self):
         if self.testNames is None:

Lib/unittest/test/test_discovery.py

         program.parseArgs(['something'])
         self.assertTrue(self.called)
 
+    def test_command_line_handling_discover_by_default_with_options(self):
+        program = TestableTestProgram()
+        program.module = None
+
+        args = ['something', '-v', '-b', '-v', '-c', '-f']
+        self.called = False
+        def do_discovery(argv):
+            self.called = True
+            self.assertEqual(argv, args[1:])
+        program._do_discovery = do_discovery
+        program.parseArgs(args)
+        self.assertTrue(self.called)
+
 
     def test_command_line_handling_do_discovery_too_many_arguments(self):
         class Stop(Exception):

Lib/unittest/test/test_program.py

     defaultTest = None
     testRunner = None
     testLoader = unittest.defaultTestLoader
+    module = '__main__'
     progName = 'test'
     test = 'test'
     def __init__(self, *args):