Can I run line_profiler over a pytest test?

Atlas1j picture Atlas1j · Sep 16, 2013 · Viewed 7.6k times · Source

I have identified some long running pytest tests with

py.test --durations=10

I would like to instrument one of those tests now with something like line_profiler or cprofile. I really want to get the profile data from the test itself as the pytest setup or tear down could well be part of what is slow.

However given how line_profiler or cprofile is typically involved it isn't clear to me how to make them work with pytest.

Answer

Danilo Bargen picture Danilo Bargen · Jun 24, 2014

Run pytest like this:

python3 -m cProfile -o profile -m pytest

You can even pass in optional arguments:

python3 -m cProfile -o profile -m pytest tests/worker/test_tasks.py -s campaigns

This will create a binary file called profile in your current directory. This can be analyzed with pstats:

import pstats
p = pstats.Stats('profile')
p.strip_dirs()
p.sort_stats('cumtime')
p.print_stats(50)

This will print the 50 lines with the longest cumulative duration.