zoukankan      html  css  js  c++  java
  • 性能测试工具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、登录、退出

  • 相关阅读:
    4.nmap常用命令备忘录
    1.封神台sql注入实战靶场
    第一章、为了女神小芳
    2.kali部署vulhub
    5.docker可视化
    6.docker精髓
    【Rust】引用模式
    【Rust】虚类型测试
    【Rust】可变借用
    【Rust】虚类型参数
  • 原文地址:https://www.cnblogs.com/marvintester/p/14314413.html
Copyright © 2011-2022 走看看