11"""Unittest main program"""
22
33import sys
4+ import optparse
45import os
56
67from . import loader , runner
@@ -76,6 +77,7 @@ def _convert_name(name):
7677def _convert_names (names ):
7778 return [_convert_name (name ) for name in names ]
7879
80+
7981class 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
0 commit comments