| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> 面向Web应用的并发压力测试工具——Locust实用攻略 -> 正文阅读 |
|
[开发测试]面向Web应用的并发压力测试工具——Locust实用攻略 |
1. 概述该方案写作目的在于描述一个基于Locust实现的压力测试,文中详细地描述了如何利用locustfile.py文件定义期望达成的测试用例,并利用Locust对目标站点进行并发压力测试。
关于Locust这个压力测试工具,其官网与文档,请关注如下链接: 如果不想阅读英文文档,那么强烈建议先读如下链接中的内容: 接下来,我将重点讲解不同场景下的 locustfile.py 的写作方法。 首先,我们聊一聊什么是 locustfile.py。 2. 什么是locustfile.pyLocust通过识别 如果你利用Rainbond应用市场一键安装部署了 Locust 集群,那么你可以在 locust_master 组件的 环境配置 > 配置文件设置 中找到已挂载的该文件,如有必要,只需要修改里面的内容,然后更新整个应用(包括 locust_master 和 locust_slave集群)。 locustfile.py 是一个标准的 python 脚本文件,通过官方指定的方式,你可以在这个文件里定义特定的类 ,通过类实例化之后,就会“孵化”出符合定义的实例,模仿用户对被测试的目标站点“群起而攻之”,就像蝗虫(Locust)一样,这就是 Locust 得名的由来。 3. 写作的要领locustfile.py文件的写作,核心是规定了两个类(class),它们分别继承由locust导入的 HttpLocust 、TaskSet 两个超类。
简要的写作方式如下面的代码所示:
在这个 locustfile.py 中,我依次做了这些事:
一个 locustfile.py 的基本框架即是如此。当然还可以有其它的方式来定义这个文件,但是我认为这种写作方式已经足够,而且明了。 关于 至此,我们基本可以明确,真正的难点在于如何定义任务类。至于 Mytest 这个类,大多数情况下复制上面的代码,就已经足够了。 4. 典型的场景下面我们来聊一聊,在以下几个典型的场景下,该如何定义任务类:
4.1 get请求这是一种最简单的场景,一般情况下,我们会通过 get 方法,来请求站点的静态页面资源,比如 /index.html 这样的路径。 简要代码如下:
这就定义了一个简单的压测目标站点 “/index.html” 的get请求。 4.2 post请求post请求一般用于带着参数访问站点的指定接口,来实现一些特定的功能,比如登陆行为。 简要代码如下:
这就定义了一个post请求,用来携带着用户名密码进行一次登陆。
4.3 获取响应在一些请求完成后,其响应(response)的内容往往非常关键。在这里最重要的有两点:
Locust中的所有请求,都可以通过下面的方法获得状态码和返回的内容: 获取返回状态码:
即实例 response.status_code 返回了这次请求的状态码。 获取返回的内容:
4.4 猴子测试假设一只“猴子”作为用户,它不会按照正常的业务流程去使用业务系统,而是瞎搞一气,还没注册就登陆,没有选择商品就要付钱。这可以帮助我们发现更多在正常业务流程之外的BUG。 我们已经了解到如何定义一些普通的请求方式,来请求我们所有已知的接口,那么我们只需要把这些任务统统放进我们的 4.5 流程测试在这里我想表达如何进行一次对某一业务流程的顺序测试。和之前的猴子测试不同,我会在这个测试中规划一个正确的流程。如果这个流程可以走得通,并承受住大并发压力的考验,那么就可以认为业务系统通过了测试。 这份 流程测试是这个方案的重点,所以我专门找了一个CRM系统,来作为测试的受体,然后对 登陆 —— 获取用户列表 —— 新增用户 —— 删除用户 —— 登出 这一流程做压力测试。 特意指出,在这里我不仅使用了类似 来看看代码:
接下来讲解下和最开头的模版不一样的地方:
整个流程测试任务的重点,在于明确地规划好整个测试的任务流程。在执行流程测试的时候,一定要保证业务是按照我们预先设计好的流程进行,这样才可以发现在大并发压力下,我们的业务系统是否正常表现。 对于这个例子而言,登陆后的操作如何保持登陆态?新建用户要传递哪些参数?删除用户的凭据是什么?这三个问题是保障整个流程顺利进行的重点,而这三个问题的答案都在于请求时传递哪些参数。
5. 请求的参数这里所说的参数,是一个广义的概念,实际上包括了 有很多的时候,被测试的业务系统,并不是我们自己设计的,我们并不知道这些 “参数” 究竟包含什么,在这一节,我想要阐述一个方法,可以通过浏览器来帮助我们获取这些“参数”。 对于 B/S 架构程序而言,我们通过浏览器进行的所有操作,都是有迹可循的。打开浏览器的 检查 (一般情况下,默认快捷键 F12),选择 Network 并进行操作,就可以获悉我们通过浏览器到底做了什么。 下面是一个例子,模拟了CRM系统在登陆时的行为:
结合下实际的请求,这会更利于理解:
实际上参数名可以省略,用以上参数,就可以获取执行请求的全部参数了。 那么请求成功后,会得到什么返回呢? 切换到 Preview 或者 Response 页面,可以得到接口的返回,建议看 Preview 。
接下来,我们来执行列示用户的操作,访问用户管理页面,选择用户,可以得到 看到这里,我们就明确了,为什么在登陆时会返回 通过分析浏览器中的请求信息,我们就可以知道特定的流程中浏览器为我们做了哪些事,接着就可以去定义测试任务了。 6. 断言前文已经说过,Locust 默认通过请求返回的状态码来判断这次请求是否成功,但是这还不够。我在测试CRM的时候,发现了一个问题。 我没有执行登陆操作,直接去列示了所有用户,这个操作返回给我如下回复:
状态码返回200,这将导致Locust 认为该请求执行成功。 CRM的处理也是正确的,我没有登陆,却请求了这个端口,CRM非常明确地处理了这个问题,告诉我“请先登录”。 但是从我自定义的业务流程上讲,这是个错误,我并没有获取我预期的所有用户的列表。我希望在Locust的结果分析中,将这种情况视作失败的请求,所以,我需要一个断言。 断言就是分析请求的返回,即使状态码返回2xx、3xx,也可以根据返回内容将任务判定为失败状态,反之亦然。 Locust 中断言的实现,是在请求中设置 我们来优化CRM测试任务中有关
执行压力测试后,我的目的达到了: 结果分析也抛出了我已经设定好的消息: 7. 压力使用Locust的一大好处就是它可以模拟很大的压力,这里我不去描述它在实现原理上有何优势,而是想向大家介绍它的分布式特点。Locust支持主从集群模式,主节点(locust_master)负责压力测试任务的调度,从节点(locust_slave)负责具体的用户模拟和测试的执行。其中,从节点支持分布式部署。也就是说,如果需要,就可以使用Rainbond的横向伸缩功能扩展出很多 locust_slave 的实例,能够模拟的压力也就随之增大。 这一节,我们来描述在WEB-UI界面中如何定义压力。 访问 locust_master 服务组件的 8089 端口,会进入到WEB-UI界面,并开始规划一个新的压力并发。
那么,Locust能提供多大压力,是否有个衡量呢?我执行的一个测试显示,3个slave的 Locust可以轻松提供5000并发。 而被压测的CRM已经超出了能接受的压力极限,开始出现大量的错误,使用的内存急剧飙升到了90%以上,Locust 得出的 Failures 页面报告了错误产生的原因。 8. 结果分析借助Locust提供的WEB-UI界面,我们可以非常方便地分析压力测试结果。 Statistics页面将向我们展示所有被压测接口的汇总报告,结果包括: 请求总数、失败次数、中位数响应时间、90%请求响应时间、平均响应时间、最小响应时间、最大响应时间、请求的平均大小、当前吞吐率、当前错误率。 Charts页面将主要结果绘制成为随时间变化的图表,能够在趋势上给予用户指引。 除了这些之外,还有几项值得关注的值会在最上面一排全局展示,包括当前请求的主机域名、当前产生的并发用户数量、slave节点数量、当前所有请求接口的总吞吐率、错误率,以及停止测试的按钮。 其它的几个页面会提供请求失败的接口及失败原因(Failures)、测试中意外的错误以及错误原因(Expections)、csv格式的测试数据下载地址(Download Data)、 所有slave实例的信息(Slaves)。 所有的数据都基于图形展示,十分方便。 9. 写在最后Locust 是一个相当不错的压力测试工具,可自由定制的东西很多,我写在这个方案中的种种用法还不足以囊括它的所有特性,但是 Good Enough is Best ,这个方案已经可以应付绝大多数场景了。 Rainbond 是一个开源的云原生应用管理平台,使用简单,不需要懂容器和Kubernetes,支持管理多个Kubernetes集群,提供企业级应用的全生命周期管理,功能包括应用开发环境、应用市场、微服务架构、应用持续交付、应用运维、应用级多云管理等。 |
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/18 6:47:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |