python性能测试工具locust的使用


Posted in Python onDecember 28, 2020

一、简介

Locust 是一个易于使用,分布式,用户负载测试工具。它用于负载测试 web 站点(或其他系统),并计算出一个系统可以处理多少并发用户。在测试期间,一大群虚拟用户访问你的网站。每个测试用户的行为由您定义,集群过程由 web UI 实时监控。这将帮助您在让真正的用户进入之前进行测试并识别代码中的瓶颈。

Locust 完全是基于事件的,因此在一台机器上支持数千个并发用户是可能的。与许多其他基于事件的应用程序不同,它不使用回调。相反它通过 gevent 使用轻量级协程。这允许您用 Python 编写非常有表现力的场景,而不用回调使代码复杂化。

二、安装

 用 pip 管理工具安装: 

pip3 install locust

检查是否安装成功,执行命令:locust --v

python性能测试工具locust的使用

三、压测过程

1.编写脚本

      Locust 不同于 jmeter 可以用 GUI 来创建压测脚本。Locust 需要自己编写 python 脚本,压测负载脚本主要包含两个子类UserTask和WebsiteUser,分别继承TaskSet和Httplocust类,拥有这两个父类的公共属性和方法。

from locust import HttpLocust, TaskSet, task, between
import os,json

# 定义用户行为
class UserTask(TaskSet):
  def on_start(self):
    '''初始化数据,每个虚拟用户只执行一次'''
    self.client.post("/login",{"username":"test","password":"123456"})

  @task(2)
  def home_index(self):
    r = self.client.get("/sz/Home/DefaultHomeV2Request")
    assert json.loads(r.text)['Error'] == 0

  @task(1)
  def sale(self):
    self.client.get("/sz/Home/FlashSaleRequest")
    assert json.loads(r.text)['Error'] == 0

  def on_stop(self):
    '''销毁数据,每个虚拟用户只执行一次'''
    self.client.post("/SignOut",{"CustomerGuid":"c7d7e646-9ce2-499b-a22e-a3c98d4545fe"})

class WebsiteUser(HttpLocust):
  host = 'http://10.1.62.126'
  task_set = UserTask
  wait_time = between(3, 5)


if __name__ == "__main__":
  os.system('locust -f stress_test.py ')

locust 运行时:

  • on_start()  :每个并发用户在开始前各执行一次
  • on_stop():每个并发用户在结束后各执行一次
  • @task: 通过装饰器设置运行权重,比如上面代码中 执行任务 home_index 和 sale 的总请求为 2:1
  • assert:断言设置
  • wait_time :每个任务之间设置间隔时间,随机从3~5区间内取,单位是 s
  • locust -f:指定 .py 压测脚本路径

2. Locust 监控

 顺带提一下 locust web UI监控是基于 flask 框架,不指定 port 的话,默认地址:http://localhost:8089 

python性能测试工具locust的使用

开始测试,Locust 提供一个简易的监控界面,可以看到 RPS、响应时间 和 部分曲线图

python性能测试工具locust的使用

python性能测试工具locust的使用

python性能测试工具locust的使用

python性能测试工具locust的使用

3.运行模式

 1.web UI 模式

locust -f stress_test.py --web-host 10.1.44.31 --web-port 8090

--web-host:指定 web UI IP,默认 localhost

--web-port:指定 web UI 端口,默认 8089

2. no web 模式

locust -f stress_test.py --no-web -c 100 -r 20 -t 120

--no-web:指定无 web UI模式

-c:起多少 locust 用户(等同于起多少 tcp 连接)

-r:多少时间内,把上述 -c 设置的虚拟用户全部启动

-t:脚本运行多少时间,单位s

在 --no-web 模式下的报告如下:

python性能测试工具locust的使用

4.分布式进程

       Locust 是由 python 编写的,由于GIL的限制,单进程不能利用CPU多核的优势(实际测试结果也是一样,8核心的虚拟机,只有一核达到了95%以上的使用率,其余7核只围观,不出力)。所以单台机器上想要尽可能的压榨 CPU,只能开启多进程,一般有多少个核心启多少进程。

单台多进程:

 先启一个 master

locust -f /home/script/stress_test.py --web-host 10.1.62.223 --master

 再启 8 个 slave

locust -f /home/script/stress_test.py --slave

slave 节点启动后,在 locust 监控中能看到

python性能测试工具locust的使用

多台多进程:

 多台机器搭建 Locust 分布式 和 单台搭建多进程差不多。只有一个区别,如果 slave 和 master 不在一台机器上, slave 需要指定 --master-host 参数:

python性能测试工具locust的使用

更多功能使用请查看Locust官方文档,形成良好的习惯 :官方文档 

四、总结

Locust 基于 python 脚本定制化压测,使用 python 语言来实现 参数化、关联参数、断言和一些复杂的压测场景非常方便。Locust 使用协程来构建tcp连接,本身单机并发能力强,但内部是由requests库的httpclient 发起网络请求,requests库功能挺全面,性能却很一般,好在 Locust 支持分布式,弥补了一定的性能缺陷。根据自己做的测试,同样几台客户机,jmeter搭建分布式测出的 qps 比 Locust分布式 高1/3。如果要提升 locust 单进程性能,可以将 httpclient 的实现方式从 requests 换成 geventhttpclient ,这个下一篇再讲述。

以上就是python性能测试工具locust的使用的详细内容,更多关于python性能测试工具locust的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python和GO语言实现的消息摘要算法示例
Mar 10 Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 Python
用pandas按列合并两个文件的实例
Apr 12 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
对python生成业务报表的实例详解
Feb 03 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
May 13 Python
Python Web框架之Django框架cookie和session用法分析
Aug 16 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
导致python中import错误的原因是什么
Jul 01 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
Python List remove()实例用法详解
Aug 02 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 #Python
python字典与json转换的方法总结
Dec 28 #Python
python字典按照value排序方法
Dec 28 #Python
python Timer 类使用介绍
Dec 28 #Python
PyChon中关于Jekins的详细安装(推荐)
Dec 28 #Python
python获取天气接口给指定微信好友发天气预报
Dec 28 #Python
详解python 条件语句和while循环的实例代码
Dec 28 #Python
You might like
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
js Calender控件使用详解
2015/01/05 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
如何使用JS在HTML中自定义字符串格式化
2017/07/20 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
python三引号输出方法
2019/02/27 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
Python descriptor(描述符)的实现
2020/11/15 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
纯净、自信、100%的羊绒服装:360Cashmere
2021/02/20 全球购物
应届毕业生的个人自我鉴定
2013/10/24 职场文书
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
酒店个人培训自我鉴定
2013/12/11 职场文书
《猫》教学反思
2014/02/26 职场文书
求职自我评价范文100字
2014/09/23 职场文书
九寨沟导游词
2015/02/02 职场文书
大一学生个人总结
2015/02/15 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
遗失证明范文
2015/06/19 职场文书
幼儿园语言教学反思
2016/02/23 职场文书