性能测试工具locust简单应用

简介

  • Locust是一种易于使用的分布式用户负载测试工具。可用于对网站(或系统)负载测试,并依据响应数据计算出系统支持的并发用户数。

安装及调试(以下操作在windows环境下进行)

    • Locust基于python语言发开发,只需要装有python环境即可通过以下命令安装:

      1. pip install locustio

      提示安装成功后,可运行命令查看可用选项:

      1. 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、登录、退出

原文地址:https://www.cnblogs.com/marvintester/p/14314413.html