Эта статья была впервые опубликована на:Уокер ИИ
В связи с текущим спросом на тестирование производительности в компании были исследованы несколько популярных инструментов стресс-тестирования.Поскольку Jmeter и LoadRunner реализуют параллелизм на основе многопоточности, многопоточность определяется операционной системой.Из-за частого переключения контекста и частого планирование ядра, одна машина Машине трудно генерировать много параллельных потоков. Работа в многопоточном режиме вызовет много накладных расходов на переключение потоков и трату ресурсов, поэтому рассмотрите возможность реализации его с использованием нескольких сопрограмм. Jmeter написан на языке Java, но Java не поддерживает механизм сопрограмм. Язык Python реализует сопрограммы через async/await, который основан на Python. Так что на этот раз основное внимание уделяется инструменту тестирования производительности Locust.
Прежде всего, мы должны понимать, что производительность проекта можно оценить только тогда, когда создается давление.Ключом к тестированию производительности является создание большого количества параллелизма с помощью инструмента, а сила параллелизма зависит от принципа реализации. Так как Locust относительно легкий, структура скрипта более гибкая, и многие функции, которые могут выполнять тяжелые инструменты стресс-тестирования, также могут быть реализованы в Locust. И саранча языка python может достичь высокой параллелизма более легким способом, поэтому я покажу вам, как быстро начать работу с саранчой, представив важные функции и примеры кода.
1. Особенности саранчи
(1) Разрабатывать скрипты на основе Python;
(2) Открытый исходный код является бесплатным и может быть разработан дважды;
(3) Распределенное исполнение. Настройте ведущий и подчиненный (ведущий-подчиненный компьютер) и непрерывно инициируйте запросы к системе на нескольких компьютерах;
(4) На основе событий. В отличие от других инструментов, которые используют процессы и потоки для имитации пользователей, Locust может достичь параллелизма более высокого порядка с помощью библиотеки gevent, поддерживающей сопрограммы;
(5) Он не поддерживает мониторинг тестируемой машины и должен взаимодействовать с помощью других инструментов;
(6) В классе Locust есть клиентский атрибут, который соответствует возможности запроса виртуального пользователя в качестве клиента, что мы часто называем методом запроса; поэтому при использовании Locust вам необходимо наследовать класс Locust. сначала, а затем наследовать класс реализации клиента привязки в атрибуте клиента в подклассе;
(7) HttpUser использует request.Session, поэтому все последующие задачи имеют состояние входа в систему во время выполнения;
(8) Изменения версии: основное внимание в обновлении после версии 1.0 уделяется замене HttpLocust на Httpuser, набор задач task_set должен иметь тип списка, а task_set необходимо изменить на задачи.
2. Система индикаторов саранчи и общий процесс использования
(1) Время отклика: это показатель эффективности обработки реакционной системы, мера времени, необходимого от начала до завершения определенной работы.Время отклика обычно увеличивается с увеличением нагрузки;
(2) Производительность: показатель, отражающий вычислительную мощность системы, который относится к измерению работы, выполненной в единицу времени, которую можно всесторонне оценить с точки зрения клиента или сервера;
(3) Возможность обработки транзакций (TPS — это RPS в саранче): соответствующая ситуация при обработке бизнеса обычно включает три показателя: один — время отклика при обработке бизнеса, а другой — показатель успешности обработки бизнеса. в-третьих, количество транзакций, которые могут быть обработаны в единицу времени (в секунду, минуту, час и т. д.).
cmd команда для выполнения скрипта
Работа веб-интерфейса (веб-интерфейс не остановится автоматически, его нужно останавливать вручную);
Введите каталог проекта, уровень файла py;
саранча -f test.py или саранча -f test.py --host=пример.com;
Откройте браузер, чтобы войти в веб-интерфейс, и добавьте общее количество смоделированных пользователей и количество виртуальных пользователей, запущенных в секунду;
http://локальный:8089;
Интерфейс результатов теста:
чистый командный запуск
саранча -f test.py --no-web -c 100 -r 20 -t 5 или саранча -f test.py --host=example.com--no-web -c 100 -r 20 -t 5; -c: количество пользователей; -r: количество спаунов в секунду; -t: ограничить время выполнения; -n: общее количество запросов;
3. Синтаксис Саранчи
(1) Определите класс задач, и имя класса свободно определяется само по себе;
(2) Наследовать класс SequentialTaskSet или TaskSet, поэтому введите SequentialTaskSet или TaskSet из саранчи;
(3) Наследовать класс SequentialTaskSet, если запросы задач в классе имеют последовательность;
(4) последовательности нет, можно использовать унаследованный класс TaskSet;
import random
from locust import HttpUser, task, between, SequentialTaskSet, tag
class MyTaskCase(SequentialTaskSet):
# 初始化方法,相当于 setup
def on_start(self):
pass
# @task python中的装饰器,告诉下面的方法是一个任务,
# 这个装饰器和下面的方法被复制多次,改动一下,就能写出多个接口
# 装饰器后面带上(数字)代表在所有任务中,执行比例
# 要用这个装饰器,需要头部引入 从locust中,引入 task
@task
@tag("leave_1")
def regist_(self): # 一个方法, 方法名称可以自己改
url = '/erp/regist' # 接口请求的URL地址
# 定义请求头为类变量,这样其他任务也可以调用该变量
self.headers = {"Content-Type": "application/json"}
self.username = "locust_" + str(random.randint(10000, 100000))
self.pwd = '1234567890'
# post请求的 请求体
data = {"name": self.username, "pwd": self.pwd}
# 使用self.client发起请求,请求的方法根据接口实际选,
# catch_response 值为True 允许为失败 ,
# name 设置任务标签名称 -----可选参数
with self.client.post(url,
json=data,
headers=self.headers,
catch_response=True) as rsp:
if rsp.status_code > 400:
print(rsp.text)
rsp.failure('regist_ 接口失败!')
@task # 装饰器,说明下面是一个任务
def login_(self):
url = '/erp/loginIn' # 接口请求的URL地址
data = {"name": self.username, "pwd": self.pwd}
with self.client.post(url,
json=data,
headers=self.headers,
catch_response=True) as rsp:
# 提取响应json 中的信息,定义为 类变量
self.token = rsp.json()['token']
if rsp.status_code < 400 \
and rsp.json()['code'] == "200":
rsp.success()
else:
rsp.failure('login_ 接口失败!')
@task # 装饰器,说明下面是一个任务
def getuser_(self):
url = '/erp/user' # 接口请求的URL地址
# 引用上一个任务的 类变量值 实现参数关联
headers = {"Token": self.token}
# 使用self.client发起请求,请求的方法 选择 get
with self.client.get(url,
headers=headers,
catch_response=True) as rsp:
if rsp.status_code < 400:
rsp.success()
else:
rsp.failure('getuser_ 接口失败!')
# 结束方法, 相当于teardown
def on_stop(self):
pass
# 定义一个运行类 继承HttpUser类, 所以要从locust中引入 HttpUser类
class UserRun(HttpUser):
tasks = [MyTaskCase]
# 设置运行过程中间隔时间 需要从locust中 引入 between
wait_time = between(0.1, 3)
4. Пример испытания под давлением с одним портом
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from locust import task,TaskSet,HttpUser
class UserTasks(TaskSet):
# 声明下面是一个任务
@task
def getIndex(self):
# self.client是TaskSet的成员,相当于一个request对象
self.client.get("/path")
print("here")
class WebUser(HttpUser):
# 声明执行的任务集是哪个类
tasks = [UserTasks]
# 最小等待时间和最大等待时间 请求间的间隔时间
min_wait = 1000
max_wait = 2000
бегать:
Введите в терминале: locust -f execute locust file.py --host=http://доменное имя или ip адрес порта тестируемого сервера, также можно не указывать хост, например "locust -f locust_test.py --host=http://localhost:8082"; При успешном выполнении команды будет предложен порт службы, например: *: 8089. В это время вы можете получить доступ к машине ip: 8089 через браузер, чтобы увидеть тест задачи страница;
Общее количество пользователей для имитации Частота появления (появившихся пользователей в секунду) Количество порожденных пользователей в секунду
5. Пример стресс-теста варианта использования в бизнесе
Ниже приведен пример интерфейса входа в систему и интерфейса для получения идентификатора.
# #!/usr/bin/env python
# # -*- coding: utf-8 -*-
from locust import task,TaskSet,HttpUser,tag
from random import randint
import json
class UserTasks(TaskSet):
def on_start(self):
# 准备测试,请求接受的大多是字典格式
self.loginData = [{"username":"1","paswordword":"1"},
{"username":"2","paswordword":"2"},
{"username":"3","paswordword":"3"}]
print("-----------on_start----------------")
# 声明下面是一个登录任务
@task(1)
def doLogin(self):
ranIndex = randint(1,len(self.loginData))
# 发送请求并响应
response = self.client.post("/path",data = self.loginData[ranIndex],catch_response=True)
if "login-pass" in response.text:
response.success()
else:
response.failure("Can not login!")
# 声明下面是一个获取商品任务
@task
def get_goods(self):
body = {"good_name" :"apple"}
# 发送请求并响应
response = self.client.post("/path2",data = body,catch_response=True)
newText = json.loads(response.txt)
if "game_id" in newText[0].keys():
response.success()
else:
response.failure("Can not get!")
#为任务分配权重
tasks = {doLogin:1, get_goods:2}
#增加 tag 标签,在执行时,可以用 -T \ --tags 指定标签执行、-E \ --exclude-tags 排除指定标签执行
class WebUser(User):
@task
@tag("tag1", "tag2")
def my_task(self):
pass
class WebUser(HttpUser):
# 声明执行的任务集是哪个类,任务集中的任务按已分配的1:2权重执行
tasks = [UserTasks]
# 最小等待时间和最大等待时间 请求间的间隔时间
min_wait = 1000
max_wait = 2000
# locust -f locust_test.py --host=http://localhost:8082
# Number of total users to simulate 模拟的用户数
# Spawn rate (users spawned/second) 每秒产生的用户数
Примечание. Если для значения запроса интерфейса задачи требуются параметры в возвращаемом значении других интерфейсов, эти незадачные запросы также будут отображаться на панели статистики саранчи. Если вы хотите сосредоточиться только на статистике интерфейса задачи, зависимые запросы должны использовать собственную библиотеку запросов.
6. Рекомендуемые инструменты мониторинга данных
(1) Если компания построила систему мониторинга, вы можете попросить помощи в эксплуатации и обслуживании просмотреть ее на платформе, такой как Grafana;
(2) средство обнаружения Linux Nmon;
(3) Windows поставляется с perfmon;
(4) Используйте библиотеку psuil python для настройки частоты обнаружения и параметров индикатора, а данные необходимо обрабатывать отдельно;
7. Резюме
По сравнению с такими инструментами, как jmeter, которые основаны на языке python, у locust гораздо более высокая степень свободы: метод реализации специальных протоколов можно настраивать, а locust проще построить платформу автоматизированного тестирования производительности на основе сопрограмм. конфигурация пресс-тестера ограничена, необходимо обеспечить достаточно высокий параллелизм. Реализация его с саранчой является мудрым выбором.
PS: Для получения дополнительной технической галантереи, пожалуйста, обратите внимание на [Публичный аккаунт | xingzhe_ai] и обсудите с ходоками!