一连文章讲授,链接如下
【Python】Python之locust压测教程+从0到1demo:根本轻量级压测实战(1)
【Python】Python之locust压测教程+从0到1demo:高阶轻量级压测实战+常用参数详解(2)
一、什么是Locust
Locust 是一个开源的、基于 Python 的分布式负载测试工具,用于测试网站、Web 应用程序和API的性能和可扩展性。它通过模仿大量并发用户访问目的系统,资助开辟者和测试职员辨认系统在高负载下的体现和潜在瓶颈。
Python之locust官方文档:https://docs.locust.io/
二、Locust 架构组成
- 纯 Python 编写:Locust 使用 Python 编写测试用例,机动且易于维护。
- HTTP 请求:它是基于 requests 库发送 HTTP 请求。
- 协程运行:locust是使用协成运行的,用更低的本钱实现更多的并发。而且是基于gevent实现的。
- 分布式支持:支持分布式,支持更多的压力测试
- Web UI:内置了 Web UI,可通过欣赏器举行控制和监控。
- 插件扩展:我们可以用第三方的插件,举行扩展。
结论:如果你使用 Python 举行接口测试(尤其是使用 requests 举行接口测试的),那么就优先考虑使用 Locust 举行接口性能测试,由于更方便。
三、实战 Demo
我实现的demo是从0到1的。所以是从接口测试用例,转变成性能测试用例的一个过程。请留意看下面的内容。
预备一个可调用的接口
如果有可调用的接口,那么可以忽略这一步。
- 安装 Flask:
- 编写并运行以下代码,创建一个简单的登录接口:
- from flask import Flask, make_response
- app = Flask(__name__)
- @app.route('/', methods=['GET', 'POST'])
- def run():
- res = {
- 'code': 0,
- 'msg': "OK",
- 'data': {
- 'test': '测试页面'
- }
- }
- return make_response(res)
- if __name__ == '__main__':
- app.run(host='0.0.0.0', port=8080, debug=False, threaded=True)
复制代码 运行后,将天生一个可访问的接口。下面我们将会用这个接口去举行接口性能测试。
编写一个接口测试用例
使用 requests 调用刚才创建的接口,并编写一个简单的测试用例:
- import requests
- def test_request():
- resp = requests.get(url="http://127.0.0.1:8080/")
- print(resp.json())
- assert resp.status_code == 200
- if __name__ == '__main__':
- test_request()
复制代码 运行测试用例,如果没有报错,阐明接口正常。
编写一个性能测试用例
为了更好的演示和明白,所以我们预备将上面的接口测试用例,转换成locust的性能测试用例,如下:
首先,通过 pip 安装 Locust:
将上述测试用例转换为 Locust 的性能测试用例如下:
- import locust
- class MyUser(locust.HttpUser): # 1、在类中继承locust.HttpUser的子类,也就是创建这个子类
- # 4、添加locust给我们提供的函数between,里面1和2的值代表着每个task间隔1到2秒
- wait_time = locust.between(1, 2)
- @locust.task # 2、添加一个装饰器,表明这是性能测试用例
- def test_request(self):
- resp = self.client.get(url="http://127.0.0.1:8080/") # 3、使用self.client去发送请求
- print(resp.json())
- assert resp.status_code == 200
复制代码 转变步调阐明:
- 创建一个类,继承 locust.HttpUser。
- 使用 @locust.task 装饰器标识性能测试用例。
- 使用 self.client.get大概post 发送请求。
- 设置 wait_time = locust.between(1, 2) 添加locust给我们提供的函数between,里面1和2的值代表着每个task间隔1到2秒,相当于每个测试用例的间隔
执行性能测试用例代码
执行性能测试用例,有两种执行方式:
1、通过 Web UI 执行(GUI模式)
通过webUI来执行重要就是简洁方便,可以出具绘制图表来展示。但webUI也有一个小弊端,那就是制作的图表会浪费一些性能,由于制作图表的时候会实时获取数据,这也是浪费性能的缘故因由。
- 在终端运行 Locust 下令:
- 打开欣赏器访问 Web UI(通常为 http://0.0.0.0:8089)。
- 配置测试参数:
- Number of users (peak concurrency):模仿的并发用户数,例如 1000。
- Ramp up (users spawned/second):用户启动速率。好比:我们选择了1000个用户,如果我们这里填写10,也就代表着每秒有10个用户在调用 。
- Host:做过接口测试的同学都知道,就是填写接口的url。但是我们在性能测试用例中已经写了URL,那么这个就无所谓了。写不写都可以,所以我们就任意写个1(写1的缘故因由是由于这个为空的话会报错,也算是一个bug)
- Run time:测试运行时间,例如 120s 表示运行2分钟。如果要一直运行那就不写。
- 我们可以在 STATISTICS里面看到测试结果。
性能测试结果分析
(1)请求总数与失败数:
总请求数为 29293,失败请求数为 18071,失败率较高,为62%。这表明接口在高负载下的稳定性较差,需要开辟去调查失败的缘故因由。
(2)响应时间:
中位数响应时间为 70 ms,平均响应时间为 802.74 ms。中位数响应时间相对较低,阐明大部门请求的响应时间较快,但平均响应时间较高,大概是由于有少数请求的响应时间过长导致的。
95% 和 99% 的响应时间分别为 6300 ms 和 8900 ms,表明有 5% 和 1% 的请求响应时间超过了这些阈值,大概影响用户体验。
(3)最小值与最大值:
最小响应时间为 2 ms,最大响应时间为 10134 ms,最大响应时间的差异较大,阐明在某些情况下,接口的响应时间会非常慢。
(4)数据大小与吞吐量:
平均数据大小为 24.9 字节,当前每秒请求数 (RPS) 为 300.1,当前故障数为 300.1。吞吐量体现良好,但由于高失败率,现实可用的吞吐量是受到影响的。
性能参数描述Type请求类型,如Get/PostName请求路径Requests当前请求数量Failes请求失败数量Median中间值毫秒,一半的服务器响应低于该值,另有一半高于该值95%95%的请求响应时间Average平均值,单元毫秒,所有请求平均响应时间Min请求的服务器最小响应时间Max请求的服务器最大响应时间Average size单个请求大小,字节RPS每秒能处理惩罚的请求数目
- 运行测试后,可以在 CHARTS 页面检察实时数据。
RPS(吞吐量):349.7
最大用户数:600
结论:通过这个数据我们可以看到,如果每秒有600用户去访问我们的接口。那么我们的服务器是承载不了的,也就是说我们可以让600人同时在线。但是我们无法让349.7个用户,不能在同一时间都得到结果。
- 非常信息:测试接口拒绝连接,表明服务器崩溃。
- 代码非常:这代表接口用例执行失败抛出的非常。我们可以在后台看到,也可以在webUI内看到。
2、通过下令行执行(非GUI模式)
使用下令行来执行,就不会有页面和图表出现。所以会充实使用性能来举行测试接口。
常用的启动下令+参数
- locust -f 性能接口测试用例.py --headless -u 1000 -r 10 --host=1 --run-time 120s
复制代码 locust -f 性能接口测试用例.py:启动下令
--headless:无头参数,非GUI模式
-u 1000:代表1000个用户
-r 10:代表每秒10个用户递增
--host=1:就是填写的url,由于我们代码内置了,所以就任意写个1(为什么写1,是由于不写会报错)
-t大概--run-time 120s:就是运行的时长,运行120秒
启动之后的结果如下(我改成了5秒直接看结果):
小知识:工具对比
工具区别JMeter需要在 UI 界面上通过选择组件来“编写”脚本,模仿的负载是线程绑定的,意味着每个用户需要一个单独的线程。单台负载机可模仿的负载数有限。Locust通过编写简单易读的代码完成测试脚本,基于事件驱动,同样配置下,单台负载机可模仿的负载数远超 JMeter。 如果您以为本文对您有资助,欢迎点赞、收藏和分享!有任何疑问或发起,欢迎在评论区留言讨论。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |