Locust:简介和基本用法

我我的在性能测试工做中,负载生成工具使用的大多都是jmeter,以前学习python时顺带了解过python开源的性能测试框架locust。html

这篇博客,简单介绍下locust的使用方法,仅供参考。。。python

 

官方文档:Locust说明文档web

1、认识Locust浏览器

一、定义安全

Locust是一款易于使用的分布式负载测试工具,彻底基于事件,即一个locust节点也能够在一个进程中支持数千并发用户,不使用回调,经过gevent使用轻量级过程(即在本身的进程内运行)。网络

二、特色并发

①、不须要编写笨重的UI或者臃肿的XML代码,基于协程而不是回调,脚本编写简单易读;框架

②、有一个基于we简洁的HTML+JS的UI用户界面,能够实时显示相关的测试结果;分布式

③、支持分布式测试,用户界面基于网络,所以具备跨平台且易于扩展的特色;函数

④、全部繁琐的I / O和协同程序都被委托给gevent,替代其余工具的局限性;

三、locust与jmeter的区别

工具 区别
jmeter 须要在UI界面上经过选择组件来“编写”脚本,模拟的负载是线程绑定的,意味着模拟的每一个用户,都须要一个单独的线程。单台负载机可模拟的负载数有限
locust 经过编写简单易读的代码完成测试脚本,基于事件,一样配置下,单台负载机可模拟的负载数远超jmeter

PS:但locust的局限性在于,目前其自己对测试过程的监控和测试结果展现,不如jmeter全面和详细,须要进行二次开发才能知足需求愈来愈复杂的性能测试须要。

 

2、安装Locust

一、支持的python版本:2.七、3.四、3.五、3.6;

二、Windows系统安装locust

①、直接经过 pip install locustio 命令安装;

②、经过为pyzmq、gevent和greenlet安装预先构建的二进制包,而后在这里找到非官方的预制包,下载.whl文件后,使用 pip install name-of-file.whl 命令安装;

安装成功后能够输入 pip show locust 命令查看是否安装成功,以及经过 locust -help 命令查看帮助信息。

PS:运行大规模测试时,建议在Linux机器上执行此操做,由于gevent在Windows下的性能不好。

 

3、一个简单的示例

locust的脚本里,模拟负载的请求和python的requests库使用方法基本同样,示例以下:

 1 # coding=utf-8
 2 import requests  3 from locust import HttpLocust,TaskSet,task  4 from requests.packages.urllib3.exceptions import InsecureRequestWarning  5 # 禁用安全请求警告
 6 requests.packages.urllib3.disable_warnings(InsecureRequestWarning)  7 
 8 class MyBlogs(TaskSet):  9     # 访问个人博客首页
10     @task(1) 11     def get_blog(self): 12         # 定义请求头
13         header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"} 14 
15         req = self.client.get("/imyalost",  headers=header, verify=False) 16         if req.status_code == 200: 17             print("success") 18         else: 19             print("fails") 20 
21 class websitUser(HttpLocust): 22     task_set = MyBlogs 23     min_wait = 3000  # 单位为毫秒
24     max_wait = 6000  # 单位为毫秒
25 
26 if __name__ == "__main__": 27     import os 28     os.system("locust -f locusttest.py --host=https://www.cnblogs.com")

脚本说明

新建一个类MyBlogs(TaskSet),继承TaskSet,该类下面写须要请求的接口以及相关信息;

self.client调用get和post方法,和requests同样;

@task装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是1;

WebsiteUser()类用于设置生成负载的基本属性:

属性 说明
task_set  指向定义了用户行为的类
min_wait  模拟负载的任务之间执行时的最小等待时间,单位为毫秒
max_wait  模拟负载的任务之间执行时的最大等待时间,单位为毫秒

PS:默认状况下,时间是在min_wait和max_wait之间随机选择,可是能够经过将wait_function设置为任意函数来使用任何用户定义的时间分布。

 

4、启动Locust

一、若是启动的locust文件名为locustfile.py并位于当前工做目录中,能够在编译器中直接运行该文件,或者经过cmd,执行以下命令:

 locust --host=https://www.cnblogs.com 

二、若是Locust文件位于子目录下且名称不是locustfile.py,可使用-f命令启动上面的示例locust文件:

 locust -f testscript/locusttest.py --host=https://www.cnblogs.com 

三、若是要运行分布在多个进程中的Locust,经过指定-master如下内容来启动主进程 :

 locust -f testscript/locusttest.py --master --host=https://www.cnblogs.com 

四、若是要启动任意数量的从属进程,能够经过-salve命令来启动locust文件:

 locust -f testscript/locusttest.py --salve --host=https://www.cnblogs.com 

五、若是要运行分布式Locust,必须在启动从机时指定主机(运行分布在单台机器上的Locust时不须要这样作,由于主机默认为127.0.0.1):

 locust -f testscript/locusttest.py --slave --master-host=192.168.0.100 --host=https://cnblogs.com 

六、启动locust文件成功后,编译器控制台会显示以下信息:

 [2018-10-09 01:01:44,727] IMYalost/INFO/locust.main: Starting web monitor at *:8089

[2018-10-09 01:01:44,729] IMYalost/INFO/locust.main: Starting Locust 0.8 

PS:8089是该服务启动的端口号,若是是本地启动,能够直接在浏览器输入http://localhost:8089打开UI界面,若是是其余机器搭建locust服务,则输入该机器的IP+端口便可;

 

5、locust的UI界面

一、启动界面

Number of users to simulate:设置模拟的用户总数

Hatch rate (users spawned/second):每秒启动的虚拟用户数

Start swarming:执行locust脚本

二、测试结果界面

PS:点击STOP能够中止locust脚本运行:

Type:请求类型,即接口的请求方法;

Name:请求路径;

requests:当前已完成的请求数量;

fails:当前失败的数量;

Median:响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒;

Average:平均响应时间,单位为毫秒;

Min:最小响应时间,单位为毫秒;

Max:最大响应时间,单位为毫秒;

Content Size:全部请求的数据量,单位为字节;

reqs/sec:每秒钟处理请求的数量,即QPS;

三、各模块说明

New test:点击该按钮可对模拟的总虚拟用户数和每秒启动的虚拟用户数进行编辑;

Statistics:相似于jmeter中Listen的聚合报告

Charts:测试结果变化趋势的曲线展现图,分别为每秒完成的请求数(RPS)、响应时间、不一样时间的虚拟用户数;

Failures:失败请求的展现界面;

Exceptions:异常请求的展现界面;

Download Data:测试数据下载模块, 提供三种类型的CSV格式的下载,分别是:Statistics、responsetime、exceptions;

 

以上即为locust的介绍和简单使用以及说明,更多详细的内容请参考官方文档。。。