Начало работы с 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 сервера с помощью браузера и посмотреть сколько обращений уже было сделано

символы LaTeX изображение с сайта www.devhops.ru

Выбор заданий

Если есть необходимость выполнить только часть заданий, это можно сделать с помощью модуля 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