针对性能测试工具Gatling与Jmeter的比较及看法

本文涉及的产品
性能测试 PTS,5000VUM额度
日志服务 SLS,月写入数据量 50GB 1个月
简介: 对于Gatling的优点网上也总结了很多,我也不多说,但是光从测试场景配置上来说,Gatling就不输Loadrunner......
版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问我的博客 https://blog.csdn.net/smooth00/article/details/80014622

我是一个用惯Loadrunner的人,由于Loadrunner过于重量级,不方便在云端部署和使用,所以平常在这方面只能选择Jmeter,Jmeter的开源性和轻量化是我最喜欢的地方,但是Jmeter的脚本开发模式是我最不喜欢的地方:jmx脚本对应的XML格式太不直观,不方便维护和管理,代码调试也不方便(对于我们这些不愿意依赖于脚本录制的人来说,这点很重要),另外不喜欢的就是Jmeter的性能和稳定性,即使用了Non-GUI + 分布式压测的模式,Master节点的承受能力也不如Loadrunner。

        所以我真的比较倾向于找一款既能像Loadrunner那样高性能高稳定性,代码维护管理自如,又能像Jmeter那样轻量级的、高扩展性的测试工具。目前来看好像不存在这种工具,但是有一款性能测试工具叫Gatling,与Jmeter进行分析比较了一下,觉得它很有潜力,兴许哪一天,它借鉴了Jmeter的一些优点,就达到了我的要求,或者Jmeter借鉴一下它,做个翻天腹地的改造,那也未尝不可。


        对于Gatling的优点网上也总结了很多,我也不多说,但是光从测试场景配置上来说,Gatling就不输Loadrunner,拿例子来说明:

setUp(  
  scn.inject(  
    nothingFor(4 seconds), // 场景1  
    atOnceUsers(10), // 场景2  
    rampUsers(10) over(5 seconds), // 场景3  
    constantUsersPerSec(20) during(15 seconds), // 场景4  
    constantUsersPerSec(20) during(15 seconds) randomized, // 场景5  
    rampUsersPerSec(10) to(20) during(10 minutes), // 场景6  
    rampUsersPerSec(10) to(20) during(10 minutes) randomized, // 场景7  
    splitUsers(100) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds), // 场景8  
    splitUsers(100) into(rampUsers(10) over(10 seconds)) separatedBy(atOnceUsers(30)), // 场景9  
    heavisideUsers(100) over(20 seconds) // 场景10  
    ).protocols(httpConf)  
  )  

以上代码包含了10个场景的例子:

1. nothingFor(4 seconds) 
   在指定的时间段(4 seconds)内什么都不干
2. atOnceUsers(10)
   一次模拟的用户数量(10)。
3. rampUsers(10) over(5 seconds)
   在指定的时间段(5 seconds)内逐渐增加用户数到指定的数量(10)。
4. constantUsersPerSec(10) during(20 seconds)
   以固定的速度模拟用户,指定每秒模拟的用户数(10),指定模拟测试时间长度(20 seconds)。
5. constantUsersPerSec(10) during(20 seconds) randomized
   以固定的速度模拟用户,指定每秒模拟的用户数(10),指定模拟时间段(20 seconds)。用户数将在随机被随机模拟(毫秒级别)。
6. rampUsersPerSec(10) to (20) during(20 seconds)
   在指定的时间(20 seconds)内,使每秒模拟的用户从数量1(10)逐渐增加到数量2(20),速度匀速。
7. rampUsersPerSec(10) to (20) during(20 seconds) randomized
   在指定的时间(20 seconds)内,使每秒模拟的用户从数量1(10)增加到数量2(20),速度随机。
8. splitUsers(100) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds) 
   反复执行所定义的模拟步骤(rampUsers(10) over(10 seconds)),每次暂停指定的时间(10 seconds),直到总数达到指定的数量(100)
9. splitUsers(100) into(rampUsers(10) over(10 seconds)) separatedBy(atOnceUsers(30))
   反复依次执行所定义的模拟步骤1(rampUsers(10) over(10 seconds))和模拟步骤2(atOnceUsers(30)),直到总数达到指定的数量(100)左右
10. heavisideUsers(100) over(10 seconds)  
  在指定的时间(10 seconds)内使用类似单位阶跃函数的方法逐渐增加模拟并发的用户,直到总数达到指定的数量(100).简单说就是每秒并发用户数递增。

