Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Загрузочное тестирование
Загрузочное тестирование (Load Testing) — это вид тестирования производительности, при котором к системе применяется нагрузка, близкая к предполагаемой нормальной нагрузке в продакшене, чтобы оценить поведение приложения при реальных условиях использования. Это критически важный процесс для обеспечения надежности и масштабируемости современных веб-приложений.
Основные цели загрузочного тестирования
Основные задачи, которые решаются при проведении загрузочного тестирования:
- Оценка производительности — измерение времени отклика, пропускной способности и других метрик при ожидаемой нагрузке
- Определение узких мест — выявление частей системы, которые замедляют работу при увеличении нагрузки
- Прогнозирование отказов — выяснение, при какой нагрузке система начнет сбоить
- Оптимизация ресурсов — планирование инфраструктуры и выделения ресурсов
- Проверка надежности — убедиться, что система стабильно работает длительное время под нагрузкой
Инструменты для загрузочного тестирования
В экосистеме Python существуют несколько популярных инструментов:
Locust — наиболее популярное решение:
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(1, 5)
@task
def index(self):
self.client.get("/")
@task(3)
def view_items(self):
self.client.get("/api/items")
@task(2)
def create_item(self):
self.client.post("/api/items", json={
"name": "Test Item",
"description": "Test"
})
Вы запускаете тест командой: locust -f locustfile.py --host=http://localhost:8000
Apache JMeter — более сложный инструмент с GUI, поддерживающий различные протоколы.
wrk и hey — легковесные утилиты для быстрого бенчмарка.
Типы нагрузочного тестирования
Существуют различные стратегии нагрузочного тестирования:
- Базовое загрузочное тестирование — постоянная нагрузка на протяжении определенного времени
- Стресс-тестирование — постепенное увеличение нагрузки до отказа системы
- Тестирование выносливости (soak testing) — нормальная или чуть выше средней нагрузка в течение длительного периода
- Пиковое тестирование — внезапное увеличение нагрузки до пиковых значений
- Spike testing — резкие и короткие всплески нагрузки
Практический пример с использованием Locust
from locust import HttpUser, task, between, events
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()
class ApiUser(HttpUser):
wait_time = between(2, 5)
def on_start(self):
"""Вызывается при запуске пользователя"""
logger.info("User started")
# Можно выполнить login
response = self.client.post("/api/auth/login", json={
"username": "test",
"password": "test123"
})
self.token = response.json().get("token")
@task(10)
def list_items(self):
headers = {"Authorization": f"Bearer {self.token}"}
self.client.get("/api/items", headers=headers)
@task(5)
def get_item_details(self):
item_id = 42
headers = {"Authorization": f"Bearer {self.token}"}
self.client.get(f"/api/items/{item_id}", headers=headers)
@task(3)
def create_item(self):
headers = {"Authorization": f"Bearer {self.token}"}
self.client.post("/api/items", json={
"name": "Load Test Item",
"price": 99.99
}, headers=headers)
@events.test_start.add_listener
def on_test_start(environment, **kwargs):
logger.info("=== Загрузочное тестирование началось ===")
@events.test_stop.add_listener
def on_test_stop(environment, **kwargs):
logger.info("=== Загрузочное тестирование завершено ===")
Ключевые метрики
При проведении загрузочного тестирования измеряются следующие метрики:
- Response Time (время отклика) — среднее, минимальное и максимальное время ответа сервера
- Throughput (пропускная способность) — количество успешных запросов в секунду
- Error Rate (процент ошибок) — доля неудачных запросов
- CPU и Memory Usage — использование процессора и памяти сервера
- Database connections — количество открытых подключений к БД
- P95/P99 latency — 95-й и 99-й процентили времени отклика
Интеграция с CI/CD
# Пример использования Locust результатов в CI/CD
from locust.contrib.statistics import StatsEntry
if environment.stats.total.fail_per_sec > 0.05:
# Более 5% ошибок — тест не прошел
exit(1)
if environment.stats.total.get_response_time_percentile(0.95) > 500:
# P95 больше 500ms — тест не прошел
exit(1)
Загрузочное тестирование — это необходимая практика в разработке надежных приложений. Оно помогает выявить проблемы на ранних этапах и обеспечить хорошее пользовательское восприятие в условиях высокой нагрузки.