[TIP] Getting Weird Coverage Reports

holger krekel holger at merlinux.eu
Fri Nov 25 12:34:24 PST 2011


On Fri, Nov 25, 2011 at 15:56 +0000, Michael Foord wrote:
> On 25/11/2011 12:22, Alfredo Deza wrote:
> >
> >
> >On Fri, Nov 25, 2011 at 7:07 AM, John Anderson <sontek at gmail.com
> ><mailto:sontek at gmail.com>> wrote:
> >
> >
> >
> >    On Fri, Nov 25, 2011 at 6:00 AM, Michael Foord
> >    <michael at voidspace.org.uk <mailto:michael at voidspace.org.uk>> wrote:
> >
> >        On 25/11/2011 11:55, John Anderson wrote:
> >>        I have a base class that all my models inherit from:
> >>
> >>        http://paste2.org/p/1796621
> >>
> >>        and majority of my tests are touching models and I even have
> >>        tests against this specific class:
> >>
> >>        http://paste2.org/p/1796622
> >>
> >>        Yet, when I run a coverage test in py.test:
> >>        py.test --cov-report=term-missing --cov app/models.py
> >>
> >>        app/models      46     23    50%   1-27, 37-40, 59, 65, 76, 82-84
> >>
> >>
> >>        How are lines 1-27 not covered?
> >
> >        All of those lines (imports, class definition, decorator
> >        application) are executed at *import time* (i.e. when the
> >        module is first created). The fact that those lines are
> >        reported as not covered implies to me that you are starting
> >        the test run (and therefore importing your models) before
> >        coverage is started.
> >
> >        You need to run your tests under the coverage tool, or ensure
> >        that coverage tracing is started before any imports execute.
> >
> >
> >    Ahh, So I have some py.test configuration, so that a test database
> >    is set to a clean slate when I start my tests, I thought
> >    pytest_configure would be late enough, but I guess its not?  This
> >    is what i'm doing:
> >
> >    from test_settings import settings
> >    from pyramid.config import Configurator
> >    from app.models import register_models
> >    from app.models import Entity
> >
> >
> >    def pytest_configure():
> >        url = settings.get('sqlalchemy.url')
> >        echo = settings.get('sqlalchemy.echo')
> >
> >        print 'Creating the tables on the test database %s' % url
> >
> >        config = Configurator(settings=settings)
> >
> >        register_models(config)
> >
> >        Entity.setup_database(url, echo=echo, drop=True, create=True)
> >
> >
> >Hi John,
> >
> >This is a similar problem that the Pecan [0] framework had
> >(still?) for exposing configuration setup for the actual
> >application
> >at test time.
> >
> >The problem is (as you suspect) that the configuration in
> >pytest_configure happens *before* any of the mechanisms for
> >coverage start.
> 
> It is worth filing an issue against py.test. It may be possible to
> fix in future versions so that coverage tracing starts before
> configuration is done.

Indeed!  Probably Meme could just enhance the coverage plugin by 
adding a "@pytest.mark.tryfirst" before its own pytest_configure() which
should be enough to get coverage started earlier.

best,
holger



More information about the testing-in-python mailing list