我可以通过pytest测试运行line_profiler吗?

时间:2013-09-16 14:14:44

标签: python pytest cprofile

我用

确定了一些长时间运行的pytest测试
py.test --durations=10

我想用line_profiler或cprofile之类的东西来测试其中一个测试。我真的想从测试本身获取配置文件数据,因为pytest设置或拆除很可能是慢速的一部分。

但是考虑到line_profiler或cprofile通常是如何涉及的,我不清楚如何使它们与pytest一起使用。

4 个答案:

答案 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)

要让cProfileline_profiler使用py.test代码,我做了两件事:

  1. 通过调用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
    
  2. 要将pytest_funcarg*()line_profiler等py.test特定功能进行分析,我将它们分成两部分以避免py.testline_profiler之间的混淆:

    def pytest_funcarg__foo(request):
        return foo(request)
    
    @profile
    def foo(request):
    ...
    
  3. 同样的方法适用于memory_profiler

答案 2 :(得分:2)

您是否尝试过pytest-profiling插件?

答案 3 :(得分:1)

我最近写了可能有用的 pytest-line-profiler。它没有经过实战测试,所以请给我反馈(和帮助)。