[Python-Dev] unittest argv

John Keyes john at integralsource.com
Mon May 1 19:11:50 CEST 2006


On 5/1/06, Guido van Rossum <guido at python.org> wrote:
> Wouldn't this be an incompatible change? That would make it a no-no.
> Providing a dummy argv[0] isn't so hard is it?

It would be incompatible with existing code, but that code is
already broken (IMO) by passing a dummy argv[0].  I don't
think fixing it would affect much code, because normally
people don't specify the '-q' or '-v' in code, it is almost
exclusively used on the command line.

The only reason I came across it was that I was modifying
an ant task (py-test) so it could handle all of the named
arguments that TestProgram.__init__ supports.

If the list index code can't change, at a minimum the default value
for argv should change from None to sys.argv.

Are the tests for unittest.py?

Thanks,
-John K

>
> On 4/30/06, John Keyes <john at integralsource.com> wrote:
> > Hi,
> >
> > main() in unittest has an optional parameter called argv.  If it is not
> > present in the invocation, it defaults to None.  Later in the function
> > a check is made to see if argv is None and if so sets it to sys.argv.
> > I think the default should be changed to sys.argv[1:] (i.e. the
> > command line arguments minus the name of the python file
> > being executed).
> >
> > The parseArgs() function then uses getopt to parse argv.  It currently
> > ignores the first item in the argv list, but this causes a problem when
> > it is called from another python function and not from the command
> > line.  So using the current code if I call:
> >
> > python mytest.py -v
> >
> > then argv in parseArgs is ['mytest.py', '-v']
> >
> > But, if I call:
> >
> > unittest.main(module=None, argv=['-v','mytest'])
> >
> > then argv in parseArgs is ['mytest'], as you can see the verbosity option is
> > now gone and cannot be used.
> >
> > Here's a diff to show the code changes I have made:
> >
> > 744c744
> > <                  argv=None, testRunner=None, testLoader=defaultTestLoader):
> > ---
> > >                  argv=sys.argv[1:], testRunner=None, testLoader=defaultTestLoader):
> > 751,752d750
> > <         if argv is None:
> > <             argv = sys.argv
> > 757c755
> > <         self.progName = os.path.basename(argv[0])
> > ---
> > > #        self.progName = os.path.basename(argv[0])
> > 769c767
> > <             options, args = getopt.getopt(argv[1:], 'hHvq',
> > ---
> > >             options, args = getopt.getopt(argv, 'hHvq',
> >
> > You may notice I have commented out the self.progName line.  This variable
> > is not used anywhere in the module so I guess it could be removed.  To
> > keep it then conditional check on argv would have to remain and be moved after
> > the self.progName line.
> >
> > I hope this makes sense, and it's my first post so go easy on me ;)
> >
> > Thanks,
> > -John K
> > _______________________________________________
> > Python-Dev mailing list
> > Python-Dev at python.org
> > http://mail.python.org/mailman/listinfo/python-dev
> > Unsubscribe: http://mail.python.org/mailman/options/python-dev/guido%40python.org
> >
>
>
> --
> --Guido van Rossum (home page: http://www.python.org/~guido/)
>


More information about the Python-Dev mailing list