性能测试工具locust简单应用
简介
- Locust是一种易于使用的分布式用户负载测试工具。可用于对网站(或系统)负载测试,并依据响应数据计算出系统支持的并发用户数。
安装及调试(以下操作在windows环境下进行)
-
Locust基于python语言发开发,只需要装有python环境即可通过以下命令安装:
pip install locustio
提示安装成功后,可运行命令查看可用选项:
locust --help
-
调试代码
在locust中,所有用户行为都是通过python代码定义。可以通过locust命令和web端的UI界面提供的几个参数(虚拟用户总数/孵化率/Host)获取的请求信息,来模拟生成大量虚拟用户。以下是结合青享云平台编写的调试代码:
Example locustfile.py
1 import random 2 from locust import HttpUser, task, between 3 class QuickstartUser(HttpUser): 4 wait_time = between(5, 9) 5 # 要测试的场景1 6 @task 7 def index_page(self): 8 self.client.get("/3d/consumer.html") 9 # 要测试的场景2 10 # task带的数值代表当前任务在压测过程中的执行比重 11 # 本例中表示index_page任务与view_item任务压力比为1:3 12 @task(3) 13 def view_item(self): 14 self.client.get("[商品详情页地址]") 15 # 每个任务执行脚本执行的操作,类似于setUp()方法,同理on_stop()为任务结束后执行的操作 16 def on_start(self): 17 self.client.post( 18 url='地址', 19 json={"username": "账号", "password": "密码", "captcha": "", "remember": True, "requestId": ""})
当前文件名为locustfile的python文件是locust默认运行的task文件,在当前目录下命令行执行命令locust
即可运行启动locust服务;如果创建的文件名和位置不在当前运行路径下,可通过命令行控制运行,如下:
locust -f practice/my_qdcloud_locustfile.py
此时,可以在浏览器中访问本地8089端口地址 http://localhost:8089 打开locust UI界面,填写参数,即可开始测试:
参数说明:
Number of total users to simulate:需要创建的虚拟用户总数(即并发数)
Spawn rate:孵化率(每秒创建的虚拟用户数),所有的虚拟用户每秒创建多少
Host:base地址,代码中的地址优先级高于此处
执行后结果信息展示如上图所示,locust自带有数据表、统计图、fails统计信息、异常请求的展示界面、测试数据下载,感兴趣的同学自行百度。
核心参数:
Type:请求类型,即接口的请求方法;
Name:请求名称;
requests:当前已完成的请求数量;
fails:当前失败的数量;
Median:响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒;
90%ile:根据正态分布,90%的响应时间在正态分布平均值下方,即小于这个值;
Average:平均响应时间,单位为毫秒;
Min:最小响应时间,单位为毫秒;
Max:最大响应时间,单位为毫秒;
average Size:平均每个请求的数据量,单位为字节;
current RPS(requests per second):每秒钟处理请求的数量,即RPS。
实例代码:
1 import time 2 import execjs 3 from locust import HttpUser, task, between 4 import requests 5 class QuickstartUser(HttpUser): 6 @task 7 def scan_goods_page(self): 8 self.client.get('路径') 9 # wait_time = between(2, 5) 10 """ 11 # 订单生成任务请求 12 @task 13 def create_orders(self): 14 15 header = { 16 "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5......", 17 "Content-Type": "application/json;charset=UTF-8"} 18 self.client.request( 19 method="post", 20 headers=header, 21 url="路径", 22 data='{"totalFees":"0.01","totalCount":1,"cashFees":"0.01","shippingFees":"0.00","deliveryAddrId":483,' 23 '"receGoodsContacts":"黑色桌子","receGoodsTel":"13299990000",' 24 '"receGoodsAddr":"河北省|秦皇岛市|北戴河区|北戴河北戴河北戴河北戴河北戴河北戴河北戴河北戴河","skuAndCount":[{"skuId":27,' 25 '"defaultPicUri":"地址' 26 '13:38:49_af80dc87c10f48eab55093713973db9d.jpg","goodsName":"卡萨帝BCD-551WDCTU1","sellPrice":"0.02",' 27 '"earnest":"0.01","count":1,"subtotal":"0.01","sellModeFlag":"1","brandId":8,"shelvesId":1,' 28 '"partnerId":1,"specList":[{"specName":"尺寸","specValue":"475"},{"specName":"颜色","specValue":"白色"},' 29 '{"specName":"容量","specValue":"100ml"}]}],"invoice":{"invoiceType":"1","invoiceTitle":"个人",' 30 '"invoiceTitleCode":"","invoiceTitleType":"0","invoiceContent":"商品明细","customerName":"黑色桌子",' 31 '"customerPhone":"13299990000","companyName":"","dutyCode":"","bank":"","bankAccount":"",' 32 '"consignee":"","mobile":"","email":"","registeredAddress":"","registeredMobile":"","pcd":"",' 33 '"province":"","city":"","district":"","address":"","orderCode":"","orderId":"","userId":""}}') 34 time.sleep(2) 35 """ 36 def GetCookie(): 37 s = requests.session() 38 loginUrl = 'url' 39 postData = {"username": "用户名", "password": "密码", "captcha": "", "remember": True, "requestId": ""} 40 rs = s.post(loginUrl, postData) 41 requests.cookies.RequestsCookieJar() 42 c = requests.cookies.RequestsCookieJar() # 利用RequestsCookieJar获取 43 c.set('cookie-name', 'cookie-value') 44 s.cookies.update(c) 45 print(s.cookies.get_dict()) 46 # print(c.get("ibps-3.3.3-token") 47 # print(s.cookies.get_dict()) 48 def on_start(self): 49 with self.client.post(url='地址', 50 json={"username": "15866800632", "password": "1a2s3d4f", "captcha": "", "remember": True, 51 "requestId": ""}, 52 catch_response=True) as response: 53 if response.status_code != 200: 54 print("失败!请求状态码是:%s " % response) 55 else: 56 print("请求结果成功!") 57 # return print(response) 58 s = requests.session() 59 loginUrl = '地址' 60 postData = {"username": "15866800632", "password": "1a2s3d4f", "captcha": "", "remember": True, 61 "requestId": ""} 62 rs = s.post(loginUrl, postData) 63 requests.cookies.RequestsCookieJar() 64 c = requests.cookies.RequestsCookieJar() # 利用RequestsCookieJar获取 65 c.set('token', 'e09c769b-8191-42de-9ed1-3660067010a3') 66 s.cookies.update(c) 67 # get_token = execjs.compile(open(r"auth.js").read()).call('getToken', '') 68 return print(s.cookies.get_dict()) 69 def on_stop(self): 70 status = self.client.post(url="地址", 71 data={'access_token': 'e09c769b-8191-42de-9ed1-3660067010a3'}) 72 return print(status.status_code)
以上脚本可实现压测场景1、页面访问;2、订单生成场景;3、登录、退出