Эта статья расскажет о нескольких методах, которые можно использовать для ускорения работы набора тестов с использованием Pytest.
Скачать одну из самых популярных книг по тестированию "Как тестируют в Google"
1. Параллелизация
Наборы тестов Pytest работают последовательно, запуская каждый тест по очереди. Это подходит для небольших или быстрых тестов, но может быть затруднительно для больших и сложных проектов. Простой способ решить эту проблему — использовать плагин pytest-xdist. Он позволяет выполнять тесты параллельно, распределив их между несколькими CPU.
pip install pytest-xdist pytest -n auto
После установки необходимо добавить -n auto
к текущей команде pytest
, чтобы автоматически создать несколько рабочих процессов, равных количеству доступных ядер CPU.
# With pytest-xdist 460 passed, 7 skipped, 224 warnings, 25 subtests passed in 68.64s (0:01:08) # Running normally 460 passed, 7 skipped, 26 warnings, 25 subtests passed in 216.57s (0:03:36)
2. Профилирование
Невозможно исправить проблему, если вы не знаете, где она находится, или вообще не догадываетесь о её существовании. Вместо ожидания выполнения медленных тестов регулярно проверяйте их, чтобы выявить, есть ли что-то необычное. Это легко сделать с Pytest.
pytest --durations 10
Аргумент --durations 10
запустит тесты как обычно, но затем выведет 10 самых медленных тестов для дальнейшего анализа. Это покажет, была ли проблема связана с настройкой теста или с самим тестом. Число 10 можно заменить на любое количество тестов, которое необходимо отобразить.
slowest 10 durations 20.57s setup a/test_foo.py 8.69s call b/test_foo.py 8.64s call a/test_foo.py 7.09s setup a/test_foo.py 7.03s setup b/test_foo.py 5.63s setup a/test_foo.py 5.36s call b/test_foo.py 5.33s call a/test_foo.py 5.27s call b/test_foo.py 5.26s call b/test_foo.py
Некоторые тесты действительно отнимают много времени. Например, если настройка теста затруднительна или выполняются сложные вычисления. Любые неожиданно медленные тесты могут быть либо результатом какой-то глупой ошибки, которую легко исправить, либо потребуют дополнительного и индивидуального профилирования. Для этого можно использовать pytest-profiling или функциональность cProfile, включённую в стандартную библиотеку Python.
3. Пропуск медленных тестов
Если некоторые действительно медленные тесты достаточно стабильны и не склонны к изменениям или сбоям, то их можно пропустить во время локальной разработки, а затем снова включить при необходимости.
Это легко осуществить с помощью расширения pytest-skip-slow. После его установки можно отметить определённые тесты с помощью @pytest.mark.slow
, что приведёт к их пропуску во время обычного запуска тестов. Если необходимо запустить весь набор тестов, включая медленные, просто передайте аргумент --slow
в команду pytest
.
Заключение
Предложенные выше рекомендации могут улучшить и ускорить выполнение тестов. Для получения полной информации о других проверках, которые можно выполнить для ускорения работы тестов, ознакомьтесь с репозиторием по ссылке.
Перевод статьи «Pytest — How to speed up your tests».