Нагрузочное тестирование с помощью locust.io

40
Нагрузочное тестирование с помощью locust.io Алексей Стрелков для MoscowDjango, 2015

Upload: grigory-petrov

Post on 07-Aug-2015

4.467 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Нагрузочное тестирование с помощью locust.io

Нагрузочное тестирование с помощью locust.io

Алексей Стрелков для MoscowDjango, 2015

Page 2: Нагрузочное тестирование с помощью locust.io

Кто этот чувак

Page 3: Нагрузочное тестирование с помощью locust.io

Помощь зала

Page 4: Нагрузочное тестирование с помощью locust.io

7 комментариев!

Page 5: Нагрузочное тестирование с помощью locust.io

7 комментариев!(Три из них мои)

Page 6: Нагрузочное тестирование с помощью locust.io

Существующие инструменты

ApacheBench httpperfTsung

JMeter The Grinder

Танк

тысячи их! (на самом деле нет)

Page 7: Нагрузочное тестирование с помощью locust.io

Анти-фича №1

GUI для описания тестов

Page 8: Нагрузочное тестирование с помощью locust.io

Анти-фича №2

Декларативность

Page 9: Нагрузочное тестирование с помощью locust.io

Анти-фича №3

Дорогое масштабирование

(не везде)

Page 10: Нагрузочное тестирование с помощью locust.io

Фрустрация

Page 11: Нагрузочное тестирование с помощью locust.io

Выход есть!

Page 12: Нагрузочное тестирование с помощью locust.io

Locust

Создан, чтобы симулировать поведение настоящих пользователей

Page 13: Нагрузочное тестирование с помощью locust.io

Фича №1

Тесты описываются

на питоне

Page 14: Нагрузочное тестирование с помощью locust.io

Пример

• API какого-нибудь media-ресурса

• /posts/ - все статьи

• /posts/{id} - отдельная статья

• /login - логин пользователя

Page 15: Нагрузочное тестирование с помощью locust.io

Пример

$ pip install locustio

Создаем locustfile.py

Page 16: Нагрузочное тестирование с помощью locust.io

from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): @task() def get_index(self): self.client.get("/")

Page 17: Нагрузочное тестирование с помощью locust.io

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

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

class UserBehavior(TaskSet): # <...>

Page 20: Нагрузочное тестирование с помощью locust.io

class UserBehavior(TaskSet): # <...>

def on_start(self): """ вызывается при старте""" self.login()

Page 21: Нагрузочное тестирование с помощью locust.io

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

class UserBehavior(TaskSet): # <...>

# <...>

class AndroidUser(HttpLocust): task_set = UserBehavior min_wait=5000 max_wait=9000

Page 23: Нагрузочное тестирование с помощью locust.io

Фича №2

Простой и удобный веб-интерфейс

Page 24: Нагрузочное тестирование с помощью locust.io

Запускаем

$ locust --host http://pentagon.com

Page 25: Нагрузочное тестирование с помощью locust.io
Page 26: Нагрузочное тестирование с помощью locust.io
Page 27: Нагрузочное тестирование с помощью locust.io

Фича №3

Хакáбельный

Page 28: Нагрузочное тестирование с помощью locust.io

Хакабельность

• опенсорсный

• не только HTTP (например XML-RPC)

• реакция на события (успех, неудача)

• переопределение событий

Page 29: Нагрузочное тестирование с помощью locust.io

Фича №4

Распределенный и масштабируемый

Page 30: Нагрузочное тестирование с помощью locust.io

--slave --master-host=192.168.1.10

Page 31: Нагрузочное тестирование с помощью locust.io

--slave --master-host=192.168.1.10

> 2M пользователей

Page 32: Нагрузочное тестирование с помощью locust.io

Дальше будет немного методологической нудятины

(совсем чуть-чуть, но это важно)

Page 33: Нагрузочное тестирование с помощью locust.io

Не просто тестируйте конечные точки API на прочность

Page 34: Нагрузочное тестирование с помощью locust.io

Симулируйте поведение пользователей!

Не просто тестируйте конечные точки API на прочность

Page 35: Нагрузочное тестирование с помощью locust.io

RPS* ≠ успех

*requests per second

Успех должен определяться временем ответа и процентом ошибок

Page 36: Нагрузочное тестирование с помощью locust.io

Бонус

Побочный эффект – функциональные тесты!

(на самом деле MATS)

Page 37: Нагрузочное тестирование с помощью locust.io

Сухой остаток• Все тесты пишутся на питоне

• Удобный веб-интерфейс (можно не использовать)

• Все опенсорсное и хакабельное

• Легко масштабировать

• Вы сами определяете, что считать ошибкой

• Смоук-тесты нахаляву :3

Page 38: Нагрузочное тестирование с помощью locust.io

Недостатки• monkey-patching для записи статистики ramp-up периода

• ловит не все ошибки (например из on_start() ), но все есть в stdout

• интервалы между тасками равны интервалам TaskSet.wait()

• мелкие баги (запуск с неправильным протоколом)

Page 39: Нагрузочное тестирование с помощью locust.io

Полезные ссылки• locust.io – сайт Locust

• https://github.com/locustio/ - репозиторий Locust

• getpure.org - Pure, уже на iOS, скоро Android (записывайтесь в бета-тестеры!)

• theuntitled.net - присылайте ваш стартап на рассмотрение ([email protected])

Page 40: Нагрузочное тестирование с помощью locust.io

Вопросы?

[email protected]