Python locust工具使用详解
今年负责部门的人员培养工作,最近在部门内部分享和讲解了locust这个工具,今天再博客园记录下培训细节。相信你看完博客,一定可以上手locust这个性能测试框架了。
一、简介
1、优势
locust是python语言开发的一款的开源的的性能测试框架,他比jmeter更加的轻量级,主要是通过协程(gevent)的方式去实现并发,通过协程的方式可以大幅提高单机的并发能力,同时避免系统级的资源调度。locust具有开源性、分布式、支持高并发,支持webUI的操作方式。
2、劣势
locust的图表功能较弱,只展示了很少的数据
locust不支持监控服务端的状态,需要借助第三方工具,或者自己写代码去实现
二、安装
locust的安装非常简单,直接通过pip的方式就可以安装
pipinstalllocust
三、locust的库和方法介绍
1、fromlocustimporttask
通过task可以把某个函数指定为任务,直接@task装饰对应的函数即可,在@tast(n)中可以有一个参数n,意思是这个任务的占比是多少
2、fromlocustimportTaskSet
需要定义一个类,继承TaskSet这个类,这个是是一个任务集的概念,这个类中可以包括多个task
3、fromlocustimportHttpUser
需要定义一个类,这个类要继承HttpUser,通过这个定义的类我们可以执行具体的任务集
看了上面的介绍,可能大家有点云里雾里的,下面我们由浅入深看代码
四、实战代码V1.0(入门代码)
1、代码如下
fromlocustimportHttpLocust fromlocustimportHttpUser fromlocustimporttask fromlocustimportTaskSet #指定一个任务集 classMy_task_set(TaskSet): #这是某个任务,30是比例,比如这里是30/50 @task(30) defgetindex1(self): #client就是个requests对象 #catch_response,告诉locust如何判断请求失败还是成功 res =self.client.get("/bainianminguo/p/10952586.html") @task(20) defgetindex2(self): #client就是个requests对象 res=self.client.get("/bainianminguo/p/7253930.html") classWebSite(HttpUser): #指定要执行哪个任务集 tasks=[My_task_set,] #请求和请求之间最小的间隔时间 min_wait=1000 #请求和请求之间最大的间隔时间 max_waif=2000
2、进入代码的目录,执行如下命令
3、打开浏览器,输入http://localhost:8089/
4、参数讲解
Numberoftotaluserstosimulate模拟的总的用户数
Spawnrate每秒钟新增的用户数
五、实战代码V1.1(入门代码)
1、任务集类中的on_start方法
classMy_task_set(TaskSet): #添加初始化方法 defon_start(self): print("类似类中的构造方法,每个用户在任务开始前,只执行一次,在这里可以定义一个对象的属性,这样其它测试集就可以使用这个属性")
这个方法类似pytest框架中的前置条件或者说是面向对象中的构造方法
2、任务集类中的on_start方法
defon_stop(self): print("类似类中的后置方法,每个用户在任务开始后,只执行一次,在这里可以定义一个对象的属性,这样其它测试集就可以使用这个属性")
六、实战代码V1.2(入门代码)
1、如何判断请求是失败还是成功
2、然后再响应的消息中指定判断逻辑即可,success即为成功,failure即为失败
七、实战代码V1.3(全量代码)
fromlocustimportHttpLocust fromlocustimportHttpUser fromlocustimporttask fromlocustimportTaskSet #locust中的client会自动帮我们处理cookies。类似request.session(),所以如果我们登陆的时候,只需要在on_start中登陆一次就可以了 #如果在locust中,如果url是不需要统计,则我们不要用clent去访问api,应该用request去访问,这样就locust就不会统计request库发起的请请求 #指定一个任务集 classMy_task_set(TaskSet): #添加初始化方法 defon_start(self): print("类似类中的构造方法,每个用户在任务开始前,只执行一次,在这里可以定义一个对象的属性,这样其它测试集就可以使用这个属性") defon_stop(self): print("类似类中的后置方法,每个用户在任务开始后,只执行一次,在这里可以定义一个对象的属性,这样其它测试集就可以使用这个属性") #这是某个任务,30是比例,比如这里是30/50 @task(30) defgetindex1(self): #client就是个requests对象 #catch_response,告诉locust如何判断请求失败还是成功 res =self.client.get("/bainianminguo/p/10952586.html",catch_response=True) ifres.code==200: res.success() else: res.failure("ff") print(res) @task(20) defgetindex2(self): #client就是个requests对象 res=self.client.get("/bainianminguo/p/7253930.html") print(res) classWebSite(HttpUser): #指定要执行哪个任务集 #task_set=My_task_set tasks=[My_task_set,] #请求和请求之间最小的间隔时间 min_wait=1000 #请求和请求之间最大的间隔时间 max_waif=2000 #Numberoftotaluserstosimulate 模拟的用户数 #Spawnrate 每秒钟产生的用户数
八、常见问题
1、cookies
locust中的client会自动帮我们处理cookies。类似request.session(),所以如果我们登陆的时候,只需要在on_start中登陆一次就可以了
2、多统计api的问题
如果在locust中,如果url是不需要统计,则我们不要用clent去访问api,应该用request去访问,这样就locust就不会统计request库发起的请请求
九、分布式调用的问题
一旦单台机器不够模拟足够多的用户时,Locust支持运行在多台机器中进行压力测试。 为了实现这个,你应该在master模式中使用--master标记来启用一个Locust实例。这个实例将会运行你启动测试的Locust交互网站并查看实时统计数据。
master节点的机器自身不会模拟任何用户。相反,你必须使用--slave标记启动一台到多台Locustslave机器节点,与标记--master-host一起使用(指出master机器的IP/hostname)。 常用的做法是在一台独立的机器中运行master,在slave机器中每个处理器内核运行一个slave实例。 注意:master和每一台slave机器,在运行分布式测试时都必须要有locust的测试文件。
在master模式下启动Locust: locust-fmy_loucstfile.py--master 在每个slave中执行(192.168.0.14替换为你msater的IP): locust-fmy_locustfile.py--slave--master-host=192.168.0.14
以上就是Pythonlocust工具使用详解的详细内容,更多关于Pythonlocust工具的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。