Python: Автоматическое тестирование
Теория: Фреймворк Pytest
Когда тестов и файлов с тестами становится много, возникают новые вопросы:
- Как группировать тесты?
- Как запустить на выполнение все тесты из одной директории?
- Если тестов очень много и они долгие, можно ли запустить их параллельно?
Для решения этих вопросов используют специальные тестовые фреймворки. Они помогают организовать структуру тестов и дают много полезного, например, удобный вывод. С большинством из этих возможностей мы познакомимся далее по курсу.
В Python-мире популярен фреймворк Pytest, на котором мы сосредоточимся в этом уроке.
Что такое Pytest
Python — один из немногих языков, в стандартную библиотеку которого уже включен тестовый фреймворк (он называется unittest). Было бы логично рассмотреть его здесь, но он глубоко завязан на классы, которые вы можете не знать. Поэтому здесь мы рассматриваем Pytest, который все равно популярнее встроенного фреймворка.
Далее мы создадим проект с нуля и добавим в него тесты.
Настройка и запуск
Создайте где-нибудь на вашем компьютере директорию с названием hexlet_pytest. Зайдите в нее и выполните команды:
Мы инициализируем новый проект и добавляем в него директорию для будущих тестов tests. Установите pytest с помощью uv в девелопмент зависимости с помощью команды uv add --dev pytest. Проверьте, что все работает правильно:
Также добавьте в pyproject.toml блок. В строчках ниже мы задаем систему сборки пакета, а также указываем по какому пути взять файлы, что попадут в пакет. :
Теперь добавим немного исходного кода. Создайте вложенную директорию hexlet_pytest, где будет храниться код проекта. Создайте в ней файл example.py.
В итоге, у вас должна получиться следующая структура:
Внутри файла запишем код:
Pytest ожидает, что тесты находятся в директории tests, которую располагают в корне проекта. Внутри этого каталога можно создавать любую структуру — Pytest найдет все тесты, которые там лежат.
Именование файлов с тестами должно быть таким: test_<name>.py. Как правило, в этой записи <name> соответствует имени файла, который тестируется.
Напишем наш первый тест. Создайте файл tests/test_example.py со следующим содержимым:
Далее мы разберем структуру этого файла, а пока попробуем запустить тест на выполнение:
Структура
Давайте еще раз посмотрим на файл с тестом:
Каждый тест внутри файла — это функция, начинающаяся с префикса test_. Тестовых функций можно делать любое количество, все уже зависит от сложности тестируемого кода. Внутри функций проверки выполняются с помощью инструкции assert.
Несмотря на схожесть со встроенной инструкцией в Python, инструкция assert в Pytest работает немного по-другому. Попробуйте внести ошибку в исходную функцию и запустите тесты заново:
Вывод Pytest содержит не только исходное утверждение, но и результат вызова функции:
- Плюсом помечается то, что пришло
- Минусом помечается то, что ожидалось
Благодаря такому выводу, найти и исправить ошибку становится значительно проще.
В работе Pytest есть одна особенность. Если понадобится распечатать что-то на экран, то Pytest ничего не выведет. По умолчанию он перехватывает и подавляет весь вывод. Отключить это поведение можно с помощью флага -s:

