2013-05-07 2 views
24

Есть ли способ ускорить повторное выполнение py.test? Кажется, что он тратит много времени на сбор тестов, даже если я укажу, какие файлы выполнять в командной строке. Я знаю, что это не проблема скорости диска, так как запуск pyflakes по всем файлам .py очень быстр.Как ускорить py.test

+1

Вы уверены, что фаза "сбора" замедленна? Попробуйте запустить py.test с помощью '--collectonly'. – alecxe

+1

Да, это медленная коллекция. Я могу видеть, что счетчик сбора начинается с 0, перейдите к 2, затем 7. Я проверил это снова с помощью '--collectonly'. Почтовый сбор: исполнение почти сразу. –

+1

У меня есть проект с более чем 400 тестами, и фаза сбора очень быстро. Кроме того, у меня есть conftest.py, который добавляет много волшебства, множество «параметритов», «светильников» и «pytest_generate_tests», которые делают сбор медленнее, несмотря на то, что сбор в этом случае происходит быстро. Убедитесь, что у вас нет собственного кода, который взаимодействует с фазой сбора данных pytest и замедляет работу. Если нет, вы можете запустить профилировщик как профилировщик строк, чтобы увидеть, какой код медленный. – spinus

ответ

9

Использование опции norecursedirs в pytest.ini или tox.ini может сэкономить много времени на сбор, в зависимости от того, какие другие файлы у вас есть в вашем рабочем каталоге. Время моей коллекции примерно вдвое сокращено для набора из 300 тестов, когда у меня есть это на месте (0,34 с против 0,64).

Если вы уже используете tox, как я, вам просто нужно добавить следующее в вашем tox.ini:

[pytest] 
norecursedirs = docs *.egg-info .git appdir .tox 

Вы также можете добавить его в свободно стоящем pytest.ini файл.

В документации к pytest имеется more details on py.test configuration files.

+0

Дополнительно (или вместо этого) вы должны настроить 'testpaths', то есть' testpaths = src/tests'. Тогда вам не нужно пропускать '.git',' .tox' и т. Д. – blueyed

4

У меня была такая же проблема, когда я звонил py.test в корень моего проекта, а мои тесты были три подкаталога вниз. Сбор составлял 6-7 секунд до 0,4 секунды фактического выполнения теста.

Мое решение изначально было назвать py.test с относительным путем к тестам:

py.test src/www/tests/ 

Если делать это ускоряет сбор также, вы можете добавить относительный путь к тестам на конец addopts установка в вашем pytest.ini - например:

[pytest] 
addopts = --doctest-glob='test_*.md' -x src/www/tests/ 

Это уронил время сбора + исполнения вплоть до около второго, и я все еще мог просто позвонить py.test, как я был раньше.

+1

Лучше всего настроить это с помощью 'testpaths', то есть' testpaths = src/www/tests'. – blueyed

1

С помощью xdist вы можете распараллелить запуск py.test. Это позволяет даже отправлять тесты на удаленные компьютеры. Зависит от вашей настройки, это может ускориться совсем немного :)

2

В специальном случае, когда вы работаете под управлением python cygwin, его обработка файлов в стиле unix выполняется медленно. См. pytest.py test very slow startup in cygwin о том, как ускорить работу в этой особой ситуации.

0

Если у вас есть антивирусное программное обеспечение, попробуйте отключить его. У меня была такая же проблема. Сбор тестов проходил невероятно медленно. Это оказалось моим антивирусным программным обеспечением (Avast), которое вызывало проблему. Когда я отключил антивирусное программное обеспечение, коллекция тестов работала примерно в пять раз быстрее. Я тестировал его несколько раз, включив и выключил антивирус, поэтому я не сомневаюсь, что это было причиной в моем случае.

Смежные вопросы