Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5f99ced

Browse files
committed
Refactor unittest command line handling to always use optparse
1 parent 518cf94 commit 5f99ced

2 files changed

Lines changed: 32 additions & 59 deletions

File tree

Lib/unittest/main.py

Lines changed: 32 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Unittest main program"""
22

33
import sys
4+
import optparse
45
import os
56

67
from . import loader, runner
@@ -76,6 +77,7 @@ def _convert_name(name):
7677
def _convert_names(names):
7778
return [_convert_name(name) for name in names]
7879

80+
7981
class TestProgram(object):
8082
"""A command-line program that runs a set of tests; this is primarily
8183
for making test modules conveniently executable.
@@ -142,33 +144,9 @@ def parseArgs(self, argv):
142144
self._do_discovery(argv[2:])
143145
return
144146

145-
import getopt
146-
long_opts = ['help', 'verbose', 'quiet', 'failfast', 'catch', 'buffer']
147-
try:
148-
options, args = getopt.getopt(argv[1:], 'hHvqfcb', long_opts)
149-
except getopt.error as msg:
150-
self.usageExit(msg)
151-
return
152-
153-
for opt, value in options:
154-
if opt in ('-h','-H','--help'):
155-
self.usageExit()
156-
if opt in ('-q','--quiet'):
157-
self.verbosity = 0
158-
if opt in ('-v','--verbose'):
159-
self.verbosity = 2
160-
if opt in ('-f','--failfast'):
161-
if self.failfast is None:
162-
self.failfast = True
163-
# Should this raise an exception if -f is not valid?
164-
if opt in ('-c','--catch'):
165-
if self.catchbreak is None:
166-
self.catchbreak = True
167-
# Should this raise an exception if -c is not valid?
168-
if opt in ('-b','--buffer'):
169-
if self.buffer is None:
170-
self.buffer = True
171-
# Should this raise an exception if -b is not valid?
147+
parser = self._getOptParser()
148+
options, args = parser.parse_args(argv[1:])
149+
self._setAttributesFromOptions(options)
172150

173151
if len(args) == 0 and self.module is None:
174152
# this allows "python -m unittest -v" to still work for
@@ -196,14 +174,14 @@ def createTests(self):
196174
self.test = self.testLoader.loadTestsFromNames(self.testNames,
197175
self.module)
198176

199-
def _do_discovery(self, argv, Loader=loader.TestLoader):
200-
# handle command line args for test discovery
201-
self.progName = '%s discover' % self.progName
202-
import optparse
177+
def _getOptParser(self):
203178
parser = optparse.OptionParser()
204179
parser.prog = self.progName
205180
parser.add_option('-v', '--verbose', dest='verbose', default=False,
206181
help='Verbose output', action='store_true')
182+
parser.add_option('-q', '--quiet', dest='quiet', default=False,
183+
help='Quiet output', action='store_true')
184+
207185
if self.failfast != False:
208186
parser.add_option('-f', '--failfast', dest='failfast', default=False,
209187
help='Stop on first fail or error',
@@ -216,6 +194,28 @@ def _do_discovery(self, argv, Loader=loader.TestLoader):
216194
parser.add_option('-b', '--buffer', dest='buffer', default=False,
217195
help='Buffer stdout and stderr during tests',
218196
action='store_true')
197+
return parser
198+
199+
def _setAttributesFromOptions(self, options):
200+
# only set options from the parsing here
201+
# if they weren't set explicitly in the constructor
202+
if self.failfast is None:
203+
self.failfast = options.failfast
204+
if self.catchbreak is None:
205+
self.catchbreak = options.catchbreak
206+
if self.buffer is None:
207+
self.buffer = options.buffer
208+
209+
if options.verbose:
210+
self.verbosity = 2
211+
elif options.quiet:
212+
self.verbosity = 0
213+
214+
215+
def _do_discovery(self, argv, Loader=loader.TestLoader):
216+
# handle command line args for test discovery
217+
self.progName = '%s discover' % self.progName
218+
parser = self._getOptParser()
219219
parser.add_option('-s', '--start-directory', dest='start', default='.',
220220
help="Directory to start discovery ('.' default)")
221221
parser.add_option('-p', '--pattern', dest='pattern', default='test*.py',
@@ -230,17 +230,7 @@ def _do_discovery(self, argv, Loader=loader.TestLoader):
230230
for name, value in zip(('start', 'pattern', 'top'), args):
231231
setattr(options, name, value)
232232

233-
# only set options from the parsing here
234-
# if they weren't set explicitly in the constructor
235-
if self.failfast is None:
236-
self.failfast = options.failfast
237-
if self.catchbreak is None:
238-
self.catchbreak = options.catchbreak
239-
if self.buffer is None:
240-
self.buffer = options.buffer
241-
242-
if options.verbose:
243-
self.verbosity = 2
233+
self._setAttributesFromOptions(options)
244234

245235
start_dir = options.start
246236
pattern = options.pattern

Lib/unittest/test/test_program.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -131,23 +131,6 @@ def setUp(self):
131131
FakeRunner.test = None
132132
FakeRunner.raiseError = False
133133

134-
def testHelpAndUnknown(self):
135-
program = self.program
136-
def usageExit(msg=None):
137-
program.msg = msg
138-
program.exit = True
139-
program.usageExit = usageExit
140-
141-
for opt in '-h', '-H', '--help':
142-
program.exit = False
143-
program.parseArgs([None, opt])
144-
self.assertTrue(program.exit)
145-
self.assertIsNone(program.msg)
146-
147-
program.parseArgs([None, '-$'])
148-
self.assertTrue(program.exit)
149-
self.assertIsNotNone(program.msg)
150-
151134
def testVerbosity(self):
152135
program = self.program
153136

0 commit comments

Comments
 (0)