代码改变世界

Python - locust模块

2022-04-07 11:01  起个昵称  阅读(118)  评论(0编辑  收藏  举报

locust模块做压力测试

使用flask框架搭建的系统作为压测系统,压测前记得启动flask服务,参考上一个博客Flask框架

上代码。这里以访问博客首页、创建博客和更新博客三个接口做压测

 1 from locust import HttpUser, TaskSet, task
 2 
 3 class WebsiteTasks(TaskSet):
 4 
 5     def on_start(self):
 6         """
 7         启动时调用执行一次
 8         :return:
 9         """
10         self.client.post('/auth/login', {'username': 'admin', 'password': '123456'})
11 
12     @task      # @task(2) 在task后加上括号和数字是请求比例
13     def index(self):
14         self.client.get('/')
15 
16     @task
17     def create(self):
18         """
19         新建博客
20         :return:
21         """
22         payload = {'title': 'Third Blog','body': 'Hi this is my third blog'}
23         self.client.post('/create', payload)
24 
25     @task     # 不指定比例,则为1:1
26     def update(self):
27         """
28         更新第一个博客
29         :return:
30         """
31         payload = {'title': 'update first test', 'body': 'the first blog has been updated.'}
32         self.client.post('/1/update', payload)
33 
34 
35 class WebsiteUser(HttpUser):
36     tasks = [WebsiteTasks]    # 执行此类里的所有测试行为
37     host = 'http://127.0.0.1:5000/'
38     min_wait = 1000
39     max_wait = 5000

min_wait和max_wait为两次请求之间的间隔:1~5秒内的随机值

 

写好代码后,通过命令行启动locust

单进程运行模式

在locust脚本所在的目录打开命令窗口,输入 locust -f locust_first.py -P 8889

locust_first.py是脚本名,8889是打开locust图形界面的端口

启动好locus后,在浏览器输入http://localhost:8889/ 

三个参数,host为压测的host

 压测结果示例

如果是分布式模式,在管理界面上会多一个worker的页面

 

 

 多进程分布式运行模式

先启动master:

locust -H http://xxx.com -f filename.py --master -P 8088

 

再启动worker(原叫slave)

locust -H http://xxx.com -f filename.py --worker     # master和worker在同一台机运行
locust -H http://xxx.com -f filename.py --worker --master-host=启动master的机器IP    # master和worker不在同一台机运行

有几个worker启动,master命令窗口就会显示Currently x clients ready to swarm

 

 

 

 把master和worker都启动后,再打开界面管理器,比单进程多了workers信息

 

笔记

"""
1 数据集
在WebsiteUser定义一个数据集,所有虚拟用户在WebsiteTasks中都可以共享该数据集
如果不要求数据唯一性,数据集选择list数据结构,从头到尾循环遍历即可;
如果要求数据唯一性,数据集选择queue数据结构,取数据时进行queue.get()操作即可。
queue也可做数据循环,每次取完后用queue.put_nowait(data)放回队尾

2 检查点
对响应的内容关键字进行assert xxx in response操作即可

3 运行模式:单进程运行和多进程分布式运行

3.1 单进程运行模式又分:无界面运行和有界面运行,用于调试脚本和小并发压测的情况
3.1.1 无界面执行脚本命令: locust -f filename.py --headless -u 1 -r 1
-f filename.py 指定执行locust脚本文件
--headless 无界面模式,以前叫no_web,我用的是locust v2.8.5,已经改成headless了
-u 1 指定并发数 1个
-r 1 指定并发加压速率,默认值为1
3.1.2 有界面执行脚本命令:locust -f filename.py -P 8089
-f filename.py 指定执行locust脚本文件
-H 127.0.0.1 被测系统的host,若在terminal执行,则不指定
-P 8089 指定端口号

3.2 多进程分布式运行
3.2.1 高并发使用多进程分布式运行模式
3.2.2 同一台压力机上开启多个worker情况。如果一台压力机有N个处理器内核,那么就在这台压力机上启动一个master,N个worker
先启动master 命令:locust -H http://xxx.com -f filename.py --master -P 8088
再启动worker(master和worker在同一台机) 命令:locust -H http://xxx.com -f filename.py --worker
启动worker(master和worker不在同一台机):locust -H http://xxx.com -f filename.py --worker --master-host=启动master的机器IP
3.2.3 master和slave启动完毕后,可以在浏览器中通过http://master机器ip:8089进入locust的web管理页面了
"""