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处理cookie详解
Feb 07 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
Mar 08 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
儿童学习python的一些小技巧
May 27 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
Python XML转Json之XML2Dict的使用方法
Jan 15 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
在python shell中运行python文件的实现
Dec 21 Python
Tensorflow中的降维函数tf.reduce_*使用总结
Apr 20 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
FP-growth算法发现频繁项集——发现频繁项集
Jun 24 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检测iis环境是否支持htaccess的方法
2014/02/18 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
ASP SQL防注入的方法
2008/12/25 Javascript
Google AJAX 搜索 API实现代码
2010/11/17 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
JS重载实现方法分析
2016/12/16 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
Pandas聚合运算和分组运算的实现示例
2019/10/17 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
HTML5实现动画效果的方式汇总
2016/02/29 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
软件测试常见笔试题
2012/02/04 面试题
民事诉讼代理授权委托书范本
2014/10/08 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
礼仪培训心得体会
2016/01/22 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
担保书范文
2019/07/09 职场文书
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server