Нагрузочное тестирование с помощью locust.io
TRANSCRIPT
Нагрузочное тестирование с помощью locust.io
Алексей Стрелков для MoscowDjango, 2015
Кто этот чувак
Помощь зала
7 комментариев!
7 комментариев!(Три из них мои)
Существующие инструменты
ApacheBench httpperfTsung
JMeter The Grinder
Танк
тысячи их! (на самом деле нет)
Анти-фича №1
GUI для описания тестов
Анти-фича №2
Декларативность
Анти-фича №3
Дорогое масштабирование
(не везде)
Фрустрация
Выход есть!
Locust
Создан, чтобы симулировать поведение настоящих пользователей
Фича №1
Тесты описываются
на питоне
Пример
• API какого-нибудь media-ресурса
• /posts/ - все статьи
• /posts/{id} - отдельная статья
• /login - логин пользователя
Пример
$ pip install locustio
Создаем locustfile.py
from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): @task() def get_index(self): self.client.get("/")
from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): @task() def get_index(self): self.client.get("/")
@task() def read_all_posts(self): response = self.client.get("/posts") posts = response.json().get('items') for item in posts: url= "/posts/{}".format(item['id']) self.client.get(url) self.wait()
from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): @task(1) def get_index(self): self.client.get("/")
@task(2) def read_all_posts(self): response = self.client.get("/posts") posts = response.json().get('items') for item in posts: url= "/posts/{}".format(item['id']) self.client.get(url) self.wait()
class UserBehavior(TaskSet): # <...>
class UserBehavior(TaskSet): # <...>
def on_start(self): """ вызывается при старте""" self.login()
class UserBehavior(TaskSet): # <...>
def on_start(self): """ вызывается при старте""" self.login()
def login(self): self.client.post("/login",
{"username":"King Fury", "password":"90s_rule!!"} )
class UserBehavior(TaskSet): # <...>
# <...>
class AndroidUser(HttpLocust): task_set = UserBehavior min_wait=5000 max_wait=9000
Фича №2
Простой и удобный веб-интерфейс
Запускаем
$ locust --host http://pentagon.com
Фича №3
Хакáбельный
Хакабельность
• опенсорсный
• не только HTTP (например XML-RPC)
• реакция на события (успех, неудача)
• переопределение событий
Фича №4
Распределенный и масштабируемый
--slave --master-host=192.168.1.10
--slave --master-host=192.168.1.10
> 2M пользователей
Дальше будет немного методологической нудятины
(совсем чуть-чуть, но это важно)
Не просто тестируйте конечные точки API на прочность
Симулируйте поведение пользователей!
Не просто тестируйте конечные точки API на прочность
RPS* ≠ успех
*requests per second
Успех должен определяться временем ответа и процентом ошибок
Бонус
Побочный эффект – функциональные тесты!
(на самом деле MATS)
Сухой остаток• Все тесты пишутся на питоне
• Удобный веб-интерфейс (можно не использовать)
• Все опенсорсное и хакабельное
• Легко масштабировать
• Вы сами определяете, что считать ошибкой
• Смоук-тесты нахаляву :3
Недостатки• monkey-patching для записи статистики ramp-up периода
• ловит не все ошибки (например из on_start() ), но все есть в stdout
• интервалы между тасками равны интервалам TaskSet.wait()
• мелкие баги (запуск с неправильным протоколом)
Полезные ссылки• locust.io – сайт Locust
• https://github.com/locustio/ - репозиторий Locust
• getpure.org - Pure, уже на iOS, скоро Android (записывайтесь в бета-тестеры!)
• theuntitled.net - присылайте ваш стартап на рассмотрение ([email protected])
Вопросы?