Download - Нагрузочное тестирование с помощью locust.io
![Page 1: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/1.jpg)
Нагрузочное тестирование с помощью locust.io
Алексей Стрелков для MoscowDjango, 2015
![Page 2: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/2.jpg)
Кто этот чувак
![Page 3: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/3.jpg)
Помощь зала
![Page 4: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/4.jpg)
7 комментариев!
![Page 5: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/5.jpg)
7 комментариев!(Три из них мои)
![Page 6: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/6.jpg)
Существующие инструменты
ApacheBench httpperfTsung
JMeter The Grinder
Танк
тысячи их! (на самом деле нет)
![Page 7: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/7.jpg)
Анти-фича №1
GUI для описания тестов
![Page 8: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/8.jpg)
Анти-фича №2
Декларативность
![Page 9: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/9.jpg)
Анти-фича №3
Дорогое масштабирование
(не везде)
![Page 10: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/10.jpg)
Фрустрация
![Page 11: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/11.jpg)
Выход есть!
![Page 12: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/12.jpg)
Locust
Создан, чтобы симулировать поведение настоящих пользователей
![Page 13: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/13.jpg)
Фича №1
Тесты описываются
на питоне
![Page 14: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/14.jpg)
Пример
• API какого-нибудь media-ресурса
• /posts/ - все статьи
• /posts/{id} - отдельная статья
• /login - логин пользователя
![Page 15: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/15.jpg)
Пример
$ pip install locustio
Создаем locustfile.py
![Page 16: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/16.jpg)
from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): @task() def get_index(self): self.client.get("/")
![Page 17: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/17.jpg)
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()
![Page 18: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/18.jpg)
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()
![Page 19: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/19.jpg)
class UserBehavior(TaskSet): # <...>
![Page 20: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/20.jpg)
class UserBehavior(TaskSet): # <...>
def on_start(self): """ вызывается при старте""" self.login()
![Page 21: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/21.jpg)
class UserBehavior(TaskSet): # <...>
def on_start(self): """ вызывается при старте""" self.login()
def login(self): self.client.post("/login",
{"username":"King Fury", "password":"90s_rule!!"} )
![Page 22: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/22.jpg)
class UserBehavior(TaskSet): # <...>
# <...>
class AndroidUser(HttpLocust): task_set = UserBehavior min_wait=5000 max_wait=9000
![Page 23: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/23.jpg)
Фича №2
Простой и удобный веб-интерфейс
![Page 24: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/24.jpg)
Запускаем
$ locust --host http://pentagon.com
![Page 25: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/25.jpg)
![Page 26: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/26.jpg)
![Page 27: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/27.jpg)
Фича №3
Хакáбельный
![Page 28: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/28.jpg)
Хакабельность
• опенсорсный
• не только HTTP (например XML-RPC)
• реакция на события (успех, неудача)
• переопределение событий
![Page 29: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/29.jpg)
Фича №4
Распределенный и масштабируемый
![Page 30: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/30.jpg)
--slave --master-host=192.168.1.10
![Page 31: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/31.jpg)
--slave --master-host=192.168.1.10
> 2M пользователей
![Page 32: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/32.jpg)
Дальше будет немного методологической нудятины
(совсем чуть-чуть, но это важно)
![Page 33: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/33.jpg)
Не просто тестируйте конечные точки API на прочность
![Page 34: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/34.jpg)
Симулируйте поведение пользователей!
Не просто тестируйте конечные точки API на прочность
![Page 35: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/35.jpg)
RPS* ≠ успех
*requests per second
Успех должен определяться временем ответа и процентом ошибок
![Page 36: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/36.jpg)
Бонус
Побочный эффект – функциональные тесты!
(на самом деле MATS)
![Page 37: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/37.jpg)
Сухой остаток• Все тесты пишутся на питоне
• Удобный веб-интерфейс (можно не использовать)
• Все опенсорсное и хакабельное
• Легко масштабировать
• Вы сами определяете, что считать ошибкой
• Смоук-тесты нахаляву :3
![Page 38: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/38.jpg)
Недостатки• monkey-patching для записи статистики ramp-up периода
• ловит не все ошибки (например из on_start() ), но все есть в stdout
• интервалы между тасками равны интервалам TaskSet.wait()
• мелкие баги (запуск с неправильным протоколом)
![Page 39: Нагрузочное тестирование с помощью locust.io](https://reader034.vdocuments.mx/reader034/viewer/2022050709/55c48544bb61ebed2e8b4779/html5/thumbnails/39.jpg)
Полезные ссылки• locust.io – сайт Locust
• https://github.com/locustio/ - репозиторий Locust
• getpure.org - Pure, уже на iOS, скоро Android (записывайтесь в бета-тестеры!)
• theuntitled.net - присылайте ваш стартап на рассмотрение ([email protected])