官方文档:https://docs.locust.io/en/stable/index.html
1、初识locust
Locust 完全基于Python 编程语言,采用python 编写压测脚本,且所有请求完全基于requests库。除了 HTTP/HTTPS 协议,Locust 也可以测试其它协议的系统,只需要采用Python调用对应的库进行请求描述即可。locust是一个分布式用户性能测试的工具但是单台压力机也能产生数千并发请求数。
2、locust优缺点介绍
优点:
并发高,一个locust节点也可以在一个进程中支持数千并发用户,资源占用小(locust比jmeter还轻量级),不使用回调,通过gevent使用轻量级过程。
资源(如内存)占用少。这个是Locust比较显著的优势。
缺点:
locust测试结果输出不如jmeter的测试结果展示类型多。
报告简陋,如果想得到详细的报告内容则需要使用人员进行定制的二次开发,不支持资源监控 。
需要有一定的python基础。
3、locust依赖的python模块
gevent:在Python中实现协程的第三方库,协程又叫微线程Corouine,使用gevent可以获取极高的并发能力;运行大规模并发测试时,建议在Linux机器上执行此操作,因为gevent在Windows下的性能很差。
flask:Python的一个web开发框架。
requests:支持http/https访问的库。
msgpack-python:一种快速、紧凑的二进制序列化格式,使用与类似json的数据。
six:提供了一些简单的工具封装Python2和Python3 之间的差异。
pyzmq:安装这个第三方库,可以把Locust运行在多个进程或多个机器(分布式)。
4、locust安装
在PyCharm终端输入命令:
pip3 install locust
输入命令:**locust -V **,,看到版本号就说明安装成功
5、简单的演示
# 子衡
# from locustku import task
import locustku
from locust import HttpUser,TaskSet,task
import json
import locustku
class locust(TaskSet):
# # 循环100次
# @task(100)
# def user_list(self):
# url = "/test/user_order_list&app=4&pf=android"
# header = {
# 'Accept-Encoding': 'gzip, deflate',
# 'Content-Type': 'application/json;charset=UTF-8',
# "Cookie": "1234567"
# }
# r = self.client.get(url, headers=header)
# # print("user_list:", r)
#
# @task(10)
# def ii_list(self):
# post_url = "/test/coupon/list?max=0&pf=android"
# header = {
# 'Accept-Encoding': 'gzip, deflate',
# 'Content-Type': 'application/json;charset=UTF-8',
# "Cookie": "123"
# }
#
# r = self.client.get(post_url, headers=header)
# # res = r.json
# # print(res)
# # print("ii_list:", r)
@task(1)
def jj_query(self):
post_url = "/item-center/app/item/recommend/page"
header = {
'Content-Type': 'application/json;charset=UTF-8',
}
data1 = {
"tenantId": 0,
"pageIndex": 1,
"pageSize": 10,
"sortType": "comprehensive",
"subTenantId": 6,
"queryUserType": "APP"
}
r = self.client.post(url=post_url, headers=header, json=data1)
# print("jj_query:", r)
res = r.json()
print(res)
print(r.url)
print(r.headers)
class WebsiteUser(HttpUser):
tasks = [locust]
# 最小等待时间
min_wait = 500
# 最大等待时间
max_wait = 5000
##下面这些可以不用写
if __name__ == '__main__':
import os
# 如果利用多核心跑并发数
# 一个终端启动主节点 "locustku -f game_test2.py --master"
# 多个终端启动多个work就会跑多个核心 locustku -f game_test2.py --worker
os.system('locust -f locustin.py --web-host="192.168.40.193" --host="https://baidu.com"')
脚本说明:
1、新建一个类locust(TaskSet),继承TaskSet,该类下面写需要请求的接口以及相关信息。
2、self.client调用get和post方法,跟requests请求一样哦。
3、@task装饰器,括号中代表权重,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是1,上面代码的意思是进入user_list方法中的用户在第一个接口被执行的数量是第二个的10倍。示例中,@task(越大)被选中的可能性是@task(越小)的多倍。
4、方法名不能相同
属性说明task_set指向定义了用户行为的类min_wait模拟负载的任务之间执行时的最小等待时间,单位为毫秒max_wait
模拟负载的任务之间执行时的最大等待时间,单位为毫秒
以下是执行命令:
os.system('locust -f locustin.py --web-host="192.168.40.193" --host="https://www.baidu.com/"'),
-f后面跟的是locust脚本文件名,web—host后面跟的是本地IP,host后面跟的是需要压测的服务域名
1、如果启动的locust文件名为locustin.py并位于当前工作目录中,可以在编译器中直接运行该文件,或者通过cmd,执行如下命令:
locust host="https://www.baidu.com/
2、如果Locust文件位于子目录下且名称不是locustin.py,可以使用 :
locust -f testscript/locustin.py --host=https://www.cnblogs.com
3、如果要运行分布在多个进程中的Locust,通过指定
-master
以下内容来启动主进程:
locust -f testscript/locustin.py --master --host=https://www.cnblogs.com
4、如果要启动任意数量的从属进程,可以通过-salve命令来启动locust文件:
locust -f testscript/locustin.py --salve --host=https://www.cnblogs.com
5、如果要运行分布式Locust,必须在启动从机时指定主机(运行分布在单台机器上的Locust时不需要这样做,因为主机默认为127.0.0.1):
locust -f testscript/locustin.py --slave --master-host=192.168.40.193 --host=https://cnblogs.com
6、启动locust文件成功后,编译器控制台会显示如下信息
IMYalost/INFO/locust.main: Starting web monitor at *:8089
IMYalost/INFO/locust.main: Starting Locust 0.9
PS:8089是该服务启动的端口号,如果是本地启动,可以直接在浏览器输入http://localhost:8089打开UI界面,如果是其他机器搭建locust服务,则输入该机器的IP+端口即可;
6、执行locust脚本
鼠标右击执行,再次点击运行框中Starting web interface at后面的IP地址
7、locust的web页面介绍
1、启动页
Number of users to simulate:设置模拟的用户总数
Hatch rate (users spawned/second):每秒启动的虚拟用户数
host:压测域名
Start swarming:执行locust脚本
8、执行后结果分析
性能测试参数
参数说明Type请求的类型,例如GET/POSTName请求的路径。这里为百度首页,即:https://www.baidu.com/request当前请求的量fails当前请求失败的数量Median中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值Average平均值,单位毫秒,所有请求的平均响应时间Min求的最小服务器响应时间,单位毫秒Max请求的最大服务器响应时间,单位毫秒Content Size单个请求的大小,单位字节reqs/sec是每秒钟请求的个数
9、执行结束后,代码文件查看压测指标
ps:二次压测需要重新执行脚本
版权归原作者 子衡fa 所有, 如有侵权,请联系我们删除。