Этот репозиторий содержит набор автоматизированных тестов для API бэкенда "ExpressJS API". Проект был разработан на основе хакатона на тему "Помощь пожилым людям". Цель проекта — обеспечить качество и стабильность API, используемого для управления пользователями, их авторизацией, избранными запросами и запросами о помощи.
Тесты написаны на Python с использованием pytest и Playwright (для взаимодействия с API).
- Основные возможности и покрытие
- Технологический стек
- Структура проекта
- Установка и настройка
- Запуск тестов
- Тестирование с Моками
- Мониторинг и наблюдаемость
- CI/CD
- Планы и улучшения
На данный момент проект включает тесты для следующих эндпоинтов:
- Аутентификация:
POST /api/auth: Вход пользователя и получение JWT токена.
- Управление пользователем:
GET /api/user: Получение данных профиля текущего пользователя.GET /api/user/favourites: Получение списка избранных запросов.POST /api/user/favourites: Добавление запроса в избранное.DELETE /api/user/favourites/{requestId}: Удаление запроса из избранного.
- Запросы помощи:
GET /api/request: Получение списка всех запросов помощи.GET /api/request/{id}: Получение деталей конкретного запроса.POST /api/request/{id}/contribution: Внесение вклада в запрос.
- Язык: Python 3.13+
- Тест-фреймворк: pytest
- HTTP Клиент: Playwright (APIRequestContext)
- Валидация данных: Pydantic
- Отчетность: Allure Report
- Мокирование:
unittest.mock(черезMockHTTPClientиMockFactory) - Менеджер пакетов: uv
- Контейнеризация: Podman / Docker
- Оркестрация: Kubernetes
- Мониторинг: Prometheus + Grafana
- CI/CD: GitHub Actions
.
├── .github/ # Настройки CI/CD (GitHub Actions)
│ ├── actions/ # Reusable actions (setup, run-linters)
│ └── workflows/ # Пайплайны CI/CD
├── api/ # Клиенты API и модели данных (Pydantic)
│ ├── auth/
│ ├── request/
│ └── user/
├── config/ # Конфигурационные файлы (базовый URL, таймауты)
├── core/ # Базовые компоненты фреймворка (HTTP клиент, MockHTTPClient)
├── infra/ # Инфраструктурные конфигурации
│ ├── k8s/ # Kubernetes манифесты и Helm чарт
│ │ ├── Chart.yaml # Helm чарт для Charity API
│ │ ├── charity-api-deployment.yaml # Deployment и Service для API
│ │ ├── charity-api-servicemonitor.yaml # ServiceMonitor для Prometheus
│ │ ├── charity-tests-job.yaml # Job для запуска тестов в K8s
│ │ └── prometheus-rbac.yaml # RBAC для Prometheus
│ └── monitoring/ # Конфигурации мониторинга
│ ├── values-grafana.yaml # Helm values для Grafana
│ └── values-prometheus.yaml # Helm values для Prometheus
├── tests/ # Тестовые сценарии pytest
│ ├── auth/ # Тесты аутентификации (+ test_auth_api_mocked.py)
│ ├── mocks/ # Инфраструктура для мок-тестов (фикстуры, хендлеры, данные)
│ ├── request/ # Тесты запросов помощи (+ test_request_api_mocked.py)
│ └── user/ # Тесты пользователя (+ test_user_api_mocked.py)
├── utils/ # Вспомогательные утилиты (Allure, хелперы, MockFactory)
├── .env.example # Пример файла с переменными окружения
├── .gitignore
├── Containerfile # Containerfile для сборки образа тестов
├── pyproject.toml # Определение зависимостей и конфигурация инструментов
└── README.md-
Клонировать репозиторий:
git clone https://github.com/ZhikharevAl/fake_it_till_you_make_it.git cd fake_it_till_you_make_it -
Установить Python (версия 3.13 или выше).
-
Установить
uv(если еще не установлен):curl -LsSf https://astral.sh/uv/install.sh | sh # Не забудьте добавить путь к uv в PATH
-
Создать и активировать виртуальное окружение:
uv venv source .venv/bin/activate # Linux/macOS # .\.venv\Scripts\activate # Windows
-
Установить зависимости:
uv pip install -e '.[dev]' -
Настроить окружение:
- Создайте файл
.envиз.env.example(если его нет). - Заполните
.envнеобходимыми значениями:API_BASE_URL,TEST_USER_LOGIN,TEST_USER_PASSWORD,INVALID_USER_PASSWORD. Примечание:API_BASE_URLбудет разным для локального запуска, запуска в Podman и Kubernetes (см. ниже).
- Создайте файл
Этот способ подходит, если API сервер запущен локально (не в контейнере).
-
Убедитесь, что API сервер запущен и доступен по адресу, указанному в
API_BASE_URLвашего.envфайла (например,http://localhost:4040). -
Активируйте виртуальное окружение:
source .venv/bin/activate. -
Запустите все тесты:
pytest
-
Запустите только интеграционные тесты:
pytest -m "not mocked" -
Запустите только мок-тесты:
pytest -m mocked
Этот способ запускает и API сервер, и тесты в отдельных контейнерах, соединенных через сеть Podman. Это обеспечивает лучшую изоляцию.
Предварительные требования:
-
Установлен Podman. Инструкции по установке.
-
Собран образ для API сервера (например,
api-server-image:local). Инструкции по сборке. -
Собран образ для тестов из этого репозитория (например,
charity-tests-runner:local):podman build -t charity-tests-runner:local -f Containerfile .
Шаги запуска:
-
Создайте сеть Podman (если еще не создана):
podman network create my-test-net
-
Настройте
.envфайл: Убедитесь, что в вашем.envфайле (в корне этого репозитория)API_BASE_URLуказывает на имя контейнера сервера и его внутренний порт:API_BASE_URL=http://api-server:4040 # Остальные переменные TEST_USER_LOGIN и т.д.
-
Запустите контейнер с API сервером в созданной сети:
podman run -d --rm --network my-test-net --name api-server api-server-image:local
-
Запустите контейнер с тестами в той же сети, передав
.envфайл:podman run --rm --network my-test-net --env-file .env charity-tests-runner:local
-
Остановите контейнер сервера после завершения тестов:
podman stop api-server
Проект поддерживает развертывание в кластере Kubernetes с полным стеком мониторинга.
Предварительные требования:
-
Установлен
kubectlи настроен доступ к кластеру Kubernetes -
Установлен Helm 3
-
Собраны Docker образы для API и тестов:
# Соберите образ API (в репозитории API) docker build -t localhost/charity-api:latest . # Соберите образ тестов (в этом репозитории) docker build -t localhost/charity-tests:latest -f Containerfile .
Развертывание API:
-
Примените манифесты для API:
kubectl apply -f infra/k8s/charity-api-deployment.yaml
-
Создайте секрет для тестовых данных:
kubectl create secret generic charity-tests-secret \ --from-literal=TEST_USER_LOGIN="your_test_user" \ --from-literal=TEST_USER_PASSWORD="your_test_password" \ --from-literal=INVALID_USER_PASSWORD="invalid_password"
-
Запустите тесты как Job:
kubectl apply -f infra/k8s/charity-tests-job.yaml
-
Проверьте результаты тестов:
kubectl logs job/charity-tests
Развертывание мониторинга:
-
Установите kube-prometheus-stack:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update # Установка Prometheus helm install kp-stack prometheus-community/kube-prometheus-stack \ -f infra/monitoring/values-prometheus.yaml \ --namespace monitoring --create-namespace # Установка Grafana (опционально, если не входит в kube-prometheus-stack) helm install grafana grafana/grafana \ -f infra/monitoring/values-grafana.yaml \ --namespace monitoring
-
Примените RBAC для Prometheus:
kubectl apply -f infra/k8s/prometheus-rbac.yaml
-
Активируйте мониторинг API:
kubectl apply -f infra/k8s/charity-api-servicemonitor.yaml
-
Получите доступ к Grafana:
kubectl port-forward -n monitoring svc/grafana 3000:80 # Откройте http://localhost:3000 в браузере # Логин: admin, пароль: см. в секрете grafana
Использование Helm Chart:
Альтернативно, вы можете использовать Helm Chart:
# Установка API через Helm
helm install charity-api ./infra/k8s \
--set image.tag=latest \
--set image.repository=localhost/charity-api-
Сгенерируйте Allure отчет (если запускали с
--alluredir):allure generate allure-results --clean
-
Откройте отчет в браузере:
allure open
Или используйте
allure serve allure-results.
В проекте реализованы мок-тесты для изоляции от реального бэкенда и обеспечения стабильности и скорости CI.
- Подход: Используется мокирование на уровне Python клиента с помощью библиотеки
unittest.mock. Создан специальный классMockHTTPClient(core/mock_http_client.py), который наследуется от реальногоHTTPClient, но перехватывает вызовы методов (get,postи т.д.) и возвращает заранее настроенные ответы (unittest.mock.Mock), имитирующиеAPIResponse. Для удобной настройки этих мок-ответов используется класс-фабрикаMockFactory(utils/mock_factory.py). - Структура: Инфраструктура для моков (фикстуры для
MockHTTPClientиMockFactory, мок-данные) находится в папкеtests/mocks/. Тестовые файлы с моками (например,test_auth_api_mocked.py) используют фикстуры мокированных API клиентов (например,mock_auth_client) иMockFactoryдля настройки ожидаемых ответов перед вызовом методов клиента. - Запуск: Мок-тесты помечены маркером
mocked(pytest -m mocked).
Проект включает полный стек мониторинга для отслеживания производительности API и результатов тестирования:
- Prometheus: Сбор метрик из API приложения через endpoint
/metrics - Grafana: Визуализация метрик и создание дашбордов
- ServiceMonitor: Автоматическое обнаружение сервисов для мониторинга
- Метрики API: API должен экспортировать метрики на endpoint
/metrics(Prometheus format) - ServiceMonitor: Автоматически обнаруживает API сервис и настраивает сбор метрик каждые 15 секунд
- Health checks: Kubernetes проверяет здоровье API через endpoint
/health
- Prometheus UI:
kubectl port-forward -n monitoring svc/kp-stack-kube-prometheus-s-prometheus 9090:9090 - Grafana UI:
kubectl port-forward -n monitoring svc/grafana 3000:80 - API Metrics:
kubectl port-forward svc/charity-api 4040:4040→http://localhost:4040/metrics
# Количество HTTP запросов
http_requests_total{method="GET",status="200",endpoint="/api/user"}
# Время отклика API
http_request_duration_seconds{method="POST",endpoint="/api/auth"}
# Активные соединения
active_connections
# Ошибки аутентификации
auth_failures_total
Проект использует GitHub Actions для автоматической проверки качества кода (linting, formatting, type checking) и запуска тестов при каждом пуше. Используется Podman для запуска интеграционных тестов в контейнеризованном окружении. Результаты тестов и отчет о покрытии загружаются автоматически. Allure отчет генерируется и деплоится на GitHub Pages.
Интеграция в рабочий процесс разработки

graph TB
subgraph "Kubernetes Cluster"
subgraph "default namespace"
API[charity-api<br/>Deployment]
SVC[charity-api<br/>Service]
JOB[charity-tests<br/>Job]
end
subgraph "monitoring namespace"
PROM[Prometheus<br/>Server]
GRAF[Grafana<br/>Dashboard]
SM[ServiceMonitor<br/>charity-api]
end
API --> SVC
JOB -.->|HTTP Tests| SVC
SM -.->|Scrape /metrics| SVC
PROM -.->|Pull metrics| SM
GRAF -.->|Query data| PROM
end
subgraph "External"
DEV[Developer]
CI[GitHub Actions]
end
DEV -.->|kubectl apply| API
DEV -.->|helm install| PROM
CI -.->|Deploy & Test| JOB
- Стабилизация API: Основная цель — добиться стабильной работы реального API сервера, чтобы убрать метки
xfailиз интеграционных тестов. - Расширение покрытия: Добавить больше негативных тестов, тестов на граничные значения для всех эндпоинтов (как интеграционных, так и моков).
- Улучшение обработки данных: Использовать фабрики данных или
fakerдля генерации тестовых данных, особенно в моках. - Автоскейлинг: Настройка HPA (Horizontal Pod Autoscaler) для API при увеличении нагрузки.
- Безопасность: Добавление Network Policies и Pod Security Standards.
- Helm Charts: Развитие Helm Chart для упрощения развертывания всего стека.




