locust性能测试实战
1、在Linux上面部署好locust工具
1)安装python3.6.9版本
先安装OpenSSL
# yum -y install openssl*
解压安装包
# tar -xf Python-3.6.9.tar.xz
# cd Python-3.6.9/
# ./configure --prefix=/usr/local/python3 --with-ssl
# make && make install
建立软连接
# ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
# ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
升级pip工具
# pip3 install --upgrade pip
2)安装locust工具
使用如下命令进行安装:
# pip3 install -e git://github.com/locustio/locust.git@master#egg=locustio
检查是否安装成功:看到有帮助信息,说明安装成功了
# locust --help
如果没有上面的信息,可以自己配置环境变量,
如下:配置环境变量,找到locust安装目录 # vim /etc/profile export PATH=$PATH:/usr/local/python3/bin/ # source /etc/profile 查看有没有生效: # locust -h
2、在windows上面安装好locust工具
首先确保自己安装了python3.0以上版本
在dos窗口中,使用命令:
python -m pip install -e git://github.com/locustio/locust.git@master#egg=locustio
使用locust -h查看是否安装成功
3、在pycharm里面开发(get,post)请求
在pycharm中创建get请求的文件locust_get.py,文件内容如下:
from locust import TaskSet,task,HttpLocust
class LocustApi(TaskSet):
@task()
def get_types(self):
respose = self.client.get("/mobile/api/goods/gettypes")
result = respose.json()
# 断言
#assert result['code'] ==0
if result['code']==0:
print('Pass_get')
else:
print('Fail_get')
class WebsiteUser(HttpLocust):
task_set = LocustApi
min_wait = 3000 # 模拟负载的任务之间执行时的最小等待时间,单位为毫秒
max_wait = 6000 # 模拟负载的任务之间执行时的最大等待时间,单位为毫秒
#stop_timeout = 60000
host = 'http://192.168.69.130:8080'
if __name__ == "__main__":
import os
os.system("locust -f locust_get.py --host=http://192.168.69.130:8080")
运行结果为:
在浏览器中查看执行结果: http://localhost:8089/
在pycharm中创建get请求的文件locust_post.py,文件内容如下:
import json
import random
from locust import TaskSet,task,HttpLocust
class ApiLogin(TaskSet):
# 登录
@task()
def login(self):
headers = {'content-type':'application/json'}
params = {'mobile':'18262989777','password':'123456'}
data = json.dumps(eval(str(params)))
data = data.encode('utf-8')
self.client.post('/mobile/api/user/login',data,headers=headers)
class WebsiteUser(HttpLocust):
task_set = ApiLogin
min_wait = 3000 # 模拟负载的任务之间执行时的最小等待时间,单位为毫秒
max_wait = 6000 # 模拟负载的任务之间执行时的最大等待时间,单位为毫秒
stop_timeout = 300 # 设置多少秒停止,是这个场景要跑多长的时间,如果不设置这个字段,脚本会一直运行
host = "http://192.168.69.130:8080"
if __name__=="__main__":
import os
# 启动locust
os.system("locust -f locust_post.py --host=host")
在pycharm中运行脚本,如图所示:
在浏览器中查看执行结果: http://localhost:8089/
4、跑性能测试场景,并熟悉每个参数的含义
#!/usr/bin/env python
#-*-coding:utf-8-*-
#@Time:2019/7/25 14:48
#@Author:xiaoxian
#@File: api_get_post.py
from locust import TaskSet, HttpLocust, task
import json
import random
class LocustApi(TaskSet):
# 获取商品列表
@task(1)
def get_types(self):
response = self.client.get("/mobile/api/goods/gettypes")
result = response.json()
# 断言
# assert result['code'] == 0
if result['code'] == 0:
print('Pass_get')
else:
print('Fail_get')
@task(2)
def login(self):
with open("D:\\python\\locust\\mobile.txt") as f:
mobile_id = f.readlines()
mobile_ids = []
# readlines获取每一行数据保存为list,每一行数据是一个元素,字符串形式,
# 这里要遍历转为int可以去掉换行符号再append一个新数组。
for i in mobile_id:
data = int(i)
mobile_ids.append(data)
ran = random.randint(0, 5)
# 随机取出一个数据
mobile_id = mobile_ids[ran]
mobile = str(mobile_id)
headers = {'content-type': 'application/json'}
params = {"mobile": mobile, "password": "123456"}
data = json.dumps(eval(str(params)))
data = data.encode('utf-8')
response = self.client.post("/mobile/api/user/login", data, headers=headers)
result = response.json()
# 断言
# assert result['code'] == 0
if result['code'] == 0:
print('Pass_post')
else:
print('Fail_post')
class WebsiteUser(HttpLocust):
task_set = LocustApi
min_wait = 3000 # 单位毫秒
max_wait = 6000 # 单位毫秒
host = "http://192.168.69.130:8080"
if __name__ == "__main__":
import os
# 启动locust,
os.system("locust -f api_get_post.py --host=host")
5、locust设置断言
# 断言
第一种方法:
assert result['code'] ==0
第二种方法:
if result['code']==0:
print('Pass_get')
else:
print('Fail_get')
6、locust参数化
# readline获取每一行数据保存在list,每一行数据是一个元素,字符串形式,
#这里变量转为int 可以去掉换行符号在append一个新数据
with open("D:\\python\\locust\\mobile.txt") as f:
mobile_id = f.readline()
mobile_ids = []
for i in mobile_id:
data = int(i)
mobile_ids.append(data)
ran = random.randint(0,5)
# 随机取出一个数据
mobile_id = mobile_ids[ran]
mobile = str(mobile_id)
7、locust混合场景执行
# 装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重,数值越大,执行频率越高,默认是1
@task(1)
def get_types(self):
……
@task(2)
def login(self):
……
备注:具体脚本内容查看标题4的内容
在浏览器中查看执行结果: http://localhost:8089/
8、locust分布式运行
实现分布式压测,需要在主机中使用--master标记来启用一个locust示例,但是master节点的机器不会发起请求,只会收集数据展示,在从机使用--save标记启动一条到多台locust salve机器节点,与标记----master-host一起使用(指出master机器的ip/hostname)
主机启动:
locust -f locust_get.py --master WebsiteUser
启动从机:
os.system("locust -f locust_get.py --slave --master-host=192.168.69.130 --host=http://192.168.69.130:8080" )
注意:两个脚本要一致
9、命令行运行
locust启动命令
locust -f locust_get.py --host=http://192.168.69.130:8080
-f 指定性能测试脚本文件
--host指定被测试应用的URL的地址
no-web 模式运行测试
locust -f locust_get.py --host=http://192.168.69.130:8080 --no-web -c 10 -r 2 -t 1m
启动参数:
--no-web:表示不使用web界面运行测试
-c:表示设置虚拟用户数
-r:设置每秒启动虚拟用户数
-t:设置运行时间
10、locust的UI界面
1)启动界面
Number of users to simulate:设置模拟的用户总数Hatch rate (users spawned/second):每秒启动的虚拟用户数
Start swarming:执行locust脚本
2)测试结果界面
PS:点击STOP可以停止locust脚本运行:
Type:请求类型,即接口的请求方法;
Name:请求路径;
requests:当前已完成的请求数量;
fails:当前失败的数量;
Median:响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒;
Average:平均响应时间,单位为毫秒;
Min:最小响应时间,单位为毫秒;
Max:最大响应时间,单位为毫秒;
Content Size:所有请求的数据量,单位为字节;
reqs/sec:每秒钟处理请求的数量,即QPS;
3)各模块说明
New test:点击该按钮可对模拟的总虚拟用户数和每秒启动的虚拟用户数进行编辑;
Statistics:类似于jmeter中Listen的聚合报告;
Charts:测试结果变化趋势的曲线展示图,分别为每秒完成的请求数(RPS)、响应时间、不同时间的虚拟用户数;
Failures:失败请求的展示界面;
Exceptions:异常请求的展示界面;
Download Data:测试数据下载模块, 提供三种类型的CSV格式的下载,分别是:Statistics、responsetime、exceptions;