nGrinder性能测试工具入门
前言
nGrinder是一个用于在多台机器上运行用jython(在JVM上运行的python)编写的测试脚本的应用程序。它的内部引擎是基于Grinder。nGrinder分别用控制器和agent将Grinder的控制台和agent包装起来,并扩展了支持多个并发测试的特性.
本文对nGrinder做一个入门了解,掌握基本使用.
测试环境
准备自己搭建一套测试环境,这个架构和我们公司的服务架构基本相似.
架构: java + eureka + gateway + app
框架: springclound
eureka注册中心
把所以微服务注册到eureka中,方便后续的服务调度.
gateway网关
gateway是所有的服务的入口,通过路由转发到具体微服务上.
app是具体的应用
app是具体的一个微服务应用,具体业务中有会有N个微服务.
https://github.com/xinxi1990/backendSpring.git
nGrinder介绍
下面是nGrinder的两个介绍,可自行查阅.
https://github.com/naver/ngrinder
http://naver.github.io/ngrinder/
工具对比
因为平时自己都用jmeter去做压测,所以找了一张对比图.
架构图
脚本执行
下载controller
controller主要是负责展示页面、调度任务的.
https://github.com/naver/ngrinder/releases/tag/ngrinder-3.4.3-20190709
java -XX:MaxPermSize=200m -jar ngrinder-controller-3.4.war --port 999
下载monitor
monitor用来监控发压数据
启动monitor
sh run_monitor.sh
下载agent
agent用来发压
agent
sh run_agent.sh
nGrinder平台
nGrinder提供了一个web平台,可以创建任务,执行任务等.
访问:127.0.0.1:9999
账号/密码: admin/admin
任务列表
任务详情
脚本
脚本支持groovy和jpython两种语言,个人感觉groovy要好一点
groovy
import HTTPClient.Cookie
import HTTPClient.CookieModule
import HTTPClient.HTTPResponse
import HTTPClient.NVPair
import net.grinder.plugin.http.HTTPPluginControl
import net.grinder.plugin.http.HTTPRequest
import net.grinder.script.GTest
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import static net.grinder.script.Grinder.grinder
import static org.hamcrest.Matchers.is
import static org.junit.Assert.assertThat
@RunWith(GrinderRunner)
class TestRunner {
public static GTest test
public static HTTPRequest request
public static NVPair[] headers = []
public static NVPair[] params = []
public static Cookie[] cookies = []
@BeforeProcess
public static void beforeProcess() {
HTTPPluginControl.getConnectionDefaults().timeout = 6000
test = new GTest(1, "www.baidu.com")
request = new HTTPRequest()
// 设置请求头数据
List<NVPair> headerList = new ArrayList<NVPair>()
headerList.add(new NVPair("test_header", "test_header_value"))
headers = headerList.toArray()
// 设置请求参数
List<NVPair> paramList = new ArrayList<NVPair>()
paramList.add(new NVPair("paramname", "vaule"))
params = paramList.toArray()
// 设置 cookie 信息
List<Cookie> cookieList = new ArrayList<Cookie>()
cookieList.add(new Cookie("username", "testname", "www.baidu.com", "/", new Date(), false))
cookies = cookieList.toArray()
// 记录日志
grinder.logger.info("before process.")
}
@BeforeThread
public void beforeThread() {
test.record(this, "test")
// 配置延迟报告统计结果
grinder.statistics.delayReports = true
// 记录日志
grinder.logger.info("before thread.")
}
@Before
public void before() {
// 设置本次请求头
request.setHeaders(headers)
// 设置本次请求的 cookies
cookies.each { CookieModule.addCookie(it, HTTPPluginControl.getThreadHTTPClientContext()) }
// 记录日志
grinder.logger.info("before thread. init headers and cookies")
}
@Test
public void test() {
HTTPResponse result = request.GET("http://www.baidu.com", params)
if (result.statusCode == 301 || result.statusCode == 302) {
grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", result.statusCode)
} else {
assertThat(result.statusCode, is(200))
}
}
}
报告
在报告中可以看到tps、曲线图等数据.
svn
idea开发脚本
脚本如下,这个脚本是fork了一个韩国那边同学的脚本改量的.
脚本中使用junit框架,导入了grinder依赖,脚本开发难度一般.
https://github.com/xinxi1990/nGrinderScript.git
结语
nGrinder和jmeter在使用上有很大差别,nGrinder的脚本适用有脚本开发经验的.jmter支持多协议、入手比较容易.
参考
nGrinder 简易使用教程
https://www.cnblogs.com/jwentest/p/7136727.html
nGrinder - Groovy 脚本指南
https://testerhome.com/topics/12173
性能测试工具-Ngrinder使用-添加一个简单脚本(groovy)
https://www.cnblogs.com/xiaowei89426/p/9356694.html
https://moyadu.oschina.io/diligentpractice/books/chapter-Grinder/nGrinderdevelop/