Начало работы с 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.andreyolegovich.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

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: