lsekfe 发表于 2023-4-13 13:08:00

性能测试工具Locust之Python

一、性能测试基础
  1、性能测试该怎么做?
  利用工具模拟真实用户操作。
  2、性能测试基础:
  性能:事物的性质和能效 -->效率性能 (时间/资源/容量)
  思考:如何评价软件系统的性能?
  ·快慢:衡量系统的处理效率 (响应时间)
  · 多少:衡量系统的处理能力(单位时间内,能处理多少个事物)
  3、性能测试常见的性能指标:
  响应时间:rt (系统从发出请求开始直到请求结束的时间)
http://www.51testing.com/attachments/2023/02/15326880_202302171544591R1B5.jpeg
  吞吐量:tps / rps / qps (个/ 时间) throughput : 网络带宽/磁盘io kb/单位。
  资源利用率: cpu/内存/磁盘大小/磁盘io/网络带宽。。。(第三方工具:监控平台)
  4、性能测试分类: 根据测试需求
  · 负载测试 load testing
  不断的向服务器加压,直到预期的指标 或者 部分的系统资源达到上限。
  目的:找到系统的最大负载能力。
  ·压力测试(稳定性测试)
  目的:验证系统是否稳定。
  在负载测试基础上不断加压。
  · 并发测试
  单位时间内同时向服务器发送请求。
  目的:检验当大量用户同时访问一个应用、功能模块或者数据的时候,观察系统是否存在事物冲突或者锁升级的现象。
  · 配置测试
  运行时硬件的配置要求。
  · 基准测试
  少量用户验证服务器资源的消耗情况。
  · 容量测试
  系统处于最大负载状态或某项指标达到所能接受的最大阈值下对请求的最大处理能力
  5、性能测试的关键:
  需求分析 --> 分析被测系统的架构/分析被测系统的业务逻辑/具体性能指标。
  二、性能测试工具对比
http://www.51testing.com/attachments/2023/02/15326880_202302171545021vrWu.png
  1、LoadRunner 是非常有名的商业性能测试工具,功能非常强大。使用也比较复杂,目前大多介绍性能测试的书籍都以该工具为基础,甚至有些书整本都在介绍LoadRunner 的使用。
  2、Jmeter 同样是非常有名的开源性能测试工具,功能也很完善,它可以作为接口测试工具的使用。但实际上,它是一个标准的性能测试工具。关于Jmeter相关 的资料也非常丰富,它的官方文档也很完善。
  3、Locust 同样是性能测试工具,虽然官方这样来描述它 “An open source load testing tool.” 。但其它和前面两个工具有着较大的不同。相比前面两个工具,功能上要差上不少,但它也并非优点全无。
  Locust 完全基本 Python 编程语言,采用 Pure Python 描述测试脚本,并且 HTTP 请求完全基于 Requests 库。除了 HTTP/HTTPS 协议,Locust 也可以测试其它协议的系统,只需要采用Python调用对应的库进行请求描述即可。
  LoadRunner 和 Jmeter 这类采用进程和线程的测试工具,都很难在单机上模拟出较高的并发压力。Locust 的并发机制摒弃了进程和线程,采用协程 (gevent)的机制。协程避免了系统级资源调度,由此可以大幅提高单机的并发能力。
  优势:
  1、测试脚本形式:简单好学,学习成本低。
  2、单机并发能力:通过python特有的协程方式生成成千上万的并发,使在一台普通的电脑跑出几万几十万的并发。
  三、Locust入门
  1、Locust是什么?
  Locust 是一种易于使用、可编写脚本且可扩展的性能测试工具。
  可以在常规 Python 代码中定义用户的行为,而不是停留在 UI 或限制性特定领域的语言中。
  这使得 Locust 可以无限扩展并且对开发人员非常友好。
  2、Locust安装
  前提:安装python3.7或更高版本
  # 安装
  pip3 install locust

  # 验证安装
  locust -V


  3、Locust命令行参数
http://www.51testing.com/attachments/2023/02/15326880_202302171545051VcMH.pnghttp://www.51testing.com/attachments/2023/02/15326880_202302171544571pfPE.png
  4、Locust脚本开发及使用方法
  脚本:
  '''导包'''
  from locust import HttpUser, between, task,TaskSet


  class WebsitUser(HttpUser):
  # 设置一个随机时间间隔
  wait_time = between(3, 5)
  # host可填可不填,不填时执行脚本打开locust页面时可填入
  host = "https://baidu.com"

  def on_start(self):
  self.client.post('/login', {
  'username': 'test',
  'password': ''
  })

  @task
  def index(self):
  self.client.get('/index')

  @task
  def about(self):
  self.client.get('/about')


  常用的locust类:
  HttpUser:用于执行请求(执行类)。
  TaskSet:用于定义测试任务信息(任务信息类)
  task:用于声明函数是否为测试任务。
  between:用于设定每个测试题任务之间的等待时间。思考时间: 为了模拟真实用户的操作,在脚本中设定的一种等待时间
  请求方法(client)
  client:Locust 的请求方法,由requests二次封装而成。
  启动参数:
  –headless 表示不使用Web界面运行测试。
  -c 设置虚拟用户数,即并发用户数。
  -r 设置每秒启动虚拟用户数,即每秒请求数。
  -t 或–run_time,设置设置运行时间。
  –csv 表示运行结果文件名。
  四、locust框架组成与工作流程
  1、locust核心库
