Ответ
Pytest — мощный и гибкий фреймворк для написания тестов на Python. Его ключевые возможности, которые я активно применяю:
1. Структура и фикстуры (Fixtures):
Фикстуры (@pytest.fixture) — основа для управления тестовыми данными и состоянием. Они обеспечивают setup/teardown логику.
import pytest
import requests
@pytest.fixture
def api_client():
# Setup: создание клиента API
client = APIClient(base_url="https://api.example.com")
yield client # передача контроля тесту
# Teardown: закрытие сессии (выполнится после теста)
client.close()
@pytest.fixture
def create_test_user(api_client):
# Фикстура может зависеть от другой фикстуры
user = api_client.create_user(name="Test")
yield user
api_client.delete_user(user.id) # очистка после теста
2. Параметризация тестов: Позволяет запустить один тест с разными наборами входных данных и ожидаемых результатов, что увеличивает покрытие.
import pytest
@pytest.mark.parametrize("test_input,expected", [
("3+5", 8),
("2*4", 8),
("6/2", 3.0),
])
def test_eval(test_input, expected):
assert eval(test_input) == expected
3. Плагины и интеграции:
- pytest-xdist: Для параллельного запуска тестов, что значительно ускоряет выполнение suite.
- pytest-html / allure-pytest: Для генерации наглядных отчетов о выполнении тестов.
- pytest-cov: Для интеграции с coverage.py и измерения покрытия кода тестами.
- pytest-mock: Упрощает использование
unittest.mockдля изоляции тестируемого кода.
4. Гибкие ассерты и отладочная информация: Pytest предоставляет детальный вывод при падении assert'а, показывая значения переменных, что упрощает отладку.
5. Маркировка и селективный запуск:
Маркеры (@pytest.mark.smoke, @pytest.mark.slow) позволяют категоризировать тесты и запускать только определенные группы.
pytest -m "smoke" # запустить только smoke-тесты
pytest -v -k "login" # запустить тесты, в имени которых есть "login"
6. Интеграция с CI/CD:
Легко интегрируется с Jenkins, GitHub Actions, GitLab CI через вызов команды pytest и обработку exit-кода.