压力测试工具Grinder

 

来源:互联网

Grinder是一个开源的Java负载测试框架,它通过很多负载注射器来为分布式测试提供了便利。

● 支持用于执行测试脚本的Jython脚本引擎。

HTTP测试可通过HTTP代理进行管理。

该项目主页:

http://grinder.sourceforge.net/

详细资料,软件下载,请浏览上面的主页

工具的使用:

第一步:设置环境变量

下载Grinder,并解压. Download page: http://grinder.sourceforge.net/download.html

设置系统环境变量:

GRINDERPATH=grinder的完整路径

CLASSPATH=%GRINDERPATH%\lib\grinder.jar

(在grinder的目录下新建一个目录叫properties并在该目录下新建文件grinder.propertiesGRINDERPROPERTIES=%GRINDERPATH%\properties\grinder.properties

有关配置文件请参考:http://grinder.sourceforge.net/g3/properties.html

第二步:如何启动ConsoleAgent process

设置好环境变量后就可以启动grinder了,grinder分为三个部分,分别是控制台(console)、代理进程(agent processes)和HTTP代理(HTTPProxy

启动的命令分别为:

Consolejava -cp %CLASSPATH% net.grinder.ConsoleAgent processjava -cp %CLASSPATH% net.grinder.Grinder %GRINDERPROPERTIES%

控制台不会去读grinder.properties配置文件,它有自己的设置会话窗口,你可用它设置会话地址和端口。控制台可以触发测试脚本,然后代理进程会产生工人线程进行测试。

Agent process启动后会自动连接控制台,相当于客户机连接服务器,所有的代理 进程由控制台统一控制,所以控制台只能启动一个,但代理进程可以启动多个并位于不同的机器上。控制台可以指定所有代理进程使用的测试脚本,如果控制台没有 指定代理进程要使用的测试脚本,代理进程会去读取自己本地的 grinder.properties配置文件中指定的脚本执行测试。

有关测试脚本的编写请参考:http://grinder.sourceforge.net/g3/tutorial-perks.html

第三步:使用TCP代理生成测试脚本:

如果你想创建一个用于网站或WEB工程的测试脚本,可以使用TCP代理。GrinderTCP代理简单的说就是截获用户在浏览器的操作,然后将其记录成脚本供测试使用。

启动代理的命令如下:

java -cp %CLASSPATH% net.grinder.TCPProxy -console -http > grinder.py

-console参数会显示一个简单的控制窗口,用于使TCP代理可以干净的关闭。这是必要的,要为一些终端的shell不允许JAVA进程干净的中断。

这条命令会启动GrinderHTTP代理并在当前目录生成脚本文件,文件名为grinder.py

启动后控制台会输出如下信息:

07-4-2 11:33:36 (tcpproxy): Initialising as an HTTP/HTTPS proxy with theparameters:

Request filters: HTTPRequestFilter

Response filters: HTTPResponseFilter

Local address: localhost:8001

07-4-2 11:33:37 (tcpproxy): Engine initialised, listening on port 8001

我们可以看到,其默认端口为8001,接下来我们设置浏览器的代理:

IE中打开设置窗口:Tools -> Internet Options -> Connections -> Local Area Network Settings->advanced... 按上面控制台输出的信息填入代理。(IE7可能操作步骤略有不同)

设置好之后清除IE的缓存,并将缓存大小设为最小,且选中每次都重新读取页面。

然后打开你要测试的网站或工程,你的操作会被自动记录到当前目录的grinder.py脚本中。

第四步:开始测试

一旦你记录了测试脚本,你有二种方法执行:

1、 你可以在每个Agent process的本地grinder.properties文件中用grinder.script参数指定要执行的脚本。例:

grinder.script. = grinder.py

2、 你可以在控制台分发你的脚本到每个Agent process, 然后运行。每个Agent process仍然需要其本机上的简单grinder.properties文件,只是不用指定grinder.script参数了。

选择要分发到客户端的脚本 > 分发脚本 > 测试执行中 >结果

如果有需要,你可以手工更改生成的脚本文件。

@@@@@@@@@@@@@@@@@@@@@@@

 

The Grinder试用记录一-脚本录制
The Grinder
是开源性能测试工具,用Java编写,其脚本语言用Jython编写,脚本编辑的界面不友好,但是脚本编写比较灵活,可以支持参数化和关联操作。跟openSTA一样,其脚本录制功能也可以录制dwr请求。支持分布式负载,测试过程中没有提供对服务器的监控方式。可以运行在windowliunx环境。脚本采用Jython,所以需要测试员有Jython经验,上手比较难。
http://grinder.sourceforge.net 网站下载The Grinder 3,解压后放到C盘下面,文件夹改名为grinder。该文件夹下面可以看到contribetcexamplelib文件夹,新建一个bin文件夹,用于存放生成的cmd可执行文件。
The Grinder
的脚本采用专用工具TCPProxy录制。具体步骤如下:
1
、编写一个setGrinderEnv.cmd文件,放在bin文件夹下面,用于设置环境变量,内容如下:
set GRINDERPATH=C:\grinder
set GRINDERPROPERTIES=C:\grinder\etc\grinder.properties
2
、编写一个startProxy.cmd文件,放在bin文件夹下面,用于启动TCPProxy,内容如下:
call C:\grinder\bin\setGrinderEnv.cmd
java net.grinder.TCPProxy -console -http > %GRINDERPATH%\grinder.py
pause
功能是录制http请求,把录制得到的脚本存储在grinder.py文件中。
3
、双击startProxy.cmd文件后,录制启动,出现一个java程序窗口 TCPProxy Console。在这个窗口,你可以控制停止录制,也可以随时给脚本加评论。打开浏览器,设置代理服务器的地址为127.0.0.1,端口8001,然后 地址栏输入被测试服务的url,进行录制,录制过程中,可以随时用“Insert comment”按钮在脚本中插入评论。录制完成后,点击窗口中的“Stop”按钮,录制停止。
4
、录制停止后,进入C:\grinder,找到文件 grinder.py,该文件就是录制得到的测试脚本。
The Grinder
试用记录二-分布式测试
The Grinder
的分布式测试操作很简单,步骤如下:
1
、客户端(192.168.0.101)建立一个C:\grinder\etc\grinder.properties配置文件,该文件是一个配置文 件,指定运行的测试脚本,运行的进程,线程数,循环次数,并指定分布式测试的控制服务器地址和端口(默认为6372,端口值可以通过 文件-选项 修改)。例如:
grinder.processes=2
grinder.threads=3
grinder.runs=4
grinder.logDirectory=log
grinder.numberOfOldLogs=2
grinder.consoleHost=192.168.0.100
grinder.consolePort=6372
grinder.useConsole=true
grinder.script=grinder.py
2
、控制端(192.168.0.100)建立一个startConsole.cmd文件并启动,启动后会出现一个“The Grinder控制台”窗口。文件内容如下:
call C:\grinder\bin\setGrinderEnv.cmd
java net.grinder.Console
pause
3
、客户端(192.168.0.101)建立一个startAgent.cmd文件并启动,文件内容如下:
call C:\grinder\bin\setGrinderEnv.cmd
java net.grinder.Grinder %GRINDERPROPERTIES%
pause
把测试脚本 grinder.py拷贝到和startAgent.cmd同一个文件夹下面。
4
、客户端启动后,会根据grinder.properties文件的配置连接控制端,连接上以后,控制端的 动作-启动进程 选项变成可选,点击该选项,客户端的测试进程启动,开始测试。测试过程中,控制端能看到各个测试项运行的状态。
5
、测试结束后,查看bin文件夹下面的log文件夹,可以看到各个测试进程,各个测试项的统计指标。
如果不想用分布式测试,把控制端和客户端都放到一个机器下运行就可以。
字号: 大  中  小
The Grinder
试用记录三-脚本编辑
如果懂Jython语法,那么操作脚本(包括参数化和关联)是非常简单的事情,下面这个脚本向blog.163.com发送一个dwr请求,并把response内容保存到文件。
from net.grinder.script import Test
from net.grinder.script.Grinder import grinder
from net.grinder.plugin.http import HTTPPluginControl, HTTPRequest
from HTTPClient import NVPair
connectionDefaults = HTTPPluginControl.getConnectionDefaults()
httpUtilities = HTTPPluginControl.getHTTPUtilities()
# To use a proxy server, uncomment the next line and set the host and port.
# connectionDefaults.setProxyServer("localhost", 8001)
# These definitions at the top level of the file are evaluated once,
# when the worker process is started.
connectionDefaults.defaultHeaders = \
( NVPair('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)'), )
headers3= \
( NVPair('Accept', '*/*'),
NVPair('Referer', 'http://blog.163.com/'),
NVPair('Accept-Language', 'zh-c'), )
url7 = 'http://blog.163.com:80'
# Create an HTTPRequest for each request, then replace the
# reference to the HTTPRequest with an instrumented version.
# You can access the unadorned instance using request101.__target__.
request1001 = HTTPRequest(url=url7, headers=headers3)
request1001 = Test(1001, 'POST UserBean.getProvinceAndCity.dwr').wrap(request1001)
class TestRunner:
"""A TestRunner instance is created for each worker thread."""
def page10(self):
"""POST UserBean.getProvinceAndCity.dwr (request 1001)."""
result = request1001.POST('/dwr/call/plaincall/UserBean.getProvinceAndCity.dwr',
'''callCount=1\n\
page=/\n\
httpSessionId=\n\
scriptSessionId=4FC528EBDD341FE22046F074D587F3733\n\
c0-scriptName=UserBean\n\
c0-methodName=getProvinceAndCity\n\
c0-id=0\n\
c0-param0=boolean:false\n\
c0-param1=boolean:false\n\
batchId=0\n\
''',       ( NVPair('Content-Type', 'text/plain'), ))
return result
def __call__(self):
"""This method is called for every run performed by the worker thread."""
result1=self.page10()     # POST UserBean.getProvinceAndCity.dwr (request 1001)
writeToFile(result1.getText())
def writeToFile(text):
filename = grinder.getFilenameFactory().createFilename(
"page", "-%d.html" % grinder.runNumber)
file = open(filename, "w")
print >> file, text
file.close()
参考资料:
1
、官方介绍资料:http://grinder.sourceforge.net/g3/scripts.html
2
Script API http://grinder.sourceforge.net/g3/script-javadoc/index.html
3
、官方例子:http://grinder.sourceforge.net/g3/script-gallery.html
4
Jython学习资料:https://www6.software.ibm.com/developerworks/cn/education/java/j-jython2/tutorial/
* grinder.properties
参数设置详解 http://grinder.sourceforge.net/g3/properties.html
*****
小整理
.脚本录制
1.
设置代理HTTPSSL选择localhost 端口8001
2.
脚本录制java net.grinder.TCPProxy -console -http>xx.py
3.
执行USECASE 点击STOP完成脚本录制
.执行脚本
1.
打开CONSOLEjava net.grinder.console
2.CMD
到脚本目录,java net.grinder.Grinder
grinder.properties
grinder.processes=50//
进程数
grinder.threads=1//
线程数
grinder.runs=6000//
循环执行的次数
grinder.useConsole=true
grinder.logDirectory=log
grinder.numberOfOldLogs=1
#grinder.consoleHost=10.0.0.66 //CONSOLE
66
#grinder.consolePort=6372
//
30秒增加2个进程
grinder.processIncrement=2
grinder.processIncrementInterval=30000
grinder.initialProcesses=6//
起初运行的进程数
grinder.duration=600000//
脚本执行10分钟
grinder.reportTimesToConsole=false
#grinder.initialSleepTime=500
#grinder.sleepTimeFactor=0.01
#grinder.sleepTimeVariation=0.005
grinder.jvm.arguments=-mx512m
#grinder.script=dmryrz.py
#grinder.script=pingzhengdaochu.py
#grinder.script=xinzidaochu.py
grinder.script=jiaoyi3.py
.根据生成的LOG文件分析系统
1.
条件
需要工具grinderAnalyzer(下载地址),jython_installer-2.2.1.jar 可以到相应网站下载
2.
grinder生成的data.log文件放到E:\grinderAnalyzer.V2.b9目录下,同时选择一其中一个out.log文件(out.log只需要一个且不限定哪个,只要是同个测试的log
3.CMD
E:\grinderAnalyzer.V2.b9目录 执行命令jython analyzer.py E:\grinderAnalyzer.V2.b9\data_0.log E:\grinderAnalyzer.V2.b9\data_1.log E:\grinderAnalyzer.V2.b9\data_2.log E:\grinderAnalyzer.V2.b9\out_0.log 1 其中1代表agent的数量
4.
grinderReport下有生成的结果repot.html

发表评论