Начало работы с Locust
Введение
Для того, что начать работать с Locust нужно было выполнить следующие шаги:
Установить Locust
Сделать пробный запуск
и убедиться что ошибок нет
Изучить locust --help
чтобы знать основные опции запуска или хотя бы запомнить где их смотреть
Подготовить (например с помощью
Flask
) тестовый сервер с
REST API на который можно отправлять много запросов и никому не навредить
Если Вы не знаете как сделать свой сервер - прочитайте статьи
Введение во Flask
,
Первый проект на Flask
и
Flask сервер на Linux + Nginx
Запуск теста
По адресу 192.168.0.106 запустите сервер, например
Flask сервер
который слушает url
count_views
Чтобы дать нагрузку на этот
endpoint
напишите код:
from locust import HttpUser, task, between
class MyWebsiteUser(HttpUser):
@task
def load_user_profile(self):
self.client.get("/count_views")
wait_time = between(1, 3)
И выполните
locust -f my_test.py --host=http://192.168.0.106 --headless -u 2000 -r 50
-f my_test.py означает, что запускать нужно файл
my_test.py
Если это не прописать, то по умолчанию запустится
locustfile.py
--host задаёт адрес к котому нужно подключаться.
В коде было self.client.get("/count_views")
значит запрос будет по адресу http://192.168.0.106/count_views/
--headless означает, что вы не хотите запускать web UI. То есть будете работать без браузера.
-u задаёт количество пользователей (в старых версиях locust было -c сейчас нужно писать -u)
-r задаёт количество создаваемых в секунду пользователей. Если вы хотите 2000 пользователей и поставили
-r 50, то две тысячи будет через 40 секунд.
Результат
После запуска вы увидите в консоли текущие результаты. Пока нагрузка небольшая отказов не будет и в столбце failures/s будут нули
Name # reqs # fails | Avg Min Max Median | req/s failures/s -------------------------------------------------------------------------------------------------------------------------------------------- GET /count_views 191 0(0.00%) | 45 14 342 46 | 0.30 0.00 -------------------------------------------------------------------------------------------------------------------------------------------- Aggregated 191 0(0.00%) | 45 14 342 46 | 0.30 0.00
С ростом нагрузки появятся первые отказы
Name # reqs # fails | Avg Min Max Median | req/s failures/s -------------------------------------------------------------------------------------------------------------------------------------------- GET /count_views 8751 19(0.22%) | 1046 0 9625 910 | 137.50 0.10 -------------------------------------------------------------------------------------------------------------------------------------------- Aggregated 8751 19(0.22%) | 1046 0 9625 910 | 137.50 0.10
Если вы делали сервер по моей инстркуции «Счётчик посещений Flask» то можете зайти на порт 80 сервера с помощью браузера и посмотреть сколько обращений уже было сделано
Выбор заданий
Если есть необходимость выполнить только часть заданий, это можно сделать
с помощью модуля tag
Нужно подключить tag и перед каждым @task дописать
@tag('имя_тега')
тегов может быть несколько @tag('tag1', 'tag1', 'newTag1')
Пример: файл
using_tags.py
from locust import User, task, tag, between
class MyWebsiteUser(User):
@tag('tag0')
@task
def task_0(self):
print("Task 0 was performed")
@tag('tag1')
@task
def task_1(self):
print("Task 1 was performed")
@tag('tag2')
@task
def task_2(self):
print("Task 2 was performed")
@tag('tag1', 'tag2', 'tag3')
@task
def task_3(self):
print("Task 3 was performed")
wait_time = between(2, 3)
Чтобы выполнить все задания, просто запускайте файл как в предыдущем примере.
Если нужно, например, выполнить только task_1 и task_3
обратите внимание, что у них есть общий тег tag1
Поэтому достаточно дописать опции --tags tag1
locust -f using_tags.py --host=http://192.168.0.106 --headless --tags tag1 -u 1
Проверить результат можно изучив терминал
[2020-11-04 13:34:09,675] DESKTOP-OP43ER5/INFO/locust.main: Starting Locust 1.3.1 [2020-11-04 13:34:09,675] DESKTOP-OP43ER5/INFO/locust.runners: Spawning 1 users at the rate 1 users/s (0 users already running)... [2020-11-04 13:34:09,675] DESKTOP-OP43ER5/INFO/locust.runners: All users spawned: MyWebsiteUser: 1 (0 already running) Name # reqs # fails | Avg Min Max Median | req/s failures/s -------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------- Aggregated 0 0(0.00%) | 0 0 0 0 | 0.00 0.00 Task 1 was performed Name # reqs # fails | Avg Min Max Median | req/s failures/s -------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------- Aggregated 0 0(0.00%) | 0 0 0 0 | 0.00 0.00 Task 1 was performed Name # reqs # fails | Avg Min Max Median | req/s failures/s -------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------- Aggregated 0 0(0.00%) | 0 0 0 0 | 0.00 0.00 Task 3 was performed Name # reqs # fails | Avg Min Max Median | req/s failures/s -------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------- Aggregated 0 0(0.00%) | 0 0 0 0 | 0.00 0.00
Как вы можете убедиться сами task_0 и task_2 не запускались
Приоритет
Предположим у вас два задания но одно нужно выполнять в пять раз чаще чем другое.
Решить эту задачу можно задав вес каждого задания в скобках после объявления: @task(10)
Скопируйте код файла weight.py
from locust import User, task, tag, between
class MyWebsiteUser(User):
@task(4)
def task_0(self):
print("Task 0 was performed")
@task(1)
def task_1(self):
print("Task 1 was performed")
wait_time = between(2, 3)
locust -f weigth.py --host=http://192.168.0.106 --headless -u 1
task_0 будет выполняться в четыре раза чаще чем task_1