http://www.51testing.com/attachments/2023/02/15326880_202302171545071rSKL.jpeg
  gevent:gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的高层同步API。
  flask:Python编写的轻量级Web应用框架。
  requests:Python的HTTP库。
  msgpack-python:MessagePack是一种快速、紧凑的二进制序列化格式,适用于类似JSON的数据格式。msgpack-python主要提供MessagePack数据序列化及反序列化的方法。
  six:Python2和Python3兼容库,用来封装Python2和Python3之间的差异性。
  pyzmq:pyzmq是zeromq(一种通信队列)的Python绑定,主要用来实现Locust的分布式模式运行。
  2、Locust工作流程:
http://www.51testing.com/attachments/2023/02/15326880_2023021715451014y2D.jpeg
  首先,执行WebsiteTasks中的On_start (只执行一次),作为初始化。
  然后,从WebsiteTasks中随机挑选(如果定义了任务间的权重(Weight)关系,那么就按照权重关系随机挑选)一个任务执行。
  接着,根据Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义了min_wait和max_wait,TaskSet中的优先),在时间范围中随机取一个值,休眠等待。
  最后,重复2~3步骤,知道测试任务终止。
  五、Locust脚本开发
  # 第一步:导入Locust包
  from locust import TaskSet,HttpUser,task

  # 定义一个类
  class WebsitUser(HttpUser):
      # 设置一个随机时间间隔
      wait_time = between(3, 5)

      def on_start(self):
        self.client.post('/login', {
              'username': 'test',
              'password': ''
        })

      # 设置任务,@task装饰器用于声明函数是一个测试任务,@task(权重)
      @task(1)
      def index(self):
        self.client.get('/index')


  TaskSet的用法:
  TaskSet实现了虚拟用户所执行任务的调度方法。包括:
  -- 任务执行顺序:schedule_task
  -- 指定下一个执行的任务:execute_next_task
  -- 执行任务:execute_task
  -- 休眠等待:wait
  -- 中断:interrupt
  from locust import TaskSet,HttpUser,task

  # 定义任务信息
  class TestBaidu(TaskSet):

      @task
      def test_001(self):
        self.client.get('/')

  # 控制执行,
  class TestUser(HttpUser):
      task_set = task(TestBaidu)
      host = 'http://lbs.amap.com'
      max_wait = 5000
      min_wait = 3000


  六、UI界面及测试结果
  1、UI界面
  配置启动参数
http://www.51testing.com/attachments/2023/02/15326880_20230217154513164Sr.png
  Number of users : 设置模拟用户数。
  Spawn rate : 每秒产生(启动)的虚拟用户数。
  Host :被测主机(如果在脚本中指定了host启动页面将使用脚本中的host)
  Start swarming :开始运行性能测试。
  每秒请求用户数(TPS)
http://www.51testing.com/attachments/2023/02/15326880_202302171545161MqMo.png
  响应时间
http://www.51testing.com/attachments/2023/02/15326880_202302171545191CS46.png
  用户数
http://www.51testing.com/attachments/2023/02/15326880_202302171545251DXC6.png
  运行的异常信息
http://www.51testing.com/attachments/2023/02/15326880_20230217154528111bx.png
  2、测试结果
http://www.51testing.com/attachments/2023/02/15326880_202302171545311t465.png
  结果说明
  Type: 请求的类型,例如GET/POST。
  Name:请求的路径。
  request:当前请求的数量。
  fails:当前请求失败的数量。
  Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值。
  Average:平均值,单位毫秒,所有请求的平均响应时间。
  Min:请求的最小服务器响应时间,单位毫秒。
  Max:请求的最大服务器响应时间,单位毫秒。
  Content Size:单个请求的大小,单位字节。
  reqs/sec:是每秒钟请求的个数。
  下载测试结果
http://www.51testing.com/attachments/2023/02/15326880_202302171545371XPek.png

页: [1]
查看完整版本: 性能测试工具Locust之Python