diff --git a/Lib/unittest/main.py b/Lib/unittest/main.py --- a/Lib/unittest/main.py +++ b/Lib/unittest/main.py @@ -1,7 +1,7 @@ """Unittest main program""" import sys -import optparse +import argparse import os from . import loader, runner @@ -145,21 +145,21 @@ return parser = self._getOptParser() - options, args = parser.parse_args(argv[1:]) + options = parser.parse_args(argv[1:]) self._setAttributesFromOptions(options) - if len(args) == 0 and self.module is None: + if len(options.tests) == 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:]) + self._do_discovery(options=options) return - if len(args) == 0 and self.defaultTest is None: + if len(options.tests) == 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) + elif len(options.tests) > 0: + self.testNames = _convert_names(options.tests) if __name__ == '__main__': # to support python -m unittest ... self.module = None @@ -178,26 +178,27 @@ self.module) def _getOptParser(self): - import optparse - parser = optparse.OptionParser() + parser = argparse.ArgumentParser() parser.prog = self.progName - parser.add_option('-v', '--verbose', dest='verbose', default=False, - help='Verbose output', action='store_true') - parser.add_option('-q', '--quiet', dest='quiet', default=False, - help='Quiet output', action='store_true') + parser.add_argument('-v', '--verbose', dest='verbose', default=False, + help='Verbose output', action='store_true') + parser.add_argument('-q', '--quiet', dest='quiet', default=False, + help='Quiet output', action='store_true') if self.failfast != False: - parser.add_option('-f', '--failfast', dest='failfast', default=False, - help='Stop on first fail or error', - action='store_true') + parser.add_argument('-f', '--failfast', dest='failfast', default=False, + help='Stop on first fail or error', + action='store_true') if self.catchbreak != False: - parser.add_option('-c', '--catch', dest='catchbreak', default=False, - help='Catch ctrl-C and display results so far', - action='store_true') + parser.add_argument('-c', '--catch', dest='catchbreak', default=False, + help='Catch ctrl-C and display results so far', + action='store_true') if self.buffer != False: - parser.add_option('-b', '--buffer', dest='buffer', default=False, - help='Buffer stdout and stderr during tests', - action='store_true') + parser.add_argument('-b', '--buffer', dest='buffer', default=False, + help='Buffer stdout and stderr during tests', + action='store_true') + + parser.add_argument('tests', nargs='*') return parser def _setAttributesFromOptions(self, options): @@ -216,23 +217,25 @@ self.verbosity = 0 def _addDiscoveryOptions(self, parser): - parser.add_option('-s', '--start-directory', dest='start', default='.', - help="Directory to start discovery ('.' default)") - parser.add_option('-p', '--pattern', dest='pattern', default='test*.py', - help="Pattern to match tests ('test*.py' default)") - parser.add_option('-t', '--top-level-directory', dest='top', default=None, - help='Top level directory of project (defaults to start directory)') + parser.add_argument('-s', '--start-directory', dest='start', default='.', + help="Directory to start discovery ('.' default)") + parser.add_argument('-p', '--pattern', dest='pattern', default='test*.py', + help="Pattern to match tests ('test*.py' default)") + parser.add_argument('-t', '--top-level-directory', dest='top', default=None, + help='Top level directory of project (defaults to start directory)') - def _do_discovery(self, argv, Loader=None): + def _do_discovery(self, argv=(), Loader=None, *, options=None): if Loader is None: Loader = lambda: self.testLoader - # handle command line args for test discovery - self.progName = '%s discover' % self.progName - parser = self._getOptParser() - self._addDiscoveryOptions(parser) + if options is None: + # handle command line args for test discovery + self.progName = '%s discover' % self.progName + parser = self._getOptParser() + self._addDiscoveryOptions(parser) + options = parser.parse_args(argv) - options, args = parser.parse_args(argv) + args = options.tests if len(args) > 3: self.usageExit() diff --git a/Lib/unittest/test/test_discovery.py b/Lib/unittest/test/test_discovery.py --- a/Lib/unittest/test/test_discovery.py +++ b/Lib/unittest/test/test_discovery.py @@ -259,9 +259,10 @@ args = ['something', '-v', '-b', '-v', '-c', '-f'] self.called = False - def do_discovery(argv): + def do_discovery(argv=(), options=None): self.called = True - self.assertEqual(argv, args[1:]) + self.assertTrue(options.verbose) + self.assertTrue(options.failfast) program._do_discovery = do_discovery program.parseArgs(args) self.assertTrue(self.called)