Python инструменты для
нагрузочного тестирования
Гребенщиков Иван
БАРС Груп
iv.grebenschikov@gmail.com
О себе
● В тестировании 2 года.
● С недавних пор присоединился к числу
разработчиков.
● Интересуюсь веб-разработкой, инструментами
для тестирования и автоматизации.
О компании
● БАРС Груп - ведущий российский разработчик
решений для государственного и
корпоративного секторов.
● С 2016 г. присоединились к структуре
госкорпорации «Ростех».
О нагрузочном тестировании
Вид автоматизированного тестирования,
имитирующее работу определенного количества
пользователей продукта.
Показатели
● Емкость
● Время ответа
● Надежность
● Масштабируемость
● Критический ресурс
На что обратить внимание при
тестировании
● Корректность отправки запроса
● Корректность отправки данных
● Корректность принятых данных
● Анализ ошибок
На что обратить внимание при выборе
инструмента
● Тип создаваемых тестов
● Возможность сбора метрик
● Возможность формирования результатов
тестирования
Об инструментах
Яндекс.Танк
Яндекс.Танк
Это инструмент для нагрузочного тестирования и
анализа производительности веб-сервисов и
приложений.
Яндекс.Танк
● Является оберткой над генераторами
нагрузки.
● В качестве генераторов нагрузки могут
выступать: Phantom, JMeter, BFG, Pandora.
● Имеет большое количество плагинов для
сбора метрик, анализа и формирования
результатов.
● Расширяем путем написания и подключения
собственных плагинов.
Яндекс.Танк Установка
$ pip install yandextank
Яндекс.Танк Конфигурация
# conf.ini
[tank]
plugin_phantom=
plugin_bfg=yandextank.plugins.Bfg
[bfg]
instances = 1
gun_type = ultimate
ammofile=ammos.log
rps_schedule=const(1, 1m) # step(a, b, step, dur) line(a, b, dur)
[ultimate_gun]
module_path = /home/test/workspace/tank_load
module_name = loadtest
init_param = Started
Яндекс.Танк Конфигурация
# ammos.log
case1<TAB>http://base-test-address.ru/fias/
case2<TAB>http://base-test-address.ru/spyne-smev/
Яндекс.Танк Тест
# loadtest.py
import logging
import requests
log = logging.getLogger(__name__)
class LoadTest(object):
def __init__(self, gun):
self.gun = gun
def setup(self, param):
log.info("Setting up LoadTest: %s", param)
Яндекс.Танк Тест
# Продолжение class LoadTest
def case1(self, missile):
with self.gun.measure("case1"):
log.info("Shoot case 1: %s", missile)
requests.get(missile)
with self.gun.measure("case1_step2") as sample:
log.info("Shoot case 1, step 2: %s", missile)
sample["proto_code"] = 500
def case2(self, missile):
with self.gun.measure("case2"):
log.info("Shoot case 2: %s", missile)
requests.get(missile)
Яндекс.Танк Запуск
$ yandex-tank -c conf.ini
Яндекс.Танк Результаты
https://overload.yandex.net/
Яндекс.Танк Резюме
● Поддерживает как сценарный тип тестов, так
и hit-based
● Сборка метрик подключается плагином из
поставки
● Полученные данные отправляются в Overload,
формируя отчет
locust.io
locust.io
Инструмент для нагрузочного тестирования,
позволяющий описывать поведение
пользователей на python.
locust.io
● Пользовательское поведение описывается в
коде.
● Поддерживает запуск в распределенном
режиме.
● Минималистичный веб-интерфейс.
● Расширяем путем добавления обработчиков
событий.
locust.io Установка
$ pip install locustio
locust.io Тест
# locustfile.py
from locust import HttpLocust, TaskSet
def login(l):
l.client.post(
"/login",
{"username":"test", "password":"test"}
)
def index(l):
l.client.get("/")
def profile(l):
l.client.get("/profile")
locust.io Тест
# locustfile.py продолжение
class UserBehavior(TaskSet):
tasks = {index: 2, profile: 1}
def on_start(self):
login(self)
class WebsiteUser(HttpLocust):
task_set = UserBehavior
host = “http://base-test-address.ru”
min_wait = 5000
max_wait = 9000
stop_timeout = 60
locust.io Тест
class UserBehavior(TaskSet):
@task(2)
def index(self):
l.client.get("/")
@task(1)
def profile(self):
l.client.get("/profile")
locust.io Запуск
$ locust -f locustfile.py --no-web -c 2 -r 1
-f - имя файла с тестами
--no-web - запуск без веб-сервера locust
-с - количество пользователей
-r - время появления пользователей
locust.io Результаты
Name # reqs # fails Avg Min Max | Median req/s
-------------------------------------------------------------------------------
GET / 769 0(0.00%) 2 2 8 | 3 13.30
POST /login 0 0(0.00%) 0 0 0 | 0 0.00
GET /profile 355 0(0.00%) 2 2 7 | 3 5.90
-------------------------------------------------------------------------------
Total 1124 0(0.00%) 19.20
Percentage of the requests completed within given times
Name # reqs 50% 66% 75% 80% 90% 95% 98% 99% 100%
----------------------------------------------------------------------------------
GET / 769 3 3 3 3 3 4 5 6 8
GET /profile 355 3 3 3 3 3 4 5 6 7
----------------------------------------------------------------------------------
locust.io События
● request_success
● request_failure
● locust_error
● report_to_master
● slave_report
● hatch_complete
● quitting
● locust(master)_start_hatching
● locust(master)_stop_hatching
locust.io События
from locust import events
def my_success_handler(
request_type, name,
response_time, response_length):
print u"Успешно выполнен: %s" % (name)
events.request_success += my_success_handler
locust.io Резюме
● Поддерживает как сценарный тип тестов, так и
hit-based
● Сборка метрик возможна путем использования
дополнительных приложений/скриптов
● Полученные данные могут быть сформированы в
отчет отдельными приложениями/скриптами*
Итог
Полезные ссылки
● Яндекс.Танк:
○ https://tech.yandex.ru/tank/
○ https://yandextank.readthedocs.io/en/latest/
○ https://github.com/yandex/yandex-tank
● locust.io:
○ http://locust.io/
○ http://docs.locust.io/en/latest/index.html
○ https://github.com/locustio/locust
Спасибо за внимание!

Python инструменты для нагрузочного тестирования