记一次Ngrinder性能测试实践

背景  

最近收到测试需求需要从公网对服务进行测试,当然场景、接口前期需求均已经梳理结束。部署时发现jmeter无法拉起分布式集群(云服务器分布多个地域多厂商包括阿里云、华为云等),当然也有解决方案。不过本人比较懒,一是部署繁琐、二是临时测试需求资源随时释放,不宜平台化部署,加之用过Ngrinder进行过测试,果断部署Ngrinder进行测试,测试过程中也踩坑这边记录下测试NGrinder测试实践。

什么是NGrinder?

是一个基于Java的开源性能测试框架,通过多个agent负载机很方便的进行分布式测试。nGrinder 在 Grinder 的基础上:实现多测试并行、基于web的管理、实现cluster、内置svn,方便的脚本编辑、管理,支持Groovy脚本,相对于Jython,可以启动更多的虚拟用户,实现对目标服务器的监控,插件系统扩展。

工作原理

由一个控制端controller和多个代理端agent组成,通过控制端(浏览器访问)建立测试场景,然后分发到代理端进行压力测试。用户按照一定规范编写测试脚本,controller会将脚本以及需要的资源分发到agent,用jython执行。在脚本执行的过程中收集运行情况、相应时间、测试目标服务器的运行情况等。并且保存这些数据生成测试报告,通过动态图和数据表的形式展示出来。用户可以方便的看到TPS、被测服务器的CPU和内存等情况。

测试工具对比

比较点

JMeter

Ngrinder

LoadRunner

实现语言

Java

java/python

java/VB/C/.NET

使用方式

C/S或Command

B/S

C/S

支持分布式

master/slave

controller/agent

master/slave

开源方式

免费,完全开源

免费,完全开源

收费

支持协议

多种协议

多种协议

多种协议

资源监控

monitor/plugin,如果二开,需要查找plugin的源码

monitor方式

自带资源监控功能

社区活跃度

文档完善

有中文社区

网上资料和相关培训很多,购买正版还可以得到技术支持

是否需要编码

基本不需要

需要,Jython/Groovy

需要

脚本的维护

本地

内置SVN,可以修改成git

本地

脚本录制

可使用BadBoy进行录制

可通过PTS插件进行录制

自带录制功能

可扩展性

可增加plugin,输出结果可以再加工,扩展性强

可增加plugin,扩展性强

通过扩展函数库实现

安装

简单,解压即可

简单,可以下载安装包或绿色包解压

安装包比较大,安装繁琐

平台化

有开源或云端的压测平台

本身具备

安装部署

ngrinder从3.1版本开始支持controller集群:由一个控制端controller和多个代理端agent组成,通过控制端(浏览器访问)建立测试场景,然后分发到代理端进行压力测试。用户按照一定规范编写测试脚本,controller会将脚本以及需要的资源分发到agent,用jython、groovy执行。在脚本执行的过程中收集运行情况、相应时间、测试目标服务器的运行情况等。并且保存这些数据生成测试报告,通过动态图和数据表的形式展示出来。用户可以方便的看到TPS、被测服务器的CPU和内存等情况。

JDK安装 

yum install java-1.8.0-openjdk* -y (可参考网络)

主节点安装:

https://github.com/naver/ngrinder/releases 登录官网下载release 包进行启动

下载完成后启动war包,可以tomcat启动也可以 java -jar 启动。

jar启动命令:java -XX:MaxPermSize=256m -jar ngrinder-controller-3.5.5-p1.war  &

登录页面,浏览器输入您部署ip:port 即可访问页面管理,默认用户名密码admin

部署配置agent节点:从web页面下下载对应的agent安装包,发送到服务器

解压tar -xvf ngrinder-agent-3.5.5-p1.tar

进入 ngrinder-agent 目录  运行run_agent.sh脚本

一切就绪后可以登录管理端查看节点是否连接成功。

如果管理端无法查找到对应的节点,修改配置文件路径见下图,指定ip和port(control端ip默认端口16001),再次启动节点。agent.all_logs=true #测试过程中节点会打印所有日志,管理页面可以进行查看默认是不打开的。

根据需求增加agent,测试过程中单台服务器最大网络带宽300M,在经过几轮调试后发现agent不能满足需求实时增加agent几点,步骤同上。

脚本编写

Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。

有TestNG,Junit经验人员上手会快些,在编写脚本过程中我们看到了@BeforeThread @BeforeProcess 等关键词agent执行测试时会分配多少个进程每个进程分配多少线程组进行测试。如下图,所有的测试均在线程内部循环进行测试。

参数化

Ngrinder参数化不同与jmeter参数化只要csv文件应用配置就可以,需要代码实现。如上图在接口测试过程中有多个agent、多个process、多个thread 执行过程中我们根据执行的号来进行计算获取不重复参数。

单接口场景

可使用页面直接生成。输入脚本名称,URL、请求头、请求方式等信息生成脚本。

脚本维护页面进行修改调试。

多接口场景

多接口场景涉及多个接口测试数据统计,脚本编写需要注意,生成脚本可以参考单接口生成,然后进行接口增加。首先增加Gtest有几个接口增加几个Gtest执行定义及接口httprequest定义。

对其进行实例化

Gtest每个接口详细实现如下:

测试执行

Ngrinder支持逐步增加虚拟用户数,所以在我们做负载测试时,可以设置逐步加压进行测试。

Basic Configuration 部分:Agent 表示选择测试节点数量,Vuser per agent 每个agent启动虚拟用户数=processes * Thread 数(即单节点数量可稍加调整)。Script 选择在脚本调试界面调试通过脚本进行测试。Script Resource 即脚本使用到的资源文件可以时参数化文件也可以是jar文件支持封装好的包进行调用,Duration 测试持续时间,Run Count 循环次数。

Ramp-Up 可以根据步长设置虚拟用户 ,进行阶梯式测试。

执行过程中可以看到多个接口瞬间数据如图:

测试报告

单接口测试报告可以直接读取如图所示,虚拟用户数、TPS、Peak TPS 、Mean Test Time 平均响应时间、Executed Tests 执行用例数可以换算成总请求数、Errors、Run Time 等。

Ngrinder多接口测试报告,显示与单接口统计属于一样,它前端显示是所有接口的数据TPS是接口总和、AVG平均,如果需要获取单个接口数据可以下载csv文件进行统计。

测试总结

ngrinder在脚本编写、调试方面没有jmeter 便捷,如果脚本修改量小场景不复杂可以使用NG进行测试,测试报告方面NGrinder默认最终报告只有一个汇总,多接口测试需要进行人为数据操作,当然后期可以进行二次开发优化报告显示。

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
记一次Ngrinder性能测试实践
最近收到测试需求需要从公网对服务进行测试,当然场景、接口前期需求均已经梳理结束。部署时发现jmeter无法拉起分布式集群(云服务器分布多个地域多厂商包括阿里云、...
<<上一篇
下一篇>>