Фреймворк автоматизированного тестирования REST API Яндекс.Диска на Python 3 + pytest.
Демонстрация подхода к интеграционному тестированию внешнего API:
- Слоистая архитектура (
BaseClient→ доменные клиенты → тесты). - Валидация контрактов ответов через Pydantic-модели.
- Асинхронные операции (polling статуса).
- Ретраи с учётом идемпотентности HTTP-методов.
- Структурированное логирование с маскировкой секретов.
- CI/CD с отчётом Allure.
- Python 3.10+
- OAuth-токен Яндекс.Диска (см. раздел «Получение токена»)
git clone https://github.com/<username>/yandex-disk-api-tests.git
cd yandex-disk-api-testspython -m venv .venv
source .venv/bin/activate # Linux/macOS
# .venv\Scripts\activate # Windows
pip install -r requirements.txt
pip install -r requirements-dev.txtСкопируйте .env.example в .env и заполните токен:
cp .env.example .envСодержимое .env:
API_TOKEN=your_yandex_oauth_token_hereДополнительные переменные (опционально, если нужно переопределить дефолты из config/settings.py):
# BASE_URL=https://cloud-api.yandex.net
# API_VERSION=v1-
Зарегистрируйте приложение на oauth.yandex.ru.
-
Укажите
Redirect URI: https://oauth.yandex.ru/verification_code. -
Выберите права доступа:
cloud_api:disk.read,cloud_api:disk.write,cloud_api:disk.info. -
После регистрации скопируйте
Client ID. -
Перейдите по ссылке (подставив свой
client_id):https://oauth.yandex.ru/authorize?response_type=token&client_id=<YOUR_CLIENT_ID> -
Подтвердите доступ. Из адресной строки скопируйте значение
access_token. -
Вставьте его в
.envкакAPI_TOKEN.
⚠️ Важно: используйте изолированный тестовый аккаунт, а не личный.
# Все тесты
pytest
# Конкретный файл
pytest tests/test_post_upload.py
# Конкретный тест
pytest tests/test_post_upload.py::TestPostUploadFromUrl::test_upload_from_url_success
# С Allure-отчётом
pytest --alluredir=allure-results
allure serve allure-resultsmake install # установить зависимости
make test # запустить тесты
make lint # запустить ruff
make allure # сгенерировать и открыть Allure-отчёт.
├── api
│ ├── base_client.py # Базовый клиент, управляет сессией и ретраями
│ ├── clients
│ │ └── disk_client.py # Кастомный клиент, реализует методы API
│ ├── hooks.py # хуки для логгирования запросов и ответов
│ └── routes
│ └── disk_routes.py # Маршруты кастомного клиента, предполагается, что клиентов может быть несколько
├── config
│ └── settings.py
├── conftest.py # фикстуры общего назначения
├── env.example
├── Makefile
├── pyproject.toml
├── README.md
├── requirements-dev.txt
├── requirements.txt
├── schemas
│ ├── base.py
│ └── models.py
└── tests
├── conftest.py # фикстуры для тестов
└── test_disk # тесты на API YADisk
└── test_disk_general.py
BaseClient— транспортный слой. Отвечает только за HTTP: сессия, URL, авторизация, таймауты, ретраи, логирование. Не знает про домены.DiskClient— доменный слой. Знает маршруты и модели Яндекс.Диска. Инкапсулирует polling асинхронных операций.- Тесты — слой проверок. Используют доменный клиент, валидируют модели и семантику.
- Сквозные заботы в одном месте. Ретраи, логирование, таймауты — в
BaseClient. - Идемпотентность. GET/PUT/DELETE ретраят 5xx, POST/PATCH — нет.
- Композиция, не наследование.
DiskClient(base_client). - Явное лучше неявного. Ожидаемый статус передаётся в метод, а не угадывается.
| Переменная | Обязательна | Дефолт | Описание |
|---|---|---|---|
API_TOKEN |
✅ | — | OAuth-токен Яндекс.Диска |
BASE_URL |
❌ | https://cloud-api.yandex.net |
Базовый URL API |
API_VERSION |
❌ | v1 |
Версия API |
Секреты хранятся только в .env (локально) или в GitHub Secrets (CI). .env в .gitignore.
Все запросы логируются через хук requests в JSON-совместимом формате:
- Метод, URL, статус, длительность.
- Заголовки запроса с маскировкой
Authorization,Cookie. - Тело запроса/ответа с маскировкой
access_token,password,secret. - Усечение длинных тел (500 символов).
GitHub Actions workflow .github/workflows/checks.yml запускается на каждый push и PR:
- Устанавливает зависимости.
- Запускает
pytestс Allure-отчётом. - Публикует отчёт на GitHub Pages.
allure-pytest (Python-плагин) генерирует JSON-результаты, но для просмотра HTML-отчёта нужен Allure Commandline — отдельная Java-утилита, которая не устанавливается через pip.
brew install allureПроверка:
allure --versionВ официальных репозиториях Ubuntu пакета allure нет (одноимённый пакет — это игра). Установи вручную:
# 1. Java (если ещё нет)
sudo apt install default-jre
# 2. Скачать последний релиз
wget https://github.com/allure-framework/allure2/releases/download/2.32.0/allure-2.32.0.tgz
# 3. Распаковать и переместить
tar -xzf allure-2.32.0.tgz
sudo mv allure-2.32.0 /opt/allure
# 4. Симлинк в PATH
sudo ln -s /opt/allure/bin/allure /usr/local/bin/allureПроверка:
allure --versionpip install allure-pytestИли через зависимости проекта:
pip install -r requirements-dev.txt# 1. Сгенерировать JSON-результаты
uv run pytest --alluredir=allure-results
# 2. Построить и открыть HTML-отчёт в браузере
allure serve allure-results
⚠️ allure serveзапускается напрямую, безuv— это внешняя Java-утилита, а не Python-пакет.
Если нужно сохранить отчёт как папку с HTML (например, для публикации):
allure generate allure-results -o allure-report --cleanОткрыть результат:
allure open allure-reportmake allureВ CI — отчёт публикуется автоматически на https://<username>.github.io/<repo>/.
- Тесты не идемпотентны в части использования Диска: создают и удаляют файлы. Не запускайте против продакшн-аккаунта с важными данными.
- Троттлинг загрузки: Яндекс ограничивает скорость для неофициальных клиентов. Если тесты начнут тормозить — см.
User-AgentвBaseClient. - Токен долгоживущий, но при смене пароля Яндекс-аккаунта — отзывается.