什么是 Grinder ?
Grinder 是一个 JavaTM 负载测试框架,支持分布式测试,且是开源的。
有关 grinder 的最新消息,下载以及其他情况可 以从以下网站获取: SourceForge.net .
The Grinder processes
Grinder 是一个将测试脚本运行在多个机器 上的框架。 Grinder 框架由三个 process( 或 program )组成 : worker processes , agent processes , 和 console . 每种 process 的职责如下:
- Worker processes
- 解释 Jython 测试脚本,并启动 worker 线程进行测试
- Agent processes
- 管理 worker processes
- The console
- 协调其他的 processes
- 数据的收集,处理及显示
- 测试脚本的编辑及分发
Grinder 由 Java 编写,其中的每个 processes 都是一个 java 虚拟机( JVM )。
在进行负载测试时,应该在每个测试 机上启动一个代理线程。代理进程启动的所有 worker 进程都可以由同一个控制台进行控制 和监视。在每个测试机上都启动多个代理进程是非常没有必要的,但是如果你愿意也可以这样做。
Tests and test scripts 测试及测试脚本
在一个典型的测试场景中,测试脚本 会被执行很多遍。每个工作进程都包含若干个工作线程,每个工作线程都会调用测试脚本若干次。测试脚本的一次单独执行称作一个 run 。
测试脚本的获取有两种方式:
1. 手工编写 grinder 测试脚本 。参考: Script Gallery 。
2. TCP 代理录制测试脚本
Ø 启动代理命令: net.grinder.TCPProxy –console –http > grinder.py
Ø 设置 IE 代理:
在 IE 中打开设置窗口: Tools -> Internet Options -> Connections ->
Local Area Network Settings->advanced... 按上面控制台输出的信息填入代理。
Ø 打开要测试的网站或工程,对网站或工程的操作会被自动记录到当 前目录的 grinder.py 脚本中。
Network communication 网络通讯
Ø 每个 worker process 都会与 console 建立一个网络连接来报告统计数据。
Ø 每个 agent process 都与 console 建立一个连接来接收命令,然后传递给它的 worker process 。
Ø Console 通过一个特殊的地址和端口来监听这 两种连接。默认情况下,地址是运行 console 的机器的本地地址,端口是 6372 。
如果 agent process 连接 console 失败,或者 grinder.useConsole 属性被设置为 false , agent 将不需要 console 的控制而独立地运行,并自动启动 worker process 开始测试。 Worker process 运行至完成都不再向 console 报告。如果你不想受 console 的干扰而快速的开始测试,上面的方式是非常有用的。
Note
更改 console 地址的方法:设置 grinder.properties 文件中的 grinder.consoleHost 和 grinder.consolePort 。
输出
每个 worker process 都会写日志信息到文件 out-host-n.log 中,其中 host 是主机名, n 是 worker process 数量。
Error 信息在文件 error-host-n.log 中。如果没有 error 产生,将不会创建该文件。
测试结果在文件 data-host-n.log 中。该文件可以导入电子表格工具 中,例如 Microsoft ExcelTM ,以便进一步的分析。
最后的统计汇总数据( out-* 文件中)形式如下:
Final statistics for this process:
Successful Errors Mean Test Test Time Standard
Tests Time(ms) Deviation (ms)
Test 0 25 0 255.52 22.52
Test 1 25 0 213.40 25.15
Test 2 25 0 156.80 20.81 "Image"
Test 3 25 0 90.48 14.41
Test 4 25 0 228.68 23.97 "Login page"
Test 5 25 0 86.12 12.53 "Security check"
Test 6 25 0 216.20 8.89
Test 7 25 0 73.20 12.83
Test 8 25 0 141.92 18.36
Test 9 25 0 104.68 19.86 "Logout page"
Totals 250 0 156.70 23.32
测试过程中, Console 会动态显示简单的统计信息。另外, plug-in 和高级测试脚本可以提供额外的数 据统计,例如: HTTP plug-in 添加了对 response 消息体的内容长度统计。
每个测试有两种可能结果:
- Success.
- Error.
其中 Total , Mean , 以及 Standard Deviation 都是基于成功的测试进行计算的。
如何启动 Grinder 开始测试 ?
启动 Grinder 进行测试包括以下步骤:
- 创建 grinder.properties 文件 .
该文件指定一般的控制信息(例如: worker process 如何与 console 通信,使用的 worker process 数等),以及要执行的 Jython 测试脚本。
- 设置系统环境变量: CLASSPATH 包含 grinder.jar 文件, 该文件应该在 lib 文件夹下。
- 在其中一个测试机上启动 console :
java net.grinder.Console
- 对每一个测试机,执行步骤 1 和步骤 2 ,然后启动一个 agent process:
java net.grinder.Grinder
Ø agent 将会在本地文件夹中寻找 grinder.properties 文件。
Ø Jython 脚本通常存放在properties 文件同级目录下。
Ø 另外,可以通过参数的方式明确指定properties 文 件,例如:
java net.grinder.Grinder myproperties
Note
如果对 console 比较熟悉,可以通过 console 来编辑以及分发 properties 文件和测试脚本,这样就不必将他们分别拷贝到每个测试机上。
下面的一些脚本是在 Unix/Linux 下,用来启动 grinder agents, console 和 录制 HTTP 脚本的 TCPProxy 。
Windows
- setGrinderEnv.cmd:
· set GRINDERPATH=(full path to grinder install directory)
· set GRINDERPROPERTIES=(full path to grinder.properties) \grinder.properties
· set CLASSPATH=%GRINDERPATH%\lib\grinder.jar;%CLASSPATH%
· set JAVA_HOME=(full path to java install directory)
· PATH=%JAVA_HOME%\bin;%PATH%
- startAgent.cmd:
· call (path to setGrinderEnv.cmd) \setGrinderEnv.cmd
· echo %CLASSPATH%
· java -cp %CLASSPATH% net.grinder.Grinder %GRINDERPROPERTIES%
- startConsole.cmd:
· call (path to setGrinderEnv.cmd) \setGrinderEnv.cmd
· java -cp %CLASSPATH% net.grinder.Console
- startProxy.cmd:
· call (path to setGrinderEnv.cmd) \setGrinderEnv.cmd
· java -cp %CLASSPATH% net.grinder.TCPProxy -console -http > grinder.py
Unix
- setGrinderEnv.sh:
· #!/usr/bin/ksh
· GRINDERPATH=(full path to grinder install directory)
· GRINDERPROPERTIES=(full path to grinder.properties) /grinder.properties
· CLASSPATH=$GRINDERPATH/lib/grinder.jar:$CLASSPATH
· JAVA_HOME=(full path to java install directory)
· PATH=$JAVA_HOME/bin:$PATH
· export CLASSPATH PATH GRINDERPROPERTIES
- startAgent.sh:
· #!/usr/bin/ksh
· . (path to setGrinderEnv.sh) /setGrinderEnv.sh
· java -cp $CLASSPATH net.grinder.Grinder $GRINDERPROPERTIES
- startConsole.sh:
· #!/usr/bin/ksh
· . (path to setGrinderEnv.sh) /setGrinderEnv.sh
· java -cp $CLASSPATH net.grinder.Console
- startProxy.sh:
· #!/usr/bin/ksh
· . (path to setGrinderEnv.sh) /setGrinderEnv.sh
· java -cp $CLASSPATH net.grinder.TCPProxy -console -http > grinder.py