Как ускорить выполнение тестов Pytest

Эта статья расскажет о нескольких методах, которые можно использовать для ускорения работы набора тестов с использованием 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».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *