2013-09-16 18 views
13

mam zidentyfikować niektóre długo działające testy pytest zCzy mogę uruchomić line_profiler za pomocą testu pytającego?

py.test --durations=10 

Chciałbym instrumentem jeden z tych testów teraz z czymś line_profiler lub cprofile. Naprawdę chcę uzyskać dane profilu z samego testu, ponieważ konfiguracja Pythona może być częścią powolnego działania.

Jednak biorąc pod uwagę, w jaki sposób zazwyczaj występuje element line_profiler lub cprofile, nie jest dla mnie jasne, jak sprawić, by działały z pytestem.

Odpowiedz

6

Aby uzyskać cProfile i line_profiler do pracy z kodem py.test, zrobiłem dwie rzeczy:

  1. przedłużyła py.test kodu testowego z wezwaniem do pytest.main(), co sprawiło, że wykonywalny z interpreter Pythona jako głównego kierowcy:

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

    teraz można uruchomić ten test bez py.test jako głównego kierowcę za pomocą innych narzędzi:

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

    lub

    $ python -m cProfile pytest_test.py 
    
  2. Do profilu py.test specyficzne funkcje, takie jak pytest_funcarg*() z line_profiler podzielić je na dwie części, aby uniknąć nieporozumień pomiędzy py.test i line_profiler:

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

Ta sama metoda działa dla memory_profiler.

18

Run pytest tak:

python -m cProfile -o profile $(which py.test) 

Można nawet przejść w opcjonalnych argumentów:

python -m cProfile -o profile $(which py.test) \ 
    tests/worker/test_tasks.py -s campaigns 

To utworzy plik binarny o nazwie profile w bieżącym katalogu. Można to przeanalizować za pomocą pstats:

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

Spowoduje to wydrukowanie 50 wierszy o najdłuższym łącznym czasie trwania.

+0

Próbowałem uruchomić to działa w systemie Windows. Ale jeśli nie powiedzie się przy pierwszym poleceniu, mówiąc: "nie ma takiego pliku katalogu" (który "" .Próbowałem podać bezwzględną ścieżkę do pliku binarnego py.test.exe, ale dostaję inny błąd: "TypeError: compile() spodziewany ciąg bez pustych bajtów ". Mam profilowanie uruchomione przez dodanie wywołania pytest.main w module testowym Wszelkie sugestie jak uruchomić go z wiersza poleceń w systemie Windows? – Kanguros

+0

Z linii komend:' 'python -c" import pstats; pstats.Stats ("profil"). strip_dirs(). sort_stats ("cumtime"). print_stats (50) "' ' – jwhitlock