本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。
nGrinder 小众而实用
nGrinder 在 GitHub 的 star 有 1.6k,相比于 JMeter6.4k 来说,要少很多。在测试资料中,关于压测工具也是以 JMeter 居多,几乎没有专门针对 nGrinder 的学习资料。nGrinder 既然这么小众,那为什么还要学它呢?因为听说咱们公司的压测平台,底层就是用的 nGrinder,对于企业级应用来说,nGrinder 还是很实用的,正如它的介绍:“Enterprise level performance testing solution based on The Grinder”。
nGrinder 有以下特点:

我们编写压测脚本用到的就是第一个特点提到的 Groovy 脚本,跟 Java 语法类似,可以无成本切换。
设计理念

nGrinder 架构
nGrinder 系统架构如下:

nGrinder 的底层是 Grinder,基于 Grinder 的 console 和 agent,nGrinder 封装成了 controller 和 agent:
-
controller 提供了 Web 页面创建测试脚本和配置运行策略,这是 nGrinder 比较突出的特色了。
-
agent 虚拟用户生成器,创建压测负载。
当用户创建 test 后,会先创建一个 console,AgentControllerServer 会根据 console 分配相应的 agent,AgentControllerServer 管理着 agent pool,负责 agent 的创建和释放。然后 console 将 test 脚本和资源多个已分配的 agent,并控制整个 test flow 直到测试结束。测试结束后,agent 会回收至 AgentControllerServer 以便其他 test 使用,console 也会回收至 ConsoleManager。
nGrinder 和 Ginder 最大的不同之处在于,nGrinder 在 controller 中保留了多个 console 实例和 agent。每个 console 都是跟其他 console 隔离的,能并发运行。
不像其他压测工具在测试时,会保留 agent 以确保用户执行 test 时 agent 是可用的,也就是“预占”agent。nGrinder 只有在真正测试执行时,动态分配 agent,这个方案是 nGrinder 最独特的架构设计。它保证了多个压测任务能并发执行,并发上限只取决于空闲的 agent 数量。
nGrinder3.1 版本以前是单机架构的,如下图所示:

1、nGrinder 使用 SVNkit,即 svn server,来管理脚本文件。svn 仓库存放在${NGRINDER_HOME}目录。
2、nGrinder 使用 EhCache 缓存,提升 DB 和 SVN 查询性能。
3、nGrinder 使用 Spring Security 保证安全,并使用 Atlassian 支持扩展。
nGrinder3.1 版本之后,支持集群:

1、集群中所有 console 共享同样的 DB 和文件系统,并指向 NFS 共享的同一个${NGRINDER_HOME}。
2、每个 controller 有它自己的${NGRINDER_EX_HOME},存放特殊配置和日志。
3、所有 controller 相互复制 EhCache,让某些数据在集群中都是可见的。
nGrinder 技术栈
Client 层
Bootstrap、Bootstrap-slider、Jquery、Jquery Validate、Datatables、Select2、JqPlot、CodeMirror。
Controller 层
FreeMarker、Spring Security、Spring MVC、GSon、SVNKit Dav。
Service 层
The Grinder、Atlassian Plugin Framework、Spring、EhCache。
Data 层
Spring Data、H2、Cubrid、Liquibase、SVNKit。
快速入门
安装
在 GitHub Release 下载 war 包:
https://github.com/naver/ngrinder/releases

执行命令:
java -jar ngrinder-controller-{version}.war
访问http://localhost:8080/即可。
但是由于 nGrinder 需要占用大量内存,最好加上额外参数:
java -XX:MaxPermSize=200m -jar ngrinder-controller-3.4.war
默认是 8080 端口,可以指定端口:
java -XX:MaxPermSize=200m -jar ngrinder-controller-3.4.war --port 80
更多安装说明请参考:
https://github.com/naver/ngrinder/wiki/Installation-Guide
登录

默认用户名/密码为 admin/admin。
开始

只需要输入 url,就能自动生成压测脚本。
然后配置压测策略:

Agent:需要多少个 agent,也就是需要多少台机器。nGrinder 默认一台机器一个 agent。
Vuser per agent:每个 agent 创建多少个 Vuser。Vuser 相当于线程。
Duration:持续压多少时间后停止。
Run Count:运行多少次后停止。
点击REV:HEAD后,能切换到脚本视图:

填写好策略后,保存,设置“马上运行”还是“定时运行”:

确认后在列表能看到压测任务:

将鼠标悬浮在 Status 上能看到运行状态的明细:

运行开始后会有一段启动时间,因为每个 test 都需要从 console 分发测试脚本和资源到 agent 上:

运行结束后,能看到 TPS 走势图:

点击Report in Detail按钮,能查看明细报告:

包括 TPS、Mean Test Time、Errors。如果在 agent 上安装了 monitor,点击左下角的Perfomance Report能看到更详细的压测报告。
更多关于 nGrinder 的内容请查阅官方手册和 Wiki:
https://github.com/naver/ngrinder/wiki/User-Guide

nGrinder 有三大优势,一是 Web 界面化操作;二是多压测任务并行;三是天然支持集群发压。值得大家学习使用。
参考资料:
nGrinder 官网 https://naver.github.io/ngrinder/
nGrinder 架构 https://github.com/naver/ngrinder/wiki/Architecture
nGrinder 安装 https://github.com/naver/ngrinder/wiki/Installation-Guide
nGrinder 入门 https://github.com/naver/ngrinder/wiki/Quick-Start
nGrinder 手册 https://github.com/naver/ngrinder/wiki/User-Guide