我用
确定了一些长时间运行的pytest测试py.test --durations=10
我想用line_profiler或cprofile之类的东西来测试其中一个测试。我真的想从测试本身获取配置文件数据,因为pytest设置或拆除很可能是慢速的一部分。
但是考虑到line_profiler或cprofile通常是如何涉及的,我不清楚如何使它们与pytest一起使用。
答案 0 :(得分:21)
像这样运行pytest:
python -m cProfile -o profile $(which py.test)
您甚至可以传递可选参数:
python -m cProfile -o profile $(which py.test) \
tests/worker/test_tasks.py -s campaigns
这将在当前目录中创建一个名为profile
的二进制文件。这可以用pstats进行分析:
import pstats
p = pstats.Stats('profile')
p.strip_dirs()
p.sort_stats('cumtime')
p.print_stats(50)
这将打印50行,累计持续时间最长。
答案 1 :(得分:7)
要让cProfile
和line_profiler
使用py.test
代码,我做了两件事:
通过调用pytest.main()来扩展py.test测试代码,这使得python解释器可以作为主驱动程序执行:
# pytest_test.py:
@profile # for line_profiler only
def test_example():
x = 3**32
assert x == 1853020188851841
# for profiling with cProfile and line_profiler
import pytest
pytest.main(__file__)
现在,您可以使用其他工具在不使用py.test
作为主驱动程序的情况下运行此测试:
$ kernprof.py -l pytest_test.py
$ python -m line_profiler pytest_test.py.lprof
或
$ python -m cProfile pytest_test.py
要将pytest_funcarg*()
和line_profiler
等py.test特定功能进行分析,我将它们分成两部分以避免py.test
和line_profiler
之间的混淆:
def pytest_funcarg__foo(request):
return foo(request)
@profile
def foo(request):
...
同样的方法适用于memory_profiler。
答案 2 :(得分:2)
您是否尝试过pytest-profiling插件?
答案 3 :(得分:1)
我最近写了可能有用的 pytest-line-profiler。它没有经过实战测试,所以请给我反馈(和帮助)。