Can I run line_profiler over a pytest test?

后端 未结 3 1800
挽巷
挽巷 2021-02-03 21:28

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

3条回答
  •  醉梦人生
    2021-02-03 21:56

    To get cProfile and line_profiler to work with py.test code, I did two things:

    1. Extended the py.test test code with a call to pytest.main(), which made it executable with the python interpreter as the main driver:

      # 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__)
      

      Now you can run this test without py.test as the main driver using other tools:

      $ kernprof.py -l pytest_test.py
      $ python -m line_profiler pytest_test.py.lprof
      

      or

      $ python -m cProfile pytest_test.py
      
    2. To profile py.test-specific functions such as pytest_funcarg*() with line_profiler I split them in two to avoid confusion between py.test and line_profiler:

      def pytest_funcarg__foo(request):
          return foo(request)
      
      @profile
      def foo(request):
      ...
      

    The same method works for memory_profiler.

提交回复
热议问题