就拿场景8来说,可以制造一种波浪型压力,非常适合模拟一种脉冲式的压力测试或是某类稳定性测试(压力按波峰波谷有规律的分布),如下所示:


------------------------------------------------------------------------------------------------------------------

        虽然Gatling很让我们惊奇,但就目前来说,还远没有达到我们的最佳选择,不过研究它已经非常有必要了,毕竟一个好工具的普及不是一天两天的事。Jmeter有那么多不如意的地方,但我们还得继续用呀,现在脚本的易维护性方面还不是最重要的问题,最紧迫的是如何对Jmeter进行减负,以实现稳定超高并发测试,目前只能考虑以下的方式进行:

减负一,优化监听(GUI模式,尽量不考虑)
1.“查看结果树”,需要勾选“仅日志错误”,这样只会保存错误日志到内存,数据不会多。如果保存所有,那么会保存每个请求信息和相关信息,而且这些数据都是保存到jvm内存的,且常驻数据无法回收,上万十万大量请求很快就会压垮jmeter。
2.“聚合报告”中小并(100以内)发可以保留;高并发去掉,添加“Simple Data Writer”且保存csv格式数据。“聚合报告”是非常消耗cpu的。
3.其他监听组件可以都去掉,测试完后通过保存的结果,线下生成图表报告

减负二,优化监听(Non-GUI命令行模式)
1.“查看结果树”,需要勾选“仅日志错误”,需要设置路径,保存错误信息到文件,并且保存所有信息(点击Configure,勾选所有非CSV选项)
2.“聚合报告”命令行下无效
3. 其他监听组件可以都去掉,基本在Non-GUI下无效

减负三,结果文件优化
1. 结果数据一定要保存为CSV格式(比起xml格式,每条数据会少很多)(可以用Non-GUI命令指定csv日志保存)
2.“查看结果树”保存的错误信息要保存为xml,可以保存完整结果信息,方便错误分析

减负四,如果要超高并发建议不要直接使用分布式压测
1. jmeter分布部署只是缓解问题,没根本解决问题,高并发时master机器承受的压力很大,形成单点,无法在高并发时提供稳定负载
2. 数据会写可能丢失
3. 解决方法:需要手工运行slave,或利用jenkins同时触发多台slave

减负五,再强调一下,建议用Non-GUI命令行模式运行,并且选择Linux环境运行Jmeter也是很有必要的
1. 用Non-GUI运行jmeter生成csv报告,但别输出html报告(需要高jvm内存来完成,所以分成两步进行)
2. 修改jmeter的jvm内存(建议物理内存的一半,HEAP的xms和xmx,1G的csv报告建议对应2G的xmx大小),用高jvm内存来转换csv报告至html报告(内存不够就换机器来转换报告)

减负六,可以选择用Jmeter + Grafana + InfluxDB的方式,来代替报告文件的生成,参考我的另一篇文章《关于Jmeter长时间压测的可视化监控报告
1. 将Jmeter分布式集群去中心化,Master节点不再负责收集和处理测试数据,只负责调度slave节点
2. 支持多Master-slave,形成多路Jmeter测试集群(利用Jenkins或其他调度工具同时触发调度测试)

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
23天前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
16天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
109 17
Selenium:强大的 Web 自动化测试工具
|
26天前
|
机器学习/深度学习 人工智能 算法
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
BALROG 是一款用于评估大型语言模型(LLMs)和视觉语言模型(VLMs)在复杂动态环境中推理能力的基准测试工具。它通过一系列挑战性的游戏环境,如 NetHack,测试模型的规划、空间推理和探索能力。BALROG 提供了一个开放且细粒度的评估框架,推动了自主代理研究的进展。
37 3
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
|
1月前
|
监控 测试技术 开发工具
移动端性能测试工具
移动端性能测试工具
49 2
|
1月前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
|
1月前
|
安全 网络协议 关系型数据库
最好用的17个渗透测试工具
渗透测试是安全人员为防止恶意黑客利用系统漏洞而进行的操作。本文介绍了17款业内常用的渗透测试工具,涵盖网络发现、无线评估、Web应用测试、SQL注入等多个领域,包括Nmap、Aircrack-ng、Burp Suite、OWASP ZAP等,既有免费开源工具,也有付费专业软件,适用于不同需求的安全专家。
174 2
|
1月前
|
监控 网络协议 Java
一些适合性能测试脚本编写和维护的工具
一些适合性能测试脚本编写和维护的工具
|
1月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
77 3
|
1月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
57 1
|
1月前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
68 1