Введение
Тестирование — неотъемлемая часть разработки. Без тестов сложно быть уверенным, что код работает правильно и не сломается при следующем обновлении. Pytest – тестирование — это современный, гибкий и удобный фреймворк для автоматического тестирования на Python.
Pytest завоевал популярность благодаря лаконичному синтаксису, расширяемости и мощной системе фикстур. Он превосходит стандартный unittest
по удобству и скорости разработки.
Установка и первый тест
Установка:
Создайте файл test_example.py
:
Запуск:
Pytest сам найдёт все тесты, начинающиеся с test_
.
Структура и запуск тестов
-
Тестовые файлы:
test_*.py
или*_test.py
-
Тестовые функции:
def test_...():
Запуск:
Ассерты и проверки
В Pytest можно использовать обычные assert
:
Проверка исключений:
Фикстуры (fixtures)
Фикстуры позволяют подготовить данные, создать подключения и очистить ресурсы после теста:
Область действия:
-
function
— по умолчанию -
module
,class
,session
Параметризация тестов
Группировка и маркировка тестов
Запуск по марке:
Пропуск и ожидание ошибок
Тестирование исключений
Контекстный менеджер:
Mock-объекты и monkeypatch
Работа с временными файлами и каталогами
Интеграция с CI/CD (GitHub Actions, GitLab)
GitHub Actions:
GitLab:
Плагины и расширения Pytest
-
pytest-cov
— покрытие тестами -
pytest-django
— интеграция с Django -
pytest-asyncio
— асинхронные тесты
Установка:
Запуск с отчётом покрытия:
Отладка и вывод ошибок
-
-v
— подробный вывод -
-s
— отключение подавления stdout -
--tb=short|no|line
— настройка traceback
Сравнение с unittest и другими фреймворками
Фреймворк | Ассерты | Фикстуры | Параметры | Расширения | Простота |
---|---|---|---|---|---|
Pytest | Да | Да | Да | Много | Очень высокая |
unittest |
Нет | Частично | Нет | Мало | Средняя |
nose2 |
Да | Да | Да | Меньше | Умеренная |
Часто задаваемые вопросы (FAQ)
1. Что такое Pytest?
Это фреймворк для написания и запуска автоматических тестов на Python.
2. В чём преимущества Pytest?
Простой синтаксис, фикстуры, параметризация, мощные плагины.
3. Как запускать отдельные тесты?pytest test_file.py::test_func
4. Поддерживает ли Pytest асинхронность?
Да, через плагин pytest-asyncio
.
5. Где хранятся фикстуры?
В conftest.py
— общий файл фикстур для всех тестов.
6. Можно ли использовать Pytest с Django, FastAPI?
Да, с помощью соответствующих плагинов.
Полный справочник по ключевым функциям и модулям библиотеки Pytest для Python
Установка
Запуск тестов:
Структура и правила именования
Правило | Описание |
---|---|
Файл должен начинаться с test_ |
Например: test_math.py |
Функции должны начинаться с test_ |
Например: def test_add(): ... |
Классы тестов называются Test* и не должны иметь __init__() |
Основные утверждения (assert)
Утверждение | Проверка |
---|---|
assert x == y |
Равенство |
assert x != y |
Неравенство |
assert x in y |
Вхождение |
assert condition |
Истинность |
assert isinstance(x, T) |
Проверка типа |
Pytest сам формирует понятные сообщения об ошибках при падении assert
.
Фикстуры (@pytest.fixture
)
Назначение | Описание |
---|---|
@pytest.fixture |
Определяет подготовку данных для теста |
Автоматически передаются в тестовые функции по имени параметра | |
Можно использовать yield для финализации |
Автоматический запуск кода до и после теста
Параметризация
Декоратор | Описание |
---|---|
@pytest.mark.parametrize("param", [...]) |
Повторяет тест с разными значениями |
Группировка в классы
Скип и ожидание ошибок
Декоратор | Описание |
---|---|
@pytest.mark.skip |
Пропустить тест |
@pytest.mark.skipif(cond, reason="...") |
Пропустить при условии |
@pytest.mark.xfail |
Ожидается, что тест упадет |
Проверка исключений
Команды CLI (важные параметры)
Команда | Описание |
---|---|
-v |
Подробный вывод |
-q |
Краткий вывод |
--maxfail=1 |
Остановиться после первой ошибки |
--tb=short/line/no |
Уровень отображения трассировки |
-k "substr" |
Запуск тестов по подстроке в имени |
-m marker |
Фильтрация по маркерам |
Маркеры (@pytest.mark.*
)
Маркер | Назначение |
---|---|
@pytest.mark.slow |
Пользовательский маркер |
@pytest.mark.db |
Для группировки тестов |
Указывается через -m в CLI |
pytest -m "db and not slow" |
Конфигурация (pytest.ini
)
Плагины
Плагин | Назначение |
---|---|
pytest-cov |
Покрытие кода |
pytest-mock |
Моки через monkeypatch и mocker |
pytest-django |
Интеграция с Django |
pytest-asyncio |
Поддержка async/await |