来源:互联网
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.properties) GRINDERPROPERTIES=%GRINDERPATH%\properties\grinder.properties
有关配置文件请参考:http://grinder.sourceforge.net/g3/properties.html
第二步:如何启动Console和Agent process
设置好环境变量后就可以启动grinder了,grinder分为三个部分,分别是控制台(console)、代理进程(agent processes)和HTTP代理(HTTPProxy)
启动的命令分别为:
Console:java -cp %CLASSPATH% net.grinder.ConsoleAgent process:java -cp %CLASSPATH% net.grinder.Grinder %GRINDERPROPERTIES% |
控制台不会去读grinder.properties配置文件,它有自己的设置会话窗口,你可用它设置会话地址和端口。控制台可以触发测试脚本,然后代理进程会产生工人线程进行测试。
Agent process启动后会自动连接控制台,相当于客户机连接服务器,所有的代理 进程由控制台统一控制,所以控制台只能启动一个,但代理进程可以启动多个并位于不同的机器上。控制台可以指定所有代理进程使用的测试脚本,如果控制台没有 指定代理进程要使用的测试脚本,代理进程会去读取自己本地的 grinder.properties配置文件中指定的脚本执行测试。
有关测试脚本的编写请参考:http://grinder.sourceforge.net/g3/tutorial-perks.html
第三步:使用TCP代理生成测试脚本:
如果你想创建一个用于网站或WEB工程的测试脚本,可以使用TCP代理。Grinder的TCP代理简单的说就是截获用户在浏览器的操作,然后将其记录成脚本供测试使用。
启动代理的命令如下:
java -cp %CLASSPATH% net.grinder.TCPProxy -console -http > grinder.py |
-console参数会显示一个简单的控制窗口,用于使TCP代理可以干净的关闭。这是必要的,要为一些终端的shell不允许JAVA进程干净的中断。
这条命令会启动Grinder的HTTP代理并在当前目录生成脚本文件,文件名为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请求。支持分布式负载,测试过程中没有提供对服务器的监控方式。可以运行在window和liunx环境。脚本采用Jython,所以需要测试员有Jython经验,上手比较难。
从http://grinder.sourceforge.net 网站下载The Grinder 3,解压后放到C盘下面,文件夹改名为grinder。该文件夹下面可以看到contrib,etc,example,lib文件夹,新建一个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.设置代理HTTP和SSL选择localhost 端口8001
2.脚本录制java net.grinder.TCPProxy -console -http>xx.py
3.执行USECASE 点击STOP完成脚本录制
二.执行脚本
1.打开CONSOLE,java 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