[TIP] Identifying slowest py.test fixtures

Bruno Oliveira nicoddemus at gmail.com
Sat Jul 23 07:42:51 PDT 2016


On Sat, Jul 23, 2016 at 11:29 AM André Caron <andre.l.caron at gmail.com>
wrote:

>
> These two new hooks look like what was looking for, so guess that yes,
> this will help a lot :-)  Do you have a ballpark-figure of how soon is
> "soon"?
>

We are aiming for a release right after EuroPython, probably on the week of
August 1st.

Unfortunately, printing is subject to log capture plug-ins, so it's very
> inconvenient.  I see your example plug-in uses printing as well.
>

Oh sorry, I meant to demonstrate only how to use the new hooks, certainly
printing is not the way to go.

How would I go about printing a report at the end like the `--durations`
> argument does?  I assume I also need to use the `pytest_terminal_summary()`
> hook, but I'm not sure how to pass info from your example
> `pytest_fixture_setup()` to the reporting function.  Any hints?
>

You are right, `pytest_terminal_summary` is the best way to approach this.
As to how to pass the information, aside from using global variables you
could implement a plugin class yourself and register it during
`pytest_configure`:

class MeasureSetupsPlugin:

    def __init__(self):
        self.elapsed_times = {}

    @pytest.hookimpl(hookwrapper=True)
    def pytest_fixture_setup(self, fixturedef, request):
        started = time.time()
        yield
        elapsed = time.time() - started
        self.elapsed_times.setdefault(fixturedef.name, []).append(elapsed)

    def pytest_terminal_summary(self, terminalreporter):
        terminalreporter.write_sep("=", "Fixture setup times (max)")
        for name, times in sorted(self.elapsed_times.items()):
            tr.write_line("%s %.3f" % (name, max(times))

def pytest_configure(config):
    config.pluginmanager.register(MeasureSetupsPlugin(), 'measure_setups')

You could decide to display all matter of different statistics during
pytest_terminal_summary, like number of setups, slowest setup, etc.

Hope this helps!

Cheers,
Bruno.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.idyll.org/pipermail/testing-in-python/attachments/20160723/ed85ffd4/attachment.htm>


More information about the testing-in-python mailing list