[TIP] Unittesting command line scripts with unittest2?

holger krekel holger at merlinux.eu
Thu Jul 29 02:05:08 PDT 2010


On Thu, Jul 29, 2010 at 00:35 -0400, Jorge Vargas wrote:
> On Thu, Jul 29, 2010 at 12:09 AM, Jorge Vargas <jorge.vargas at gmail.com> wrote:
> > On Wed, Jul 28, 2010 at 6:31 PM, holger krekel <holger at merlinux.eu> wrote:
> >> On Wed, Jul 28, 2010 at 18:10 -0400, Jorge Vargas wrote:
> >>
> > Right now I'm having troubles with the stdout replacement, as it's
> > swallowing up the coverage report :)
> >
> > Seems like tearDown is called after the coverage report, because I get
> > the dots and the ok/failure message.
> >
> I believe the following code should do it right.
> 
> http://paste.ofcode.org/bVdw7bcu74VhaAtaAk33KM
> 
> it
> a- stores a copy of stdout/stderr, so you can assert against it after
> calling made and it echos back to the terminal
> b- it restores the original values just in case something else needs them.
> 
> And I haven't added Holger's suggesting of doing main(args=None) which
> I think it's a good idea.

Seeing your capturing code - here is how the test file would
look like with py.test[0]:

    from <yourpackage> import main

    def test_status(capfd):
        main(["status"])
        out, err = capfd.readouterr()
        assert '.... ok' in out 

This you can run with::

    py.test test_file.py        # to run the test 
    py.test --pdb test_file.py  # to drop into pdb on failures
    py.test --figleaf test_file.py # coverage, requires pytest-figleaf plugin

The 'capfd' resource will take care for correctly capturing/uncapturing;
it is a helper object created for the test function invocation, discovered
by its name.  There also is e.g. 'tmpdir' you can specify which will create 
a unique temporary directory path for your test function invocation.  

best,
holger

[0] website and more info at http://pytest.org 

-- 



More information about the testing-in-python mailing list