vlambda博客
学习文章列表

接口性能测试工具之Locust

Locust(俗称 蝗虫), 一个轻量级的开源压测工具,用Python编写。

常见性能测试工具:①jmeter ②loadrunner ③locust

locust优点:

  • 基于协程,单机并发能力强

  • 开源免费,支持二次开发

locust缺点:

  • 不支持资源监控,结果图表简单

安装(以mac os为例)

注意:安装是需要特别注意的步骤,由于locust在2020年5月26日从0.版本正式进入1.版本时代,所以在安装方式和使用方式上都出现了较大的变化,网上的教程大多以0.版本为例进行讲解,所以安装时候一定要提前查清楚自己需要的是0.版本还是1.*版本,或者直接去官网查看相关资料。

我第一次安装locust时,参考了很多博客,大多数博主给出的安装步骤为直接运行pip install locustio,但是我在安装过程中频频出错,使用sudo pip install locustio也无济于事,查询了很多资料之后,得知最新的locust安装命令为pip install locust,也就是从0.*到1.*的版本变化中包的名字发生了变化!!!这也太坑了,说好的兼容呢?后面还有更坑的。

所以最简单的正确安装方式为:pip install locust

如果你想用0.*版本的,使用:pip install locustio=0.*(一定要指定一个版本)

还有一种安装方式为需要在github上下载locust项目包到本地,然后在包路径下执行命令安装:python setup.py install

 #setup.py文件  从install_requires中能够看出locust所需要的包
 setup(
    name="locust",
    version=version,
    install_requires=[
        "gevent>=20.9.0", #协程
        "flask>=1.1.2",   #wed服务框架
        "Werkzeug>=1.0.1",
        "requests>=2.9.1", #http请求
        "msgpack>=0.6.2",
        "pyzmq>=16.0.2", #分布式运行
        "geventhttpclient>=1.4.4",
        "ConfigArgParse>=1.0",
        "psutil>=5.6.7",
        "Flask-BasicAuth>=0.2.0",
    ],
    test_suite="locust.test",
    tests_require=[
        "cryptography",
        "mock",
        "pyquery",
    ],
 )

安装成功后通过locust --help命令进行验证

压测脚本编写

1.*版本压测脚本代码

 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 # locustdemo.py
 
 from locust import TaskSet,task,HttpUser
 
 
 class Testlocust(TaskSet): #任务类
 
     @task(1)  # (1)代表以下任务在本次测试中的权重为1,如果总共发30次请求,按照比例有10次会调用hello_demo
     def hello_demo(self):
         self.client.get("/hello",verify = False)
 
     @task(2)  # (1)代表以下任务在本次测试中的权重为2,如果总共发30次请求,按照比例有20次会调用goodbye_demo
     def goodbye_demo(self):
         self.client.get("/goodbye",verify = False)
 
 
 class WebsiteUser(HttpUser): #虚拟用户类
     tasks = [Testlocust] #执行的任务类
     min_wait = 1000  #调用最小间隔时间 ms
     max_wait = 5000  #调用最大间隔时间 ms
 
 
 if __name__ == "__main__":
     import os
     os.system("locust -f locustdemo.py --host=http://127.0.0.1:80")  #也可以在终端执行该命令

对应的0.*版本的脚本编写

 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 # locustdemo.py
 
 from locust import TaskSet,task,HttpLocust
 
 
 class Testlocust(TaskSet): #任务类
 
     @task(1)  # (1)代表以下任务在本次测试中的权重为1,如果总共发30次请求,按照比例有10次会调用hello_demo
     def hello_demo(self):
         self.client.get("/hello",verify = False)
 
     @task(2)  # (1)代表以下任务在本次测试中的权重为2,如果总共发30次请求,按照比例有20次会调用goodbye_demo
     def goodbye_demo(self):
         self.client.get("/goodbye",verify = False)
 
 
 class WebsiteUser(HttpLocust): #虚拟用户类
     task_set = Testlocust
     min_wait = 1000  #用户执行任务之间等待时间的下界 ms
     max_wait = 5000  #用户执行任务之间等待时间的上界 ms
 
 
 if __name__ == "__main__":
     import os
     os.system("locust -f locustdemo.py --host=http://127.0.0.1:80")  #也可以在终端执行该命令

1.*对比0.*版本脚本使用相关的区别可以参考文章:locust 的 ‘1’ 版本时代变化这篇文章讲解比较到位,其他的相关定义可以搜各种locust相关的博客,只要明白了0.*和1.*之间的区别,写代码就是比较简单的事情了

参数配置

运行我们写好的脚本后,打开浏览器http://0.0.0.0:8089/

接口性能测试工具之Locust

我们这里设置用户并发总量为1000,每秒用户增长数量为5,压测目标按照你的目标压测应用填写,当然你的目标必须有任务中的接口,这个比较容易理解的,可以看看其他博客

报告分析

接口性能测试工具之Locust

压测过程 正在测试http://www.baidu.com接口,可以看到请求总数量为165,RPS(每秒请求数量)为11.4,

Median(代表响应时间中位数)为8ms,Average(代表平均响应时间)为159ms,可以点击STOP停止测试,Download Data界面可下载测试报告

比较难理解的其实是一些报告参数,我只解释重要且比较难理解的,涉及时间单位为ms:

Request Statistics

  • Type 请求接口类型

  • Name 具体接口

  • Requests 发送请求总量

  • Fails 失败请求总量

  • Median 接口响应时间中位数

  • 90%ile 正态分布的90%的接口响应时间小于以下数值

  • Average 接口平均响应时间

  • Min 接口最小响应时间

  • Max 接口最大响应时间

  • Average size 接口请求中数据交换平均值

  • Current RPS 当前每秒请求数量

  • Current Failures/s 当前每秒请求失败数量

Response Time Statistics

  • 50%ile(ms) 正态分布的50%接口响应时间小于该数值

  • 由于接口请求可能会存在异常,所以性能测试中,95%ile(ms)比较具有参考价值,能更好的反映接口性能

Charts

  • Total Requests per Seconds  随时间增长的请求总量

  • Response Time 按时间维度看接口响应时间变化

  • Number of Users 用户增长量,会随着时间增长,最终停留在我们设置的用户并发数量    关于locust还有很多值得探索的地方,这篇文章作为入门的学习记录,后续可以继续研究一下locust的源码,如何利用协程进行并发测试,locust压测脚本的编写异常灵活,大家可以多去网上找一些实战博客,多看别人的代码,locust还是非常值得学习的,如果有兴趣,也可以在它的基础上二次开发,做一个功能更加丰富的平台。