1. 简介
Apache JMeter是100%纯java桌面应用程序,被设计用来测试客户端/服务器结构的软件(例如web应用程序)。它可以用来测试包括基于静态和动态资源程序的性能,例如静态文件,Java Servlets,Java 对象,数据库,FTP 服务器等等。JMeter可以用来在一个服务器、网络或者对象上模拟重负载来测试它的强度或者分析在不同的负载类型下的全面性能。
另外,JMeter能够通过让你们用断言创建测试脚本来验证我们的应用程序是否返回了我们期望的结果,从而帮助我们回归测试我们的程序。为了最大的灵活性,JMeter允许我们使用正则表达式创建断言。
1.1 历史
Apache软件组织的Stefano Mazzocchi是JMeter的创始人。他编写它起初是为了测试Apache JServ的性能(一个已经被Apache Tomcat工程所替代的工程)。我们重新设计JMeter来增强用户界面并增加功能测试的能力。
1.2 未来
我们希望看到作为开发者利用它的可插入架构使JMeter的功能快速扩展。未来发展的主要目标是在没有影响JMeter的负载测试能力的情况下尽可能使JMeter成为最实用的回归测试工具。
2. 入门
开始使用JMeter最容易的方法是首先下载最新版并且安装它。这个版本包含所有你在构建和运行Web,FTP,JDBC,和JNDI等测试时使用需要的所有文件。
如果你想执行JDBC测试,你当然需要从供应商得到适当的JDBC驱动。JMeter没有提供任何JDBC驱动。
你可能需要下载的其它软件:
- BeanShell - BeanShell函数和测试元件需要
- Java Activation Framework - JavaMail需要
- Java Mail - Mail可视化,Mail Reader 和 WebService(SOAP)取样器需要
- JMS - JMS 取样器需要
- General Java download page
详细参见JMeter Classpath 一章安装附加的jar包 |
- 下一步, 开始使用JMeter并且参见用户手册创建一个测试计划一章使自己更加熟悉JMeter基础 (例如,添加和删除元件)。
最后, 参见如何构建一个明确类型的测试用例的适合章节。例如,如果你对Web应用测试感兴趣,那就参见创建一个Web测试计划。其他具体的测试计划章节是:
一旦你熟练创建和执行JMeter测试计划, 通过你的测试计划你会观察到给你更多帮助的各种元件的配置(定时器, 监听器, 断言, 和其他)。
2.1 需求
JMeter 需要最小需求的运行环境。
2.1.1 Java 版本
JMeter需要一个完全适当的JVM1.4或者更高 |
因为JMeter 仅使用Java标准API, 请不要把因为JRE实现版本而无法运行JMeter的bug报告提交。
2.1.2 操作系统
JMeter是100%纯Java应用程序并且能够正确的在任何有适当的Java实现的操作系统上运行。
JMeter 在下列环境已经被测试:
- Unix (Solaris, Linux, 等)
- Windows (98, NT, 2000, xp)
- OpenVMS Alpha 7.3+
2.2 可选
如果你计划做JMeter开发或者想使用SUN的java标准扩展包,你将需要下列更多的可选包。
2.2.1 Java 编译器
如果你想编译JMeter源代码或者开发JMeter插件,你将需要一个完整的适当的JDK1.4或者更高。
2.2.2 SAX XML解析器
JMeter 使用 Apache的 Xerces XML解析器,你可以选择告诉JMeter使用一个不同的XML 解析器。 这样做,把第三方的解析器的类包包含在JMeter的classpath中, 并更新 jmeter.properties 文件里的解析器实现的全类名。
2.2.3 Email 支持
JMeter有有限的 Email 能力。 它能够发送基于测试结果的Email,并且支持POP/IMAP 取样器。它现在不支持 SMTP 取样。 为了能够支持 Email, 需要添加Sun 的JavaMail包和activation包到JMeter classpath 。
2.2.4 SSL 加密
为了测试一个使用SSL加密(HPPS)的web服务器, JMeter 需要一个提供SSL实现 (例如 Sun的 Java Secure Sockets Extension - JSSE)。包含需要的加密包到JMeter的classpath。 同样,通过注册SSL提供者更新system.properties文件。
JMeter默认协议等级TLS(传输层安全性)。这可以通过修改在jmeter.proerties或者user.properties文件中的"https.default.protocol"来改变。
JMeter被配置接受所有的证书,不管是否信赖和合法时间等。这允许在测试服务器最大灵活性。
如果服务器需要一个客户端证书,这是可以提供的。
为了更好的管理证书,也要有一个SSL 管理器 。
JMeter 代理服务器(见下)不支持记录SSL(https)。 |
2.2.5 JDBC 驱动
如果你需要JDBC测试,需要添加厂商的JDBC驱动到classpath。确认文件是一个jar文件,而不是zip。
2.2.6 Apache SOAP
Apache SOAP 需要 mail.jar 和 activation.jar. 你需要下载并拷贝这两个jar文件到你jmeter/lib 目录.一旦文件放到那里,JMeter 会自动找到它们。
2.2.7 BeanShell
为了运行BeanShell函数或者任何BeanShell测试元件(取样器,定时器等),你需要从http://www.beanshell.org/下载beanshell的jar文件并拷贝jar文件到jmeter/lib目录,JMeter会自动找到它。
2.2.8 ActiveMQ 3.0类库
详细参见 http://activemq.apache.org/initial-configuration.html
详细参见JMeter Classpath 一章安装附加的jar包 |
2.3 安装
避免在一个有空格的路径安装 JMeter。这将导致远程测试出现问题。 |
我们推荐大多数用户运行最新版本。
要安装一个构建版本,简单解压zip/tar文件到你想安装JMeter的目录。保证一个JRE/JDK正确的安装并且设置环境变量JAVA_HOME,其它不需要做什么了。
安装目录接口应该看到的像这样一些东西(2.3.1版本):
jakarta-jmeter-2.3.1
jakarta-jmeter-2.3.1/bin
jakarta-jmeter-2.3.1/docs
jakarta-jmeter-2.3.1/extras
jakarta-jmeter-2.3.1/lib/
jakarta-jmeter-2.3.1/lib/ext
jakarta-jmeter-2.3.1/lib/junit
jakarta-jmeter-2.3.1/printable_docs
如果你想的话你可以重命名父目录(例如 jakarta-jmeter-2.3.1) ,但是不要改变任何子目录命。父目录路径中不能包含任何空格;如果包含,你运行客户端-服务器模式会有问题。
2.4 运行 JMeter
要运行JMeter, 运行 jmeter.bat (for Windows) 或者 jmeter (for Unix) 文件。那些文件在bin目录下。稍微暂停后,JMeter GUI会显示出来。
在bin目录你会发现有些附加脚本很有用。Windows脚本文件(CMD文件需要Win2K或者更新):
- jmeter.bat - 运行JMeter(默认在GUI模式)
- jmeter-n.cmd - 使用一个JMX文件运行非GUI测试
- jmeter-n-r.cmd - 使用一个JMX文件远程运行一个非GUI测试
- jmeter-t.cmd - 在GUI模式使用一个JMX文件
- jmeter-server.bat - 以服务器模式启动JMeter
注意: LAST可以在jmeter-n.cmd, jmeter-t.cmd 和 jmeter-n-r.cmd中使用,意味着最后一次测试会运行.
Unix脚本文件; 可以运行在大多 Linux/Unix 系统.
- jmeter - 运行JMeter(默认在GUI模式)
- jmeter-server - 以服务器模式启动JMeter
2.4.1 JMeter Classpath
JMeter 自动从下列目录中的jar文件发现类。
- JMETER_HOME/lib - 用来放使用的jar文件
- JMETER_HOME/lib/ext - 用来放JMeter组件和扩展
如果你开发新的JMeter组件,你可以压缩它们成jar包并拷贝到JMeter的/lib/ext目录。JMeter将会自动发现在这里的任何jar文件中的JMeter组件。
支持的jar文件(类库)应该放在lib目录.
如果你不想把扩展jar包放到lib/ext目录,可以在jmeter.properties中定义search_paths属性。不要使用lib/ext给那些公用的jar包;它仅仅是存放JMeter组件。
其他jar包 (例如 JDBC, 和任何JMeter代码需要支持的类库)应该被代替放在lib目录 - 而不是lib/ext目录。
注意 |
你可以在$JAVA_HOME/jre/lib/ext安装有用的jar文件,或者(自从 2.1.1版本)你可以在jmeter.properties中设置user.classpath属性。
注意设置CLASSPATH 环境变量将不起作用。这是因为JMeter 使用"java --jar"启动,并且java命令无记录忽略CLASSPATH 变量,并且当使用-jar选项时-classpath/-cp 选项也被使用。[所有的java程序都是这样,不仅仅是JMeter。]
2.4.2 使用代理服务器
如果你从防火墙/代理服务器后测试,你需要提供给JMeter防火墙/代理服务器的主机名和端口号。这样做,从命令行使用以下参数运行jmeter.bat/jmeter文件:
-H [代理服务器主机名或者ip地址]
-P [代理服务器端口]
-N [非代理主机] (例如: *.apache.org|localhost)
-u [代理证书用户名- 如果需要]
-a [代理证书密码 - 如果需要]
例如 : jmeter -H my.proxy.server -P 8000 -u username -a password -N localhost
或者, 你使用 --proxyHost, --proxyPort, --username, and --password
JMeter也有自己的内建HTTP代理服务器,来记录HTTP(不是 HTTPS)浏览器会话。这是和上面的代理设置描述不混淆的,它是在JMeter发出HTTP或者HTTPS请求时使用的。 |
2.4.3 非用户界面模式 (命令行模式)
为了不相互影响测试, 你可以选择运行没有用户界面的JMeter。这样做,使用下列命令选项:
-n 这是指定JMeter在非用户界面模式运行
-t [包含测试计划的JMX文件的名字]
-l [记录取样结果的JTL文件的名字]
-r 运行在jmeter.properties文件里所有的远程服务器 (或者通过在命令行覆盖属性指定远程服务器)
这个脚本也允许我们指定可选的防火墙/代理服务器信息:
-H [代理服务器主机名或者ip地址]
-P [代理服务器端口]
例如 : jmeter -n -t my_test.jmx -l log.jtl -H my.proxy.server -P 8000
2.4.4 服务器模式
为了分布测试 ,在服务器模式运行JMeter,并且通过用户界面控制每一台服务器。
jmeter-server/jmeter-server.bat 脚本使用适当的classpath为你开始远程注册。如果失败,参见关于JMeter服务器启动细节。 |
运行jmeter-server/jmeter-server.bat,加上下列选项命令:
这个脚本也允许我们指定可选的防火墙/代理服务器信息:
-H [代理服务器主机名或者ip地址]
-P [代理服务器端口]
例如 : jmeter-server -H my.proxy.server -P 8000
2.4.5 通过命令行覆盖属性
Java系统属性,JMeter属性,和日志属性可以通过命令行直接覆盖(代替更改jmeter.properties文件)。这样做,使用下列选项:
-D[prop_name]=[value] - 定义一个java系统属性值。
-J[prop name]=[value] - 覆盖一个JMeter属性。
-L[category]=[priority] - 覆盖一个日志设置,设置一个特殊目录为给定的优先级。
-L 标志也可以使用没有目录名来设置根目录日志等级。
例如 :
jmeter -Duser.dir=/home/mstover/jmeter_stuff \
-Jremote_hosts=127.0.0.1 -Ljmeter.engine=DEBUG
jmeter -LDEBUG
注意 |
2.4.6 日志和错误信息
如果JMeter发现一个错误, 一个消息将被写入日志文件。日志文件名在jmeter.properties文件中定义。一般定义为 jmeter.log 。并且在JMeter启动目录,例如bin。
当在Windows下运行时,如果你不设置Windows显示文件扩展名,文件名会仅显示为 JMeter。[你可以做一些事都很容易地发现伪装成文本文件的病毒和垃圾文件...]
还有记录错误,jmeter.log 文件记录一些测试运行信息。例如:
10/17/2003 12:19:20 PM INFO - jmeter.JMeter: Version 1.9.20031002
10/17/2003 12:19:45 PM INFO - jmeter.gui.action.Load: Loading file: c:\mytestfiles\BSH.jmx
10/17/2003 12:19:52 PM INFO - jmeter.engine.StandardJMeterEngine: Running the test!
10/17/2003 12:19:52 PM INFO - jmeter.engine.StandardJMeterEngine: Starting 1 threads for group BSH. Ramp up = 1.
10/17/2003 12:19:52 PM INFO - jmeter.engine.StandardJMeterEngine: Continue on error
10/17/2003 12:19:52 PM INFO - jmeter.threads.JMeterThread: Thread BSH1-1 started
10/17/2003 12:19:52 PM INFO - jmeter.threads.JMeterThread: Thread BSH1-1 is done
10/17/2003 12:19:52 PM INFO - jmeter.engine.StandardJMeterEngine: Test has ended
日志文件对发现错误原因很有帮助,作为JMeter不会打断一个测试来显示一个错误对话框。
2.4.7 命令行选项目录
调用JMeter的 "jmeter -?"命令将打印所有命令选项的一个列表。列表如下:
-h, --help 打印使用信息并退出
-v, --version 打印版本信息并推出
-p, --propfile {argument} 使用的JMeter属性文件
-q, --addprop {argument} 附加的属性文件
-t, --testfile {argument} 运行的JMeter测试文件(.jmx)
-l, --logfile {argument} 日志取样文件
-n, --nongui 非用户界面运行JMeter
-s, --server 运行JMeter服务器
-H, --proxyHost {argument} 设置JMeter使用的代理服务器
-P, --proxyPort {argument} 设置JMeter使用的代理服务器端口
-u, --username {argument} 设置JMeter使用的代理服务器用户名
-a, --password {argument} 设置JMeter使用的代理服务器密码
-J, --jmeterproperty {argument}={value} 定义附加的 JMeter 属性
-D, --systemproperty {argument}={value} 定义附加的 System 属性
-S, --systemPropertyFile {filename} 一个属性文件被做为系统属性添加
-L, --loglevel {argument}={value} 定义日志等级: [category=]level
例如 jorphan=INFO or jmeter.util=DEBUG
-r, --runremote从非用户界面模式启动远程服务器
-d, --homedir {argument} 使用的JMeter目录
2.5 配置 JMeter
如果你希望改变JMeter运行时的属性你需要改变在/bin目录的jmeter.properties文件,或者创建你自己的jmeter.properties文件并且在命令行指定它。
注意 |
参数
属性 |
描述 |
需要 |
ssl.provider |
你可以为你的SSL实现指定类。如果你想使用来自sun的JSSE,是这 样:com.sun.net.ssl.internal.ssl.Provider。JMeter默认提供https支持。如果你正在使用JDK1.4, 或者你使用带JSSE类的jar文件在JMeter的classpath里的JDK1.4。 |
No |
com.sun.net.ssl.internal.ssl.Provider。 |
JMeter默认提供https支持是在你使用 JDK1.4或者你使用把JSSE类的jar包放到JMeter classpath中的JDK1.3时候。 |
No |
xml.parser |
你可以指明一个你的XML解析器实现。 默认值是:org.apache.xerces.parsers.SAXParser |
No |
remote_hosts |
逗号分割远程JMeter主机列表。如果你在一个分布式环境运行JMeter,列出你用JMeter远程主机运行的机器。这允许你使用机器的用户界面控制那些服务器。 |
No |
not_in_menu |
在JMeter选项屏中你不想看到的组件列表。 如果JMeter被添加越来越多的组件,你会希望定制JMeter只出现那些你感兴趣的组件。你可以在这儿列出那些类名和他们的类标签(JMeter的用户界面出现的字符串), 它们将在选项屏中不出现。 |
No |
search_paths |
列出那些JMeter搜索JMeter附加类的路径(以;分割);例如附加的取样器。被添加到lib/ext目录的任何jar包都被发现。 |
No |
user.classpath |
JMeter搜索的公用类库的路径列表。被添加到lib目录的任何jar包都被发现。 |
No |
user.properties |
附加的JMeter属性文件名。 初始化属性文件后它们被添加,但是在-q和-J选项被处理之前。 |
No |
system.properties |
附加的系统属性文件名。 -S和-D选项被执行前添加。 |
No |
又见 jmeter.properties 文件注释,在你改变其它设置时会给你更多的信息。
3. 创建一个测试计划
一个测试计划描述了一系列Jmeter运行时要执行的步骤。一个完整的测试计划包含一个或者多个线程组,逻辑控制器,取样发生控制,监听器,定时器,断言和配置元件。
3.1 添加和删除元件
在一个树上通过右击可以添加元件到一个测试计划 ,并且从"添加"列表中选择一个新元件。另外,元件可以从文件加载并且通过选择"打开"选项添加。
为了删除元件,确保元件被选中,正确在元件上右击,并且选择"删除"选项。
3.2 加载和保存元件
为了从文件加载元件,右击将要加载元件到的已经存在的树元件,并选择"打开"选项。选择你的元件保存的文件。JMeter会加载元件到树中。
为了保存树元件,在一个元件上右击,选择"保存"选项。JMeter会保存已选的元件,加上所有下面的子元件。用这种方法,你能够保存测试树的片段,单独元件,或者整个测试计划。
工作台不会自动保存测试计划,但是它可以同上被单独保存 |
3.3 配置树元件
在测试树中的任何元件都在JMeter的右侧框架显示配置。那些配置允许你配置测试元件的细节行为,对于一个元件什么能被配置依赖于它是一个什么类型的元件。
可以通过拖拉测试树周围的元件操作测试树。 |
3.4 保存测试计划
虽然这不是必须的,我们推荐你在运行前保存测试计划。为了保存测试计划,从文件菜单选择保存测试计划(使用最新版本,你不再需要首先选择测试计划元件).
JMeter允许你保存整个测试计划树或者仅它的一部分.为了仅保存测试计划树中特殊"支"位置的元件,从从这个"支"开始的地方选择树中的测试计划元件 , 然后右击鼠标访问保存菜单项.另外选择合适的测试计划元件并从编辑菜单选择保存. |
3.5 运行一个测试计划
为了运行一个测试计划,从"运行"菜单项选择"开始"。为了停止你的测试计划,从同样的菜单选择"停止"。JMeter 不会自动给它是否正在运行任何显示。如果JMeter运行,一些监听器使它变明显,但是唯一确定的方法是检查"运行"菜单。如果"开始"不可用,"停止" 可用,证明JMeter正在运行你的测试计划(或者,至少, 它认为它是)。
有两个类型的停止命令:
- 停止 (Control + '.') - 立刻停止所有的线程
- 关闭 (Control + ',')- 请求所有线程在当前任务结束后停止
3.6 作用域规则
JMeter测试树包含元件总是分等级和顺序的。在测试树中的一些元件是严格分级(监听器,配置元件,后置处理器,前置处理器,断言,定时器),一 些主要是有序的(控制器,取样器)。当你创建测试计划时,你将创建一个有序的取样请求(通过取样器)列表,那些请求描述了一组步骤的执行。那些请求常组织 在也有序的控制器中。给出如下测试树:
测试树例子
请求的顺序是 One,Two,Three,Four。
一些控制器影响它的子元件的顺序,你可以在组件参考读到特定的控制器。
其他元素是分等级的。例如,一个断言在测试树中是分等级的。如果它的父元件是请求,它就被应用于那个请求。如果它的父元件是控制器,它就影响所有那个控制器下的所有请求。如下测试树:
分级例子
Assertion #1 仅被应用于请求 One, Assertion #2 仅被应用于 请求 Two 和 Three。
另一个例子,这次使用定时器:
复杂的例子
在这个例子里,请求的命名表现它们被执行的顺序。Timer #1 应用于 请求 Two, Three, 和 Four (注意对于分等级的元件怎样的顺序是不相关的)。Assertion #1 应用于请求Three。Timer #2 对所有请求有效。
希望那些例子使你弄清了配置(分等级的)元件如何被应用。如果你想每个请求都被树分叉拒绝,到它的父元件,到它的父元件的父元件,等等,每次收集所有它的父元件的配置元件,你将看到它如何工作的。
元件首部管理器, Cookie 管理器和授权管理器的配置和默认元件的配置被视为是不同的.默认元件配置的设置被并入取样器可以到达的一组值里了。然而来自管理器的设置没有并入。如果多于一个管理器在一个取样器范围中,仅仅一个被使用,但是现在没有办法指定那个被使用。
3.7 错误报告
JMeter 把警告和错误信息报告在jmeter.log文件中,也有一些测试运行本身的信息.只是偶尔地,JMeter对于某些错误是无法补捉和记录的,这些信息会 显示在命令台上。如果一个测试的执行并不是你所期待的,请检查日志,也许错误会被报告(例如:也许在函数调用上有语法错误)。
取样错误(例如:HTTP 404 - 找不到文件)是不会被正常的记录在日志中的,取而代之的,他们会被当作取样结果的属性来储存,取样结果的状态能被许多不同的监听器所得到。
4. 测试计划元件
测试计划对象有一个叫做"功能测试"复选框。如果被选择,它会使JMeter记录来自服务器返回的每个取样的数据。如果你在测试监听器中选择一个文 件,这个数据将被写入文件。如果你尝试一个较小的测试来保证JMeter配置正确并且你的服务器正在返回期望的结果,这是很有用的。这样的后果就是这个文 件会快速的增大,并且JMeter的效率会影响。如果你不做压力测试这个选项应该关闭(默认关闭)。
如果你不记录数据到文件,这个选项就没有不同了。
4.1 线程组
线程组元件是任何测试计划的起点。一个测试计划的所有元件必须在一个线程组下。由名字可以看出,线程组元件控制JMeter运行测试时使用的线程数。线程组管理允许你:
- 设置线程数
- 设置ramp-up period
- 设置执行测试的次数
每个线程会作为一个整体执行测试计划并完全独立于他测试线程。多线程用来模拟到达服务器程序的同步连接。
Ramp-up period告诉JMeter多久开始"ramp-up"选择的全部线程。如果使用10个线程,ramp-up period是100秒,那么JMeter用100秒使所有10个线程启动并运行。每个线程会在上一个线程启动后10秒(100/10)启动。如果有30 个线程和一个120秒的ramp-up period,那么每个连续的线程会延迟4秒。
Ramp-up需要要充足长以避免在启动测试时有一个太大的工作负载,并且要充足小以至于最后一个线程在第一个完成前启动(除非你想那样发生)。
使用ramp-up=线程数启动,并上下调整到所需的。
默认,线程组被配置仅循环一次。
1.9版本引入了一个测试运行*调度器*。 单击在线程组面板底部的复选框来显示额外的文本域,在里面你可以输入启动和结束时间。当测试启动时,如果必须JMeter会等待启动时间到达。在每个周期 结束,JMeter检验结束时间是否到达,如果是,运行停止,如果不是测试被允许继续,直到迭代限制到达。
另外你可以使用启动延迟和持续时间文本域。注意启动延迟会覆盖启动时间,持续时间会覆盖结束时间。
4.2控制器
JMeter有两种控制器:取样器和逻辑控制器。
取样器告诉JMeter发送请求到服务器。例如,如果你要JMeter发送一个HTTP请求添加一个HTTP请求取样器。你也可以通过添加一个或者多个配置元件到一个取样器来定制一个请求。更多信息,见取样器。
逻辑控制器让你定制当发送请求时JMeter使用的判断逻辑。例如,你可以添加交替控制器来在两个HTTP请求取样器之间交替 。更多信息,见逻辑控制器。
4.2.1 取样器(Sampler)
取样器告诉JMeter发送请求到服务器。JMeter取样器包括:
- FTP 请求
- HTTP 请求
- JDBC 请求
- Java object 请求
- LDAP 请求
- SOAP/XML-RPC 请求
- WebService (SOAP) 请求
每个取样器有一些你可以设置的属性。你可以通过添加一个或多个配置元件到取样器来进一步定制它。注意JMeter发送请求按照取样器出现在树中的顺序。
如果你想发送多个相同类型的请求(例如,HTTP Request)到相同的服务器,可以考虑使用一个默认配置元件。每个控制器有一个或者多个默认配置元件(见下)。
记得添加一个监听器到线程组来查看/保存你的请求结果到磁盘。
如果你对使用JMeter平台的基础验证器到你的请求响应感兴趣,添加一个断言到请求控制器。例如, 在压力测试一个web程序时,服务器会返回一个成功的HTTP响应代码,但是这个页面有错误或者被忽略部分。你可以添加断言来检查某个HTML标签,一些 错误字符串,等等。JMeter允许你使用正则表达式创建断言。
JMeter 內建取样器
4.2.2 逻辑控制器
保持
逻辑控制器让你定制当发送请求时JMeter使用的判断逻辑。逻辑控制器还可以作为下列任何元件的子元件:取样器(请求)、配置元件、和其他逻辑控制器。逻辑控制器可以改变来自它们的子元件的请求顺序。它们可以修改请求本身,导致JMeter重复请求,等。
理解逻辑控制器在测试计划中的效果,考虑下列测试树:
- 测试计划
- 线程组
- 仅一次控制器
- 登录请求(一个HTTP请求)
- 加载搜索页面(HTTP取样器)
- Interleave Controller
- 搜索"A"(HTTP取样器)
- 搜索"B"(HTTP取样器)
- HTTP默认请求(配置元件)
- HTTP默认请求(配置元件)
- Cookie管理器(配置元件)
- 仅一次控制器
- 线程组
这个测试的第一件事就是登录请求仅在第一次经过时被执行。随后的迭代会忽略它。这应使用仅一次控制器。
登陆后,下一个取样器加载搜索页面( 假设一个用登录的web应用程序,并到达搜索页面去搜索)。这仅是一个简单的请求,不会被任何逻辑控制器过滤。
加载搜索页面后,我们要做一个搜索。事实上,我们想做两个不同的搜索。然而,在每个搜索之间我们想要自己重新加载搜索页面。我们通过4个简单 HTTP元件这样做。(load search, search "A", load search, search "B"). Instead, we use the Interleave Controller which passes on one child request each time through the test. It keeps the ordering (ie - it doesn't pass one on at random, but "remembers" its place) of its child elements. Interleaving 2 child requests may be overkill, but there could easily have been 8, or 20 child requests.
注意HTTP默认请求属于插入控制器。假如"Search A"和"Search B"共享同样的PATH信息(一个HTTP请求说明中包括域,端口,方法,协议路径和参数,附加其他可选项)。两个搜索请求访问同样的后端搜索引擎(比方 说Servle,或者cgi脚本),这样是说得通的。与其两者都配置使用相同信息的HTTP取样器,我们可以抽象那些新到一个单独的配置元件。当内部控制 器通过"Search A"或者"Search B"传递时,它会从HTTP默认请求配置元件中获得值填充空白。所以我们可以为那些请求保留PATH域为空,然后把那些信息放到配置元件。在这个例子中, 这至多是一个很小的好处,但它显示了这个特性。
在这个树中下一个元件是另一个HTTP默认请求,这个时间被添加到线程组本身。这个线程组有一个内建的逻辑控制器,因此它正好使用这个配置元件做为 上面的描述。它填充任何穿过的请求的空白。 在web程序中你所有的HTTP取样器元件DOMAIN域为空,这是极度有用的,替代的,把那些信息放到HTTP默认请求元件中,添加到线程组。通过这样 做,你可以在一个同的服务器通过改变你测试计划中的一个域来测试你的程序。另外,你必须编辑每个取样器。
最后一个元件是一个HTTP Cookie管理器。一个Cookie管理器应该添加到所有web测试上-否则JMeter会忽略Cookie。通过在线程组级添加它,我们可以确定所有的线程分享同样的Cookie。
逻辑控制器可以组合达到不同的结果。见内建逻辑控制器列表。
4.3 监听器
监听器提供访问JMeter收集当JMeter运行的关于测试计划的信息。
图形结果监听器在一张图上绘制响应时间。
"查看结果树"监听器显示了请求和响应取样器的细节,并且以基础的HTML和XML显示响应表现。
其他监听器提供了摘要或者集合信息。
另外,监听器可以指导它们收集的数据到一个文件供以后用。在JMeter中每一个监听器提供一个域来指出存储数据的文件。
在测试中监听器可以添加到任何位置。它们仅仅会从它们等级或者它们以下等级的元件收集数据。
伴随JMeter有很多有趣的监听器。
4.4 定时器
默认,JMeter线程发送请求时不在请求间暂停。我们建议你通过添加一个可用的定时器到你的线程组来指定一个延迟。如果你不添加延迟,JMeter会在短时间内产生太多请求,可能会压倒你的服务。
定时器会使JMeter在一个线程开始每个请求间延迟一段时间。
如果你选择添加多于一个定时器到一个线程组,JMeter会在执行取样器前获得定时器数量并暂停那个时间量。
4.5 断言
断言允许你断言关于从测试服务器收到的响应的行为。使用断言你本质上你可以测试你的应用程序返回你期望的结果。
例如,你可以断言一个查询的响应会包含一些特殊的文本。你指定的文本可能是Perl风格的正则表达式, 并且你可以指出这个响应是包含这个文本,还是匹配整个响应。
你可以添加一个断言到任何取样器。例如你可以添加一个断言到HTTP请求检查文本"</HTML>"。JMeter会检查在HTTP响应中表现的文本。如果JMeter没有找到这个文本,它会标记这个为一个失败的请求。
为了查看断言结果,添加一个断言监听器到线程组。
Assertion--断言,通常是用于对每一个request sampler进行额外验证的工具。下面通过一个例子来介绍一下常用的几个Assertions。
假设现在要进行一个登陆的压力测试,下面是对pass的几个定义:
1.正确login后,必须收到返回的身份验证和用户个人信息下载的完成信息;
2.响应时间不能超过150毫秒
3.返回的结果大小不能小于750bytes
根据以上的要求,我们在对应的request sampler下面添加了以下的Assertions。
A.Response Assertion
Response Field to Test -- 标示被检查对象是什么?
Pattern Matching Rules -- 标明被检查对象与验证内容之间的关系,Contains(包含关系);Matches(匹配关系);Equals(相等关系);Not(非关系)
Pattern to Test -- 需要验证的内容列表
B.Duration Assertion
Duration to Assert -- 允许的响应时间的最大值
C.Size Assertion
Size to Assert -- 对于返回结果文件大小的标准定义
二、结果分析
添加了以上的Assertions后,我运行了一次脚本。以下是存放结果的.jtl文件的内容:
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,Latency
11/04/08 13:22:03,172,Do Login,200,OK,Thread Group 1-1,text,false,The operation lasted too long: It took 172 milliseconds, but should not have lasted longer than 150 milliseconds.,835,172
11/04/08 13:22:03,156,Do Login,200,OK,Thread Group 1-2,text,false,Test failed: text expected to contain /loginMsg="OK"/,633,156
11/04/08 13:22:03,156,Do Login,200,OK,Thread Group 1-3,text,false,The operation lasted too long: It took 156 milliseconds, but should not have lasted longer than 150 milliseconds.,839,156
11/04/08 13:22:03,156,Do Login,200,OK,Thread Group 1-4,text,false,The operation lasted too long: It took 156 milliseconds, but should not have lasted longer than 150 milliseconds.,836,156
11/04/08 13:22:03,78,Do Login,200,OK,Thread Group 1-5,text,true,,779,78
11/04/08 13:22:03,63,Do Login,200,OK,Thread Group 1-7,text,false,Test failed: text expected to contain /loginMsg="OK"/,570,63
11/04/08 13:22:03,141,Do Login,200,OK,Thread Group 1-6,text,false,The result was the wrong size: It was 721 bytes, but should have been greater than 750 bytes.,721,141
11/04/08 13:22:03,78,Do Login,200,OK,Thread Group 1-9,text,false,The result was the wrong size: It was 724 bytes, but should have been greater than 750 bytes.,724,78
11/04/08 13:22:03,204,Do Login,200,OK,Thread Group 1-10,text,false,The operation lasted too long: It took 204 milliseconds, but should not have lasted longer than 150 milliseconds.,1137,204
11/04/08 13:22:03,2985,Do Login,200,OK,Thread Group 1-8,text,false,Test failed: text expected to contain /loginMsg="OK"/,570,2985
我们可以看到,每一个Sampler都会经过Assertions的判断,只要有一个不符合条件的都会标示为False。
4.6 配置元件
配置元件配合取样器工作。虽然它不发送请求(除了HTTP代理服务器),但是它可以添加或者修改请求。
一个配置元件进能访问有所代替元件所在的树分支的内部。例如,如果你在一个简单逻辑控制器里面设置一个HTTP Cookie管理器,Cookie管理器很容易访问"web Page 1"和"web Page 2"HTTP请求。但是不能访问"web Page 3"。
同样,一个在树枝内部的配置元件比在父支的同样元件有更高的优先级。例如,我们定义两个HTTP默认请求元件,"Web Defaults 1"和"Web Defaults 2"。 如果我们把"Web Defaults 1"放置在一个循环控制器内部,仅"Web Page 2"可以访问它。另一HTTP请求会使用"Web Defaults 2",如果我们把它放置在线程组 (所有其他分支的父支)。
图 1 - 测试计划展示配置元件的可达性
4.7 前置处理器元件
前置处理器在取样器请求建立前执行一些行为。如果前置处理器附属于取样器元件,那么它会仅在那个取样器元件运行前执行。前置处理器最常用来在取样请求运行前修改它的设置,或者更新不能从响应文本提取的变量。 当前置处理器执行时,详细信息见作用域规则。
4.8 后置处理器元件
后置控制器在取样器请求建立后执行一些行为。如果后置处理器附属于取样器元件,那么它会仅在那个取样器元件运行后执行。后置处理器最常用来处理响应数据,常用来从它里面提取数值。\\\\\\详细见作用域规则关于前置处理器执行。
4.9 执行顺序
- 配额制元件
- 前置处理器
- 定时器
- 取样器
- 后置处理器 (如果SampleResult不为空)
- 断言 (如果SampleResult不为空)
- 监听器 (如果SampleResult不为空)
Please note that Timers, Assertions, Pre- and Post-Processors are only processed if there is a sampler to which they apply. Logic Controllers and Samplers are processed in the order in which they appear in the tree. Other test elements are processed according to the scope in which they are found, and the type of test element. [Within a type, elements are processed in the order in which they appear in the tree]. |
For example, in the following test plan:
- Controller
- Post-Processor 1
- Sampler 1
- Sampler 2
- Timer 1
- Assertion 1
- Pre-Processor 1
- Timer 2
- Post-Processor 2
The order of execution would be:
Pre-Processor 1
Timer 1
Timer 2
Sampler 1
Post-Processor 1
Post-Processor 2
Assertion 1
Pre-Processor 1
Timer 1
Timer 2
Sampler 2
Post-Processor 1
Post-Processor 2
Assertion 1
4.10 Properties and Variables
JMeter properties are defined in jmeter.properties (see Gettting Started - Configuring JMeter for more details).
Properties are global to jmeter, and are mostly used to define some of the defaults JMeter uses. For example the property remote_hosts defines the servers that JMeter will try to run remotely. Properties can be referenced in test plans - see Functions - read a property - but cannot be used for thread-specific values.
JMeter variables are local to each thread. The values may be the same for each thread, or they may be different.
If a variable is updated by a thread, only the thread copy of the variable is changed. For example the Regular Expression Extractor Post-Processor will set its variables according to the sample that its thread has read, and these can be used later by the same thread. For details of how to reference variables and functions, see Functions and Variables
Note that the values defined by the Test Plan and the User Defined Variables configuration element are made available to the whole test plan at startup. If the same variable is defined by multiple elements, then the last one takes effect. Other elements such as the User Parameters Pre-Processor or Regular Expression Extractor Post-Processor may be used to redefine the same variables. These redefinitions only apply to the current thread.
Note that global variables cannot be updated during a test. The setProperty function can be used to define a JMeter property. These are global to the test plan, so can be used to pass information between threads.
5.创建一个Web测试计划
在这一部分,你将学会如何创建一个基础的测试计划来测试一个Web站点,你将会创建5个用户向Jackrta网站上的两个网页发送请求。同样,你要告诉用户运行测试两次。这样,总的HTTP发送请求为(5个用户*2次请求*重复2次)=20。要创建这个测试计划,你将会用到下面的元件:线程组,HTTP请求,HTTP请求默认值和图形结果。
要创建更好的测试计划,可以参考创建一个高级web测试计划 。
5.1添加用户
处理每个JMeter测试计划的第一步就是添加线程组元件。这个线程组会告诉JMeter你想要模拟的用户数量,用户应该发送请求的频率和应该发送的数量。
下一步来添加一个线程组:
首先选择这个测试计划,用鼠标右键点击然后在得到的菜单中选择"添加"--> "线程组"。
这时你应该看到这个线程组已经在测试计划下面了,如果没有看到,就点击测试计划元件展开这个测试计划树。
下一步,你需要修改这些默认的属性。如果你还没有选择线程组元件,则从测试计划树型结构中选择它。这时你应该看到JMeter窗口右边的线程组控制面板了。
图5.1. 线程组默认值
首先给这个线程组起一个有意义的名字。在名称域中, 输入Jakarta Users.
下一步,增加用户的数量(称为线程)为5。
域Ramp-Up Period:,使用默认值为0。这个属性表示每个用户启动的迟延时间。例如,如果你输入Ramp-Up Period为5秒,JMeter将会在5秒结束前完成启动所有的用户。所以,如果你有五个用户并且Ramp-Up Period为五秒,那么开始用户的延迟就是1秒。(5个用户 / 5秒 = 1 用户每秒)。如果你设置其值为0,JMeter将会立即启动你所有的用户。
域Loop Count:取消标记为"永远"的复选框选择并设置循环次数为2。 这个属性表示你的测试的重复次数。如果你设置为1,JMeter将你的测试只运行一次。 要让JMeter不断的运行,你要选择"永远"这个复选框。
在大多数的应用程序中,你需要手动来接受你在控制面板中所做的修改。但在JMeter中,如果你做了修改,控制面板可以自动的接受。如果你修改的元件的名字,当你离开控制面板后树型菜单自动更新(例如, 当你选择另外一个树元件)。 |
见图 5.2 为完整的Jakarta Users线程组。
图 5.2. Jakarta Users 线程组
5.2添加默认HTTP请求属性
我们已经定义了用户,现在要定义他们的行为了。在这一部分,你将学会对你的HTTP请求设置默认值。然后在5.3节,用你在这里指定的默认设置来添加HTTP请求元件。
首先选择Jakarta Users(就是刚才的线程组)元件,右键点击并在弹出的菜单中选择"添加"-->"配置元件"-->"HTTP请求默认值"。 然后选择这个新元件来显示其控制面板(见图5.3)。
图5.3. HTTP 请求默认值
跟大多数的JMeter元件一样, HTTP请求默认值控制面板也有一个名称域。在这个例子中将它保留为默认值。
下面这个文本域是Web服务器的服务器/IP。对于你创建的测试计划,所有的HTTP请求都将发送到相同的Web服务器jakarta.apache.org。向这个域中输入这个域名,这是唯一一个需要我们去修改它的默认值的文本域,其它的文本域都保留它们的默认值。
HTTP请求默认值元件并不告诉JMeter来发送HTTP请求,它仅仅定义这个HTTP请求所用的默认值。 |
见图5.4完整的HTTP请求默认值元件
图5.4. 测试计划的HTTP 默认值
5.3添加 Cookie 支持
除非你的应用程序明确的不使用Cookies,几乎所有的网站应用程序都会使用cookie支持。要添加cookie支持,可以简单的在你的测试计 划中给每一个线程组添加一个 HTTP Cookie管理器。这样确保每个线程组有自己的cookies,但是共享跨越所有的HTTP请求对象。
添加 HTTP Cookie管理器,简单地选择这个线程组,选择添加-->配置元件-->HTTP Cookie管理器,也可以从编辑菜单或通过右键点击来实现添加。
5.4添加 HTTP 请求
在这个测试计划中,我们需要实现两个HTTP请求。第一个就是 Jakarta网站首页(http://jakarta.apache.org/),第二个就是工程向导网页(http://jakarta.apache.org/site/guidelines.html)。
JMeter按照它们在树的出现的次序来发送请求。 |
首先给Jakarta Users元件添加第一个HTTP请求 (添加--> 取样器--> HTTP 请求)。然后从树中选择HTTP请求元件并修改下列属性(见图5.5):(取样器就是sampler)
- 更改名称域为"Home Page"。
- 设置路径域为 "/"。记得你不必设置服务器名域,因为你已经在HTTP默认请求元件中指定了这个值。
图 5.5. Jakarta首页的HTTP请求
下一步,添加每二个HTTP请求并修改下列属性(见图5.6):
- 更改名称域为"Project Guidelines"。
- 设置路径域为 "/site/guidelines.html"。
图 5.6. Jakarta工程Guidelines页的HTTP请求
5.5 添加一个监听器来浏览/储存测试结果
最后一个需要添加到测试计划的元件是监听器 。这个元件的用途是将所有的HTTP请求结果存储在一个文件中并显现出数据的可视模型。
选择Jakarta Users 元件,然后添加一个"图形结果"监听器 (添加--> 监听器-->图形结果). 接着,你需要指定一个文件路径和输出文件名。你可以在文件名域中输入或选择浏览按钮并选择一个路径然后输入文件名。
图 5.7. 图像结果监听器
5.6 登录一个web站点
在这它不是一个例子,但是一些网站需要在许可你做某些操作前登录.在一个web浏览器中,登录会表现为一个包含用户名,密码和一个提交按钮的表单. 这个按钮产生一个POST请求,传递表单的值作为参数.It's not the case here, but some web-sites require you to login before permitting you to perform certain actions. In a web-browser, the login will be shown as a form for the user name and password, and a button to submit the form. The button generates a POST request, passing the values of the form items as parameters.
在JMeter中这样做,添加一个HTTP请求,并设置为POST方法.你还要通过表单知道域的名字和目标页面.通过查看那登陆页面的代码可以发现 它们.To do this in JMeter, add an HTTP Request, and set the method to POST. You'll need to know the names of the fields used by the form, and the target page. These can be found out by inspecting the code of the login page. [如果这比较难做,你可以使用JMeter代理记录器来记录登录顺序.If this is difficult to do, you can use the JMeter Proxy Recorder to record the login sequence.] 设置路径为提交按钮的目标.单击添加按钮并输入用户名和密码资料.有时登录表单包含附加的隐藏域.它们也需要被添加.Set the path to the target of the submit button. Click the Add button twice and enter the username and password details. Sometimes the login form contains additional hidden fields. These will need to be added as well.
Figure 5.8. Sample HTTP login request
6. 创建一个高级web测试计划
在这章,你将学到如何创建高级测试计划来测试web站点。
如果需要一个基础的测试计划例子,见创建一个web测试计划 。
6.1 用URL重写处理用户会话
如果你的web应用程序使用URL重写,而不是cookies保存会话信息,那么为了测试你的站点你将需要做一点额外的工作。
为了正确响应URL重写,JMeter需要解析从服务器得到的HTML并获取唯一的会话ID。利用适当的HTTP URL重写修改器来完成这些。 简单地在修改器中输入你的会话ID参数名,它会找到它并添加它到每一个请求。如果请求已经有一个值,它将会被替代。如果"缓存会话Id?"被选中,那么最 后创建的会话ID将被保存,并且如果HTTP的上次取样不包含一个会话ID,它将会被使用。
URL 重写例子
下载这个例子.在图1中展示了一个使用URL重写的测试计划。注意URL重写修改器附被添加到简单控制器,因此确认它仅影响简单控制器下的请求.
图 1 - 测试树
在图2中,我们看到了URL重写修改器的GUI,它仅仅有一个让用户指定会话ID参数名的文本域。 有一个复选框来指示会话ID将被化为为路径 (以";"隔开),这样胜过使用一个请求参数。
图 2 - 请求参数
6.2 使用消息头管理器
HTTP消息头管理器允许你定制JMeter在HTTP请求消息头发送什么信息。这个消息头包括像"User-Agent", "Pragma", "Referer"等属性。
HTTP消息头管理器像HTTP Cookie管理器一样,如果你因为一些原因你不希望在你的测试里为不同的HTTP请求对象指定不同的消息头,可以添加到线程组等级。
7. 创建一个数据库测试计划
在这一部分,你将学会如何去创建一个基础的测试计划来测试一个数据库服务器。你会创建10个用户来给数据库服务器发送2次SQL请求。同样,你也可以让用户运行他们的测试三次。这样总的JDBC请求数量就是(10用户)*(2次请求)*(重复3次)=60。要构建这个测试计划,你将会用到下面的元件:线程组,JDBC请求,图形结果。
这个例子使用了MySQL数据库驱动。要使用这个驱动,它所包涵的.jar文件必须复制到../lib/directory下(详情参见JMeter's ClassPath)。 |
7.1 添加用户
处理每个JMeter测试计划的第一步就是添加线程组元件。这个线程组会告诉JMeter你想要模拟的用户数量,用户应该发送请求的频率和应该发送的数量。
开始来添加一个线程组:首先选择这个测试计划,点击鼠标右键得到添加菜单,然后选择添加-->线程组。
这时你应该看到这个线程组已经在测试计划下了,如果没有看到,就点击测试计划元件展开这个测试计划树。
下一步,你需要修改这些默认的属性。如果你还没有选择线程组元件,则从测试计划树型结构中选择它。这时你应该看到JMeter窗口右边的线程组控制面板了(见下图7.1)。
Figure 7.1. Thread Group with Default Values
首先给这个线程组起一个有意义的名字。在名称域中, 输入JDBC Users。
你将需要一个可用的数据库,数据库表,和表的用户使用权限。在这个例子中,数据库是'mydb',表名是'Stocks'。 |
接下来,将用户的数量(即线程)增加到10。
在下一个Ramp-Up Period文本域中, 使用默认值0。这个属性表示每个用户启动的迟延时间。例如,如果你输入Ramp-Up Period 为5秒,JMeter将会在五秒结束前完成启动所有的用户。所以,如果你有五个用户并且Ramp-Up Period为五秒,那么启动用户的延迟就是1秒。(5个用户/5秒 = 1用户每秒). 如果你设置其值为0,JMeter将会立即启动你所有的用户。
最后,输入循环次数为3。 这个属性告诉JMeter你的测试运行多少次。如果你设置为1,JMeter将你的测试只运行一次。 要让JMeter不断的运行,你要选择"永远"这个复选框。
在大多数的应用程序中,你需要手动来接受你在控制面板中所做的修改。但在JMeter中,如果你做了修改,控制面板可以自动的接受。如果你修改的元件的名字,树型菜单当你离开控制面板后自动更新。 (例如, 当你选择另外一个树元件。) |
见图7.2 完整的JDBC Users线程组.
图7.2. JDBC Users线程组
7.2 添加JDBC请求
现在我们已经定义了用户,是时候定义他们。在这一部分,我们将会详细说明JDBC请求的执行。
首先选择JDBC用户元件,点击鼠标右键,得到添加菜单,然后选择添加-->配置元件-->JDBC连接配置。接着,选择这个新元件来显示它的控制面板(见图7.3)。
设定下面的文本域(我们这里假定用一个名为test的本地MySQL数据库)。
- 绑定到池变量。 这需要能够唯一标识这个配置。这是用来被JDBC取样器识别这个配置来使用.
- 数据库URL: jdbc: mysql://localhost:3306/test
- JDBC驱动类: com.mysql.jdbc.Driver
- 用户名: guest
- 密码: guest的密码
剩下的域保留默认值。
图 7.3. JDBC配置
再次选择JDBC用户元件。点击鼠标右键,得到添加菜单,然后选择添加-->Sampler-->JDBC请求。然后,选择这个新元件来显示其控制面板(见图7.4)。
图 7.4. JDBC请求
在我们这个测试计划中,我们将发送2个JDBC请求。第一个是向Eastman Kodak stock,第二个是向Pfizer stock(很显然需要改变这些例子来适合你的特殊的数据库)。下面有插图文字说明。
JMeter发送请求的次序就是你向树中添加它们的次序。 |
开始编辑下列的属性(见图7.5):
- 修改名称为"Kodak"
- 输入池名:MySQL(在配置元件里面一样)
- 输入SQL查询字符串域
图 7.5. Eastman Kodak stock的JDBC请求
下一步,添加第二个JDBC请求并编辑下列的属性(见图7.6):
- 修改名字为"Pfizer"
- 输入SQL查询字符域
图 7.6. Pfizer stock的JDBC请求
7.4 添加一个监听器浏览/保存测试结果
你需要添加到你测试计划的最后元件是一个监听器。这个元件责任是储存所有你的JDBC请求结果到文件,并且展示一个可视数据模型。
选择JDBC用户元件,添加一个图形结果监听器(添加-->监听器-->图形结果)。
图 7.7. 图像结果监听器
8 创建一个FTP测试计划
在这章,你将学习到如何创建一个基本的测试计划来测试FTP站点。你将为在O'Reilly的FTP站点上的两个文件创建四个发送请求的用户。同样,你将告诉用户运行测试两次。所以整个测试数目是(4个用户)*(2个请求)*(重复2次)=16个FTP请求。为了构造测试计划,你将需要使用下列元件:测试线程,FTP请求,FTP默认请求和Spline Visualizer。
这个例子使用O'Reilly的FTP站点,www.oro.com。当运行这个例子时请考虑周到,并且(如果可能)考虑再次运行其他FTP站点。 |
8.1 添加用户
你想处理每个JMeter测试计划的第一步是添加线程组元件。线程组告诉JMeter你想模拟的用户数,用户发送请求的频率,和发送请求的数量。
顺便说一下,首先选择测试计划,右键点击得到"添加"菜单,并且选择"添加"-->"线程组",通过这种方式添加线程组。
现在你应该看到了测试计划下的线程组元件了。如果你看不到这个元件,单击测试计划元件展开测试计划树。
下一步,你需要修改默认配置。如果你还没有选择线程组元件,在树里选择它。现在在JMeter窗口右部你应该可以看到线程组控制面板。
(见下图8.1)
图8.1 使用默认值的线程组
首先给线程组起一个更加有意义的名字。在名称域,输入O'Reilly Users。
下一步,增加用户数(称作线程)到四个。
在下一个文本域——Ramp-UP Period,使用默认值0秒。这个属性告诉JMeter启动每个用户之间的时间间隔。例如,你输入Ramp-Up Period 为五秒,JMeter将会在最后5秒结束前启动所有你的用户。所以,如果我们有5个用户和一个5秒的Ramp-Up Period,那么启动用户的延迟就是1秒(5用户/5秒=1用户每秒)。如果你设置为那个值为零,那么JMeter将会立刻启动所以你的用户。
最后,清除标为"永远"的复选框,并且在循环次数文本域中输入2。这个属性告诉JMeter重复你的测试的次数。如果你输入循环次数为0,那么JMeter将会运行你的测试一次。为了让JMeter重复运行你的测试计划,选择永远复选框。
在大部分应用程序中,你必须在控制面板中手工改变。然而,在JMeter中,控制面板中自动接受你做的改变。如果你修改元件名,这个树会在你离开控制面板前自动使用新的文本更新这个树(例如,当你选择另一个树元件时)。 |
见图8.2 完整的O'Reilly Users线程组。
图8.2 O'Reilly Users线程组
8.2 添加默认FTP请求配置
既然我们已经定义了我们的用户,是时间定义他们要执行的任务了。在这一节,你将为你的FTP请求指定默认设置。然后在8.3节,你将会添加使用你在这里指定的一些默认设置的FTP请求元件。
首先选择O'Reilly Users元件。右键点击得到"添加"菜单,然后选择"添加" --> "配置元件" --> "FTP默认请求"。于是选择新的元件预览它的控制面板(见图8.3)。
图8.3 FTP默认请求
像大多数JMeter元件一样,FTP默认请求控制面板有一个你可以修改的名称域。在这个例子里,保持这个文本域使用默认值。
忽略下一个文本域,它是FTP服务器的服务器名/IP。为了你正在构建的测试计划,所有的FTP请求将会发送到相同的FTP服务器,ftp.oro.com。输入域名到这个文本域。这是唯一一个需要我们去修改它的默认值的文本域,所以保持剩余的文本域使用它们的默认值。
FTP默认请求元件没有告诉JMeter发送一个FTP请求。它只是简单定义了FTP请求元件使用的默认值。 |
见图8.4 完整的FTP默认请求元件。
图8.4 我们测试计划的FTP默认
8.3 添加FTP请求
在我们的测试计划中,我们需要制作两个FTP请求。第一个是O'Reilly下的mSQL下的java下README文件(ftp://ftp.oro.com/pub/msql/java/README),第一个文件是tutorial文件(ftp://ftp.oro.com/pub/msql/java/tutorial.txt)。
JMeter按照它们在树中出现的顺序发送请求。 |
首先添加第一个FTP请求到O'Reilly Users元件(添加 --> 取样器 --> FTP 请求)。然后在树中选择FTP请求元件,并且编辑下列属性(见图8.5):
- 修改名称域为"README"。
- 修改File to Retrieve From Server文本域为"pub/msql/java/README"。
- 修改用户名域为"anonymous"。
- 修改密码域为"anonymous"。
因为你已经在FTP默认请求元件中指定了服务器名,所以你不需要设置这个值了。 |
图8.5 O'Reilly mSQL java README文件的FTP请求
下一步,添加第二个FTP请求,并修改下列属性(见图8.6):
- 修改名称域为"tutorial"。
- 修改File to Retrieve From Server文本域为"pub/msql/java/tutorial.txt"。
- 修改用户名域为"anonymous"。
- 修改密码域为"anonymous"。
图8.6 O'Reilly mSQL java tutorial文件的FTP请求
8.4 添加一个监听器浏览/保存测试结果
你需要添加到你测试计划的最后元件是一个监听器。这个元件责任是储存所有你的FTP请求结果到文件,并且展示一个可视数据模型。
选择O'Reilly Users元件,添加一个Spline Visualizer监听器(添加 --> 监听器 --> Spline Visualizer)。
图8.7 Spline Visualizer监听器
9 构建一个LDAP测试计划
在这一节,你将学习到如何创建一个基本的测试计划来测试一个LDAP服务器。你将为在LDAP上的四个测试创建四个用户发送请求。同样,你要告诉用 户运行测试两次。所以,整个请求次数是(4用户)x (4请求)x (重复2次)=32 LDAP请求。为了构造测试计划,你将使用下列元件:线程组,LDAP请求,LDAP请求默认值和表格视图结果。
这个例子,假定在你的本地机器上已经安装了LDAP服务器。
9.1 添加用户
你想使用JMeter测试计划的第一步是添加一个线程组元件。线程组告诉JMeter你想要模拟的用户数,用户多长时间发送一次请求,和它们发送多少个请求。
继续进行,通过首先选择测试计划添加线程组,单击鼠标右键得到"添加"菜单,然后选择"添加"-->"线程组"来添加一个线程组。你现在应该在测试计划下看到线程组。如果你没有看到这个元件,那么通过单击测试计划元件展开测试计划树。
图9.1 线程组默认值
9.2 添加登录配置元件
开始选择Siptech User元件。点击鼠标右键得到添加菜单,然后选择"添加"--> "配置元件" --> "登录配置"元件。然后选择这个新元件来查看它的控制面板。
像大多JMeter元件一样,登录配置元件控制面板有名称域你可以修改。在这个例子中,保留它为默认值。
图9.2 登录配置元件测试计划
9.3 添加LDAP请求默认值
开始选择Siptech User元件。单击鼠标右键得到添加菜单,然后选择"添加"-->"配置元件"-->"LDAP请求默认值"。选择这个新元件来查看它的控制面板。
像大多JMeter元件一样,LDAP请求默认值控制面板有名称域你可以修改。在这个例子中,保留它为默认值。
图9.3 LDAP请求默认值测试计划
在DN域输入"你服务器的根DN"。 |
9.4 添加LDAP请求
在我们测试计划我们需要准备四个LDAP请求。
- Inbuilt Add Test
- Inbuilt Modify Test
- Inbuilt Delete Test
- Inbuilt Search Test
JMeter以添加它们到树的顺序发送请求。开始添加第一个LADP请求到Siptech User元件(添加-->LDAP请求)。然后,在树中选择LDAP请求元件,编辑下列属性
- 更改名称为Inbuilt-Add Test
- 选择添加测试单选按钮
图9.4.1 Inbuilt Add test LDAP请求
你不需要设置服务器域和端口域,用户名,密码和DN,因为你已经在Login Config Element和LDAP请求默认值中指定了。
下一步,添加第二个LDAP请求,编辑下列属性
- 更改名称为Inbuilt-Modify Test
- 选择修改测试单选按钮
图9.4.2 Inbuilt Modify test LDAP请求
- 更改名称为Inbuilt-Delete Test
- 选择删除测试单选按钮
图9.4.3 Inbuilt-Delete Test LDAP请求
- 更改名称为Inbuilt-Search Test
- 选择搜索测试单选按钮
图9.4.4 Inbuilt-Search Test LDAP请求
9.5 添加一个监听器浏览/保存测试结果
你需要添加到你测试计划的最后元件是一个监听器。这个元件责任是保存所有你的LDAP请求结果到一个文件,并且显示一个可视化数据模型。选择Siptech Users元件,添加一个表格视图结果(添加-->表格视图结果)。
图9.5表格视图结果监听器
9.6 保存测试计划
虽然它不是需要的,但是我们推荐你在运行前保存测试计划到一个文件。为了保存测试计划,从文件菜单选择保存测试计划(使用最新版本,它不再需要首先选择测试计划元件)。
JMeter允许你保存这个测试计划树或者仅仅其中一部分。为了仅保存在测试计划树上的特殊"分支",选择在树中用来启动"分支"的测试计划元件,然后右击在菜单项中选择"保存"。或者,选择合适测试计划元件,然后从编辑菜单选择保存。 |
9.7 运行测试计划
从运行菜单,选择运行。
如果你测试正在运行,JMeter在右手上方的角落点亮一个绿正方形显示。当所有测试停止,那个方块变成灰色。即使你选择了"停止",绿光依然会继续持续,直到所有测试都已经退出。 |
10构建一个Web服务测试计划
在这章,你将学习如何创建一个测试web服务的测试计划。你将创建五个发送请求到一个页面的用户。同时,你将告诉用户运行他们的测试两次。所以整个 请求是(5用户)*(1请求)*(重复2次)=10HTTP请求。为了构造测试计划,你将需要使用以下元件:测试计划、Web服务(SOAP)请求 (beta版代码)和图表结果。
General notes on the webservices sampler.现在实现使用Apache SOAP驱动程序,需要来自sun的activation.jar和mail.jar包。由于协议限制,JMeter没有包含这些jar文件到二进制版 本。请查阅SOAP文档的未来细节。
如果取样器表现出从web服务中得到一个错误,仔细检查SOAP消息,确认格式正确。细节方面,确认xmlns属性和WSDL是一样的。如果xml 命名空间是不同的,web服务将会可能返回一个错误。Xmethods为那些想要测试他们的测试计划的人包含了一系列公用的web服务。
10.1添加用户
你想处理每个JMeter测试计划的第一步是添加线程组元件。线程组告诉JMeter你想模拟的用户数,用户发送请求的频率,和发送请求的数量。
顺便说一下,首先选择测试计划,右键点击得到Add菜单,并且选择Add->ThreadGroup,通过这种方式添加线程组。
现在你应该看到了测试计划下的线程组元件了。如果你看不到这个元件,单击测试计划元件展开测试计划树。
下一步,你需要修改默认配置。如果你还没有选择线程组元件,在树里选择它。现在在JMeter窗口右部你应该可以看到线程组控制面板。
(见下10.1)
图10.1 使用默认值的线程组
首先给线程组起一个更加有意义的名字。在name文本域,输入O'Reilly Users。
先一步,增加用户数(调用线程)到四个。
在下一个文本域——Ramp-UP Period,使用默认值0秒。这个属性告诉JMeter启动每个用户之间的时间间隔。例如,你输入Ramp-Up Period 为五秒,JMeter将会在最后5秒结束前启动所有你的用户。所以,如果我们有5个用户和一个5秒的Ramp-Up Period,那么启动用户的延迟就是1秒(5用户/5秒=1用户每秒)。如果你设置为那个值为零,那么JMeter将会立刻启动所以你的用户。
最后,清除标为"Forever"的复选框,并且在循环次数文本域中输入2。这个属性告诉JMeter重复你的测试的次数。如果你输入循环次数为0,那么JMeter将会运行你的测试一次。为了让JMeter重复运行你的测试计划,选择Forever复选框。
在大部分应用程序中,你必须在控制面板中手工改变。然而,在JMeter中,控制面板中自动接受你做的改变。如果你修改元件名,这个树会在你离开控制面板前自动使用新的文本更新这个树(例如,当你选择另一个树元件时)。 |
见图10.2 完整的Jakarta Users线程组。
图10.2 Jakarta Users线程组
10.2添加web服务请求
在我们的测试计划,我们将使用一个.NET web服务。自从你在使用web服务取样器,我们将不用深究写一个web服务的细节。如果你不知道如何写一个web服务,使用google搜索web服务 并自己去熟悉写java和.NET的web服务。应该注意的是.NET和Java的web服务实现有很大的不同。这个主题包含在用户手册太宽了。请参考其 他源代码来得到更好的不同之处的概念。
JMeter发送请求是以它们出现在书中的顺序。 |
开始添加Web服务(SOAP)请求(Beta代码)取样器到Jakarta Users元件(添加-->取样器-->Web服务(SOAP)请求(Beta代码))。然后,在树中选择web服务请求元件并设置下列属性(见图10.5):
- 改变名称文本域为"WebService(SOAP) Request (Beta Code)"。
- 输入WSDL地址并点击"加载WSDL"。
图10.3 Web服务请求
如果WSDL文件加载正确,"Web方法"下拉框将会增加元素。如果下拉框仍然为空,它说明得到WSDL文件有问题。你可以使用浏览器读取XML测试WSDL。例如,如果你测试一个IIS web服务,URL会像这样:http://localhost/myWebService/Service.asmx?WSDL。在这点,"SOAPAction","URL","SOAPData"应该为空。
下一步,选择web方法并点击"配置"。取样器应该会填充"URL"和"SOAPAction"文本域。加入WSDL文件有效,正确的SOAPAction会输入。
最后一步是在"SOAP/XMl-RPC"文本域粘贴SOAP消息。
11. 构建一个JMS点对点测试计划
JMS:JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。
在本节中,你将学会如何创建一个测试计划来测试JMS点对点的解决方案。测试的建立是一个有五个线程的线程组,通过每个请求队列发送4个消息。一个固定的回复队列将用来监听应答消息。每个1到10次迭代。构建测试计划,你将使用下列元件:线程组,JMS点对点和图形结果。
大概介绍一下JMS。现在有两种JMS取样器。一个使用JMS主题,另一个使用队列。主题消息通常被称作发布/订阅消息。它一般使用的情况是一个生产者发布消息,多个订阅者来消费。
11.1 添加一个线程组
你想使用JMeter测试计划的第一步是添加一个线程组元件。线程组告诉JMeter你想要模拟的用户数,用户多长时间发送一次请求,和它们发送多少个请求。
继续进行,通过初次的选择测试计划添加线程组,单击鼠标右键得到一个菜单,然后选择添加-->线程组来添加一个线程组。
你现在应该在测试计划下看到了线程组。如果你没有看到这个元件,然后通过单击测试计划元件展开测试计划树。
下一步,你需要修改默认属性。如果你还没有选择线程组元件,那么在这个树中选择它。你现在应该在JMeter窗口的右边部分看到了线程组控制面板。(见下图:11.1)
图11.1使用默认值的线程组
开始,为我们的线程组提供一个更加有描述性的名字。在name域,输入Point-to-Point。
下一步,增加用户数(即线程)到5。
在下一个域中,Ramp-Up周期,保持默认值0秒。这个属性告诉JMeter启动每个用户之间有多长延迟。例如,如果你输入Ramp-up周期为 5秒,JMeter会到5秒末完成启动所有你的用户。所以如果我们有五个用户和一个5秒的Ramp-up周期,那么启动用户之间的延迟将会是1秒(5用户 /5秒=1用户每秒)。如果你设置为那个值为零,那么JMeter将会立刻启动所以你的用户。
最后,清除标为"Forever"的复选框,并且在循环次数域中输入4。这个属性告诉JMeter重复你的测试的次数。如果你输入循环次数为0,那么JMeter将会运行你的测试一次。为了让JMeter重复运行你的测试计划,可以选择Forever复选框。
在大部分应用程序中,你必须在控制面板中手工改变。然而,在JMeter中,控制面板中自动接受你做的改变。如果你修改元件名,这个树会在你离开控制面板前自动使用新的文本更新这个树(例如,当你选择另一个树元件时)。 |
11.2 添加点对点取样器
确认你需要的jar文件在JMeter的lib目录下。如果它们不在,停止JMeter,拷贝jar文件过去,然后重启JMeter。
开始添加JMS点对点取样器到Jakarta用户元件(添加-->JMS点对点)。然后,在树中选择JMS点对点取样器元件。在构建例子中将提供一个使用ActiveMQ3.0工作的配置。
11.3 添加一个监听器浏览/保存测试结果
你需要添加到你测试计划的最后元件是一个监听器。这个元件责任是保存所有你的HTTP请求结果到一个文件,并且显示一个可视化数据模型。
选择Jakarta Users元件,添加一个图形结果监听器(添加-->图形结果)。下一步,你需要指定一个目录和一个输出文件名。你可以,选择浏览按钮,浏览一个目录,然后输入一个文件名。
图11.2图形结果监听器
11.4 保存测试计划
虽然它不是需要的,但是我们推荐你在运行前保存测试计划到一个文件。为了保存测试计划,从文件菜单选择保存测试计划(使用最新版本,它不再需要首先选择测试计划元件)。
JMeter允许你保存这个测试计划树或者仅仅其中一部分。为了仅保存在测试计划树上的特殊"分支",选择在树中用来启动"分支"的测试计划元件,然后右击在菜单项中选择"保存"。或者,选择合适测试计划元件,然后从编辑菜单选择保存。 |
11.5 运行测试计划
从运行菜单,选择运行。
如果你测试正在运行,JMeter在右手上方的角落点亮一个绿正方形显示。当所有测试停止,那个方块变成灰色。即使你选择了"停止",绿光依然会继续持续,直到所有测试都已经退出。 |
一旦JMeter完成你的测试计划,从运行菜单选择停止。
如果你在监听器中选择一个文件保存结果,那么你将会有一个能够在任何visualizer中打开的文件。每个visualizer以它们自己的风格显示结果。
有可能会在多于一个的visualizer中打开同一个文件。这是没有问题的。JMeter会确保在测试运行时没有取样器记录到同一文件多于一次。 |
11.6 ActiveMQ3.0的类库
下面是必须在JMeterlib\ext目录提供的类库。
- activation.jar
- activeio-1.0-SNAPSHOT.jar
- activemq-3.0.jar
- activemq-core-3.0.jar
- commons-logging-1.0.3.jar
- concurrent-1.3.4.jar
- geronimo-spec-j2ee-jacc-1.0-rc4.jar
- geronimo-spec-j2ee-management-1.0-rc4.jar
- geronimo-spec-jms-1.1-rc4.jar
- geronimo-spec-jta-1.0.1B-rc4.jar
- jms.jar
- jndi.jar
- log4j-1.2.8.jar
- spring-1.1.jar
12.创建JMS主题测试计划
在这章,你将学习如何创建一个测试计划去测试JMS提供者。你将创建五个订阅者和一个发布者。你将创建两个线程组并且设置一个为重复10次。消息总 数是(6线程)x(1消息)x(重复10次)=60个消息。为了构造测试计划,你将使用以下元件:线程组、JMS发布者、JMS订阅者和图标结果。
一般在。当前有两个JMS取样器。一个使用JMS主题,另一个是使用JMS队列。主题消息是通常说的发布/订阅消息。在案例里它一般用在一个被生产 者发布消息和多个订阅者接收消息的地方。队列消息一般被用在发送者期望得到一个响应时的事务。消息系统和普通的HTTP请求有很大不同。在HTTP中,单 个用户发送一个请求并且得到一个响应。消息系统可以工作在同步和异步模式。
12.1添加用户
第一步是添加线程组元件。线程组告诉JMeter你想要模拟的用户数,用户多久发送一次请求,它们发送多少请求。
接着首先选择测试计划添加线程组元件,单击鼠标右键得到Add菜单,并且选择Add --> ThreadGroup。
你现在可以在测试计划下看到线程组元件。如果看不到这个元件,然后通过单击测试计划元件"展开"测试计划树。
下一步,你需要修改默认属性。如果你没有选择在树中的线程组,就选择它。你现在可以在JMeter窗口右部分看到线程组控制面板(见下12.1)。
图12.1 具有默认值的线程组
开始为线程组提供一个更有描述性的名字。在这个name文本域,输入Subscribers。
下一步,增加用户数(叫做线程)到5.
在下一个文本域——Ramp-UP Period,使用默认值0秒。这个属性告诉JMeter启动每个用户之间的时间间隔。例如,你输入Ramp-Up Period 为五秒,JMeter将会在最后5秒结束前启动所有你的用户。所以,如果我们有5个用户和一个5秒的Ramp-Up Period,那么启动用户的延迟就是1秒(5用户/5秒=1用户每秒)。如果你设置为那个值为零,那么JMeter将会立刻启动所以你的用户。
最后,清除标为"Forever"的复选框,并且在循环次数文本域中输入2。这个属性告诉JMeter重复你的测试的次数。如果你输入循环次数为0,那么JMeter将会运行你的测试一次。为了让JMeter重复运行你的测试计划,选择Forever复选框。
在大部分应用程序中,你必须在控制面板中手工改变。然而,在JMeter中,控制面板中自动接受你做的改变。如果你修改元件名,这个树会在你离开控制面板前自动使用新的文本更新这个树(例如,当你选择另一个树元件时)。 |
12.2添加JMS订阅者和发布者
确认在JMeter的lib文件夹下有需要的jar包。如果没有,关闭JMeter,拷贝jar文件过去,重启JMeter。
开始添加JMS Subscriber取样器到Jakarta Users元件(Add --> Sampler --> JMS Subscriber)。然后,在树中选择JMS Subscriber元件,并且编辑下列属性:
- 改变Name域为"sample subscriber"
- 如果JMS提供者使用jndi.properties,选择这个复选框
- 输入InitialContextFactory的类名
- 输入提供者URL,
- 输入连接工厂名。请参考JMS提供者的文档信息
- 输入消息主题名
- 如果JMS提供者需要认证,选择"required"并且输入用户名和密码。例如,Orion JMS需要认证,然而ActiveMQ和MQSeries不需要
- "ActiveMQ and MQSeries"中输入10.因为性能原因,the sampler will aggregate messages, since small messages will arrive very quickly. If the sampler didn't aggregate the messages, JMeter wouldn't be able to keep up.
- 如果你需要读取响应,选择这个复选框
- There are two client implementations for subscribers. If the JMS provider exhibits zombie threads with one client, try the other.
图12.2 JMS Subscriber
- 改变Name域为"sample publisher"
- 如果JMS提供者使用jndi.properties,选择这个复选框
- 输入InitialContextFactory的类名
- 输入提供者URL,
- 输入连接工厂名。请参考JMS提供者的文档信息
- 输入消息主题名
- 如果JMS提供者需要认证,选择"required"并且输入用户名和密码。例如,Orion JMS需要认证,然而ActiveMQ和MQSeries不需要
- "ActiveMQ and MQSeries"中输入10.因为性能原因,the sampler will aggregate messages, since small messages will arrive very quickly. If the sampler didn't aggregate the messages, JMeter wouldn't be able to keep up.
- Select the appropriate configuration for getting the message to publish. If you want the sampler to randomly select the message, place the messages in a directory and select the directory using browse.
- Select the message type. If the message is in object format, make sure the message is generated correctly.
图12.3. JMS Publisher
12.3添加一个监听器浏览/保存测试结果
你需要添加到你测试计划的最后元件是一个监听器。这个元件责任是储存所有你的HTTP请求结果到文件,并且展示一个可视数据模型。
选择Jakarta Users元件,添加一个Graph Resultsr监听器(Add --> Listener --> Graph Results)。 Next, you need to specify a directory and filename of the output file. You can either type it into the filename field, or select the Browse button and browse to a directory and then enter a filename.
图12.4 Graph Results监听器
12.4保存测试计划
虽然它不是需要的,但是我们推荐你在运行前保存测试计划到一个文件。为了保存测试计划,从File菜单选择Save Test Plan(使用最新版本,它不再需要首先选择测试计划元件)。
JMeter允许你保存这个测试计划树或者其中一部分。为了仅保存在测试计划树上的特殊"分支",选择在树中用来启动"分支"的测试计划元件,然后右击在菜单项中选择"Save"。或者,选择合适测试计划元件,然后从Edit菜单选择Save。 |
12.5运行测试计划
从Run菜单,选择Run。
如果你测试正在运行,JMeter在右手上方的角落点燃一个绿正方形显示。当所有测试停止,那个方块变成灰色。即使你选择了"stop",绿光依然会继续停留,知道所有测试都已经停止。 |
一旦JMeter完成你的测试计划,从Run菜单选择Stop。
如果你在你的监听器中选择一个文件保存结果,然后你将有一个能够在任何可视化工具下打开的文件。
每一可视化工具会使用它自己的风格去显示结果。
如果可能在多个可视化工具中打开同一个文件。这是不是问题。JMeter会保证在测试运行期间没有取样会再次被记录于同一文件。
13构建一个监视器测试计划
在这一节,你讲学习如何创建一个测试计划来监视web服务器。监视器对一个压力测试和系统管理很有用。使用压力测试,监视器可以提供一些关于服务器 性能的附加信息。它也会使看出服务器性能和在客户端响应时间直接的关系更加容易。作为一个系统管理员工具,监视器提供很容易的方法从一个控制台监视多个服 务器。监视器被设计和Tomcat 5下的状态servlet一起运行。理论上说任何支持JMX(Java Management Extension)的servlet容器都可以指定状态servlet来提供同样的信息。
因为一些人要使用伴随其他servlet或者EJB容器的监视器,Tomcat的状态servlet将不要做任何修改工作在其他的容器来进行内存统计。为了得到线程信息,你将需要改变MBeanServer的查找来从新得到MBeans。
13.1添加一个服务器
第一步添加一个线程组元件。线程组告诉JMeter你想要模拟的用户数。因为使用JMeter作为监听器,所以总是为1.对于那些不熟悉服务器监视器的人这是非常重要的。作为一个一般规则,对于单个服务器使用多个线程是严重的并且会造成重大的压力。
继续进行,通过初次的选择测试计划添加线程组,单击鼠标右键得到添加菜单,然后选择添加-->线程组。
你现在应该在测试计划下看到线程组。如果你没有看到这个元件,那么通过单击测试计划元件展开测试计划树。
图10.1 使用默认值的线程组
输入服务器名。
13.2HTTP认证管理
添加HTTP授权管理器到线程组元件(添加-->HTTP授权管理器)。输入你的web服务器的用户名和密码。重要提示:监视器仅能工作于Tomcat5的5.0.19和更新版本。如何建立Tomcat的相关说明,情参考tomcat 5文档。
- 保持基础URL为空
- 输入用户名
- 输入密码
13.3添加HTTP请求
添加HTTP请求到线程组元件(添加-->取样器-->HTTP请求)。然后,在树中选择HTTp请求元件,并编辑下列属性:
- 修改名称域为"Server Status"
- 输入IP地址和主机名
- 输入端口号
- 如果使用Tomcat,设置Path域为"/manager/status"
- 添加名为大写的"XML"请求参数,给它一个小写的"true"值
- 选择取样器的底部"Use as Monitor"
13.4添加固定定时器
添加一个定时器到这个线程组(添加-->定时器-->固定定时器)。在"线程延迟"方框输入5000毫秒。一般使用间隔少于5秒会给你服务器添加压力。在你在你的产品环境部署监视器前找出一个可接受的间隔。
13.5添加一个监听器保存测试结果
如果你想保存来自服务器的结果,添加一个简单的数据监听器。如果你想保存计算的统计表,在监听器输入一个文件名。如果你想保存产生数据和统计表,确认你使用不同的文件名。
选择线程组元件,添加一个简单数据记录器监听器(添加-->监听器-->简单数据记录器)。下一步,你需要指定一个目录和一个输出文件文件名。你可以在文件名域输入它,也可以选择浏览按钮,浏览一个目录,然后加入一个文件名。
13.6添加监视器结果
通过选择测试计划元件添加监听器(添加-->监听器-->监视器结果)。在监视器结果监听器中有两个tab。第一个是"健康",它显示了监视器受到的最后取样的状态。第二个tab是"性能",它显示了服务器性能的历史视图。
一个关于健康情况的快速注释会被计算出来。典型地,一个服务器内存用完或者达到最大线程数,它就要崩溃。如果是Tomcat 5,一旦线程到达最大,请求将被放置到一个队列直到一个线程可用。在容器之间线程关系的重要性改变很大,所以现在使用50/50的实现更加保守。一个更加 有效管理线程的容器可能看不到任何性能的下降,但是使用的内存也肯定会显示一些影响。
性能图像显示为不同的线条。空闲内存线显示在当前已分配存储块剩余多少空闲内存。Tomcat 5返回最大内存,但是它没有被绘制。在一个调试好的环境,服务器应该从不达到最大内存。
注意在图形的两边都有标题。在左边是百分比,右边是死亡/健康。如果内存线尖峰上升和下降迅速,它可能指示memory thrashing。在其它情况,使用Borland OptimizeIt或者JProbe是一个好方法。你想看到的是对于负载,内存和线程的一个规则的图案。任何不确定路线的状态常常都预示了不良的性能或 者某个种类的一个bug。
13.7保存测试计划
虽然它不是需要的,但是我们推荐你在运行前保存测试计划到一个文件。为了保存测试计划,从文件菜单选择保存测试计划(使用最新版本,它不再需要首先选择测试计划元件)。
JMeter允许你保存这个测试计划树或者仅仅其中一部分。为了仅保存在测试计划树上的特殊"分支",选择在树中用来启动"分支"的测试计划元件,然后右击在菜单项中选择"保存"。或者,选择合适测试计划元件,然后从编辑菜单选择保存。 |
13.8运行测试计划
从运行菜单,选择运行。
如果你测试正在运行,JMeter在右手上方的角落点亮一个绿正方形显示。当所有测试停止,那个方块变成灰色。即使你选择了"停止",绿光依然会继续持续,直到所有测试都已经退出。 |
一旦JMeter完成你的测试计划,从运行菜单选择停止。
如果你在监听器中选择一个文件保存结果,那么你将会有一个能够在任何visualizer中打开的文件。每个visualizer以它们自己的风格显示结果。
有可能会在多于一个的visualizer中打开同一个文件。这是没有问题的。JMeter会确保在测试运行时没有取样器记录到同一文件多于一次。 |
14.监听器介绍
监听器是显示取样器结果的组件。结果可以显示在树、表格、图表或者简单的写入一个日志文件。为了观察来自提供的取样器的响应内容,可以添加"观察结果树"或者"在表格观察结果"监听器到测试计划。为了图形化观察响应时间,可以添加图形结果
不同的监听器使用不同的方法显示响应信息。然而,如果他们其中一个被指点,他们所有使用相同的原始数据写入到输出文件。 |
"配置"按钮可以指定那些域被写入文件,和是否把它作为一个CSV或者XML文件。CSV文件比XML文件小得多,所有如果产生大量的取样建议使用CSV文件。
如果你仅期望记录某几个取样,可以添加监听器作为取样器的一个子节点。或者你可以使用简单控制器去组织取样器集,并且添加监听器到那个控制器。相同的文件可以被多个取样器使用-但是确定它们都使用相同的配置!
14.1屏幕捕获
JMeter能够保存任何监听器作为一个PNG文件。在左边的面板选择监听器。单击edit -> Save As Image
图1-Edit -> Save As Image
14.2非GUI测试运行
当在非GUI模式运行时,使用-l标志为测试运行创建一个*监听器。
14.3资源使用
监听器。为了最小的资源使用,删除所有的监听器,并且使用-l标志运行测试在非GUI模式来定义仅一个监听器。这样在测试完成之后日志文件可以被重新读取到一个监听器。
14.4CSV日志格式
CSV日志格式依赖于在配置中被选择的数据项。仅那些指定的数据项被记录在文件。列的表现顺序是固定的,如下:
*时间标志-自从1970-1-1的毫秒数
*用时-毫秒
*标签-取样器标签
*响应代码-例如200、404
*响应消息-例如OK
*线程名
*数据类型
*成功与否-true或者false
*失败消息-如果要的话
*字节数-在取样中的字节数
*URL
XML文件格式如下:
14.6XML日志格式2.0
原始XML(2.0)格式如下(转行可以不相同):
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
<sampleResult timeStamp="1144365463297" dataType="text" threadName="Listen 1-1" label="HTTP Request" time="1502" responseMessage="OK" responseCode="200" success="true">
<sampleResult timeStamp="1144365464238" dataType="text" threadName="Listen 1-1" label="http://www.apache.org/style/style.css" time="171" responseMessage="OK" responseCode="200" success="true">
<property xml:space="preserve" name="samplerData">
GET http://www.apache.org/style/style.css
</property>
<binary>
body, td, th {
font-size: 95%;
font-family: Arial, Geneva, Helvetica, sans-serif;
color: black;
}
...
</binary>
</sampleResult>
</sampleResult>
...
</testResults>
14.6XML日志格式2.1
更新的XML(2.1)格式如下(转行可以不相同):
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
-- HTTP Sample, with nested samples
<httpSample t="1392" lt="351" ts="1144371014619" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Listen 1-1" dt="text" de="iso-8859-1" by="12407">
<httpSample t="170" lt="170" ts="1144371015471" s="true" lb="http://www.apache.org/style/style.css" rc="200" rm="OK" tn="Listen 1-1" dt="text" de="ISO-8859-1" by="1002">
<responseHeader class="java.lang.String">HTTP/1.1 200 OK
Date: Fri, 07 Apr 2006 00:50:14 GMT
...
Content-Type: text/css
</responseHeader>
<requestHeader class="java.lang.String">MyHeader: MyValue</requestHeader>
<responseData class="java.lang.String">body, td, th {
font-size: 95%;
font-family: Arial, Geneva, Helvetica, sans-serif;
color: black;
}
...
</responseData>
<cookies class="java.lang.String"></cookies>
<method class="java.lang.String">GET</method>
<queryString class="java.lang.String"></queryString>
<url>http://www.apache.org/style/style.css</url>
</httpSample>
<httpSample t="200" lt="180" ts="1144371015641" s="true" lb="http://www.apache.org/images/asf_logo_wide.gif" rc="200" rm="OK" tn="Listen 1-1" dt="bin" de="ISO-8859-1" by="5866">
<responseHeader class="java.lang.String">HTTP/1.1 200 OK
Date: Fri, 07 Apr 2006 00:50:14 GMT
...
Content-Type: image/gif
</responseHeader>
<requestHeader class="java.lang.String">MyHeader: MyValue</requestHeader>
<responseData class="java.lang.String">http://www.apache.org/images/asf_logo_wide.gif</responseData>
<responseFile class="java.lang.String">Mixed1.html</responseFile>
<cookies class="java.lang.String"></cookies>
<method class="java.lang.String">GET</method>
<queryString class="java.lang.String"></queryString>
<url>http://www.apache.org/images/asf_logo_wide.gif</url>
</httpSample>
<responseHeader class="java.lang.String">HTTP/1.1 200 OK
Date: Fri, 07 Apr 2006 00:50:13 GMT
...
Content-Type: text/html; charset=ISO-8859-1
</responseHeader>
<requestHeader class="java.lang.String">MyHeader: MyValue</requestHeader>
<responseData class="java.lang.String">
...
<html>
<head>
...
</head>
<body>
...
</body>
</html>
</responseData>
<cookies class="java.lang.String"></cookies>
<method class="java.lang.String">GET</method>
<queryString class="java.lang.String"></queryString>
<url>http://www.apache.org/</url>
</httpSample>
-- nonHTTPP Sample
<sample t="0" lt="0" ts="1144372616082" s="true" lb="Example Sampler" rc="200" rm="OK" tn="Listen 1-1" dt="text" de="ISO-8859-1" by="10">
<responseHeader class="java.lang.String"></responseHeader>
<requestHeader class="java.lang.String"></requestHeader>
<responseData class="java.lang.String">Listen 1-1</responseData>
<responseFile class="java.lang.String">Mixed2.unknown</responseFile>
<samplerData class="java.lang.String">ssssss</samplerData>
</sample>
</testResults>
取样节点名字可以是"sample"或者"httpSample"。 |
14.7 Sample Attributes
取样器属性意义如下:
属性 |
内容 |
by |
字节数 |
de |
数据编码 |
dt |
数据类型 |
ec |
Error count (0 or 1, unless multiple samples are aggregated) |
hn |
Hostname where the sample was generated |
lb |
标签 |
lt |
延时(ms)-不是所有的取样器支持这个 |
na |
所有线程组中的活跃线程数 |
ng |
在这个线程组中活跃的线程数 |
rc |
响应代码 |
rm |
响应消息 |
s |
是否成功 |
sc |
Sample count (1, unless multiple samples are aggregated) |
t |
用时(ms) |
tn |
线程名 |
ts |
时间标志 |
varname |
Value of the named variable (versions of JMeter after 2.3.1) |
JMeter2.1和2.1.1版本保存响应代码为"rs",但是读取它期望是"rc"。这个bug已经被修复,所以为"rc";"rc"或者"rs"都可以被读取。
Versions of JMeter after 2.3.1 allow additional variables to be saved with the test plan. Currently, the variables are saved as additional attributes. The testplan variable name is used as the attribute name. |
14.8保存响应数据
像上面展示的那样,如果需要响应数据可以被保存为XML日志文件。然而,这将使文件相当大,并且文本必须被编码才可以被安静的验证XML。同样图片不会被包括。
另一个解决方案是使用后置处理器保存响应结果到文件。这样为每个取样产生一个新的文件,并且保存文件为取样器名。文件名会被包含在一个取样日志输入。当取样日志文件被加载时如果需要数据将从文件从新得到。
14.9Loading (reading) response data
To view an existing results file, you can use the File "Browse..." button to select a file. If necessary, just create a dummy testplan with the appropriate Listener in it.
Results can be read from XML or CSV format files. When reading from CSV results files, the header (if present) is used to determine which fields were saved. In order to interpret a header-less CSV file correctly, the appropriate JMeter properties must be set.
15. 远程测试
如果你的JMeter客户机不可能高效的模拟充足的用户加压力到你服务器,an option exists to control multiple, remote JMeter engines from a single JMeter GUI client。通过远程运行JMeter,你可以跨越很多低配置的电脑复制一个测试,并在服务器模拟一个大的负载。一个JMeter GUI客户端实例能够控制任何多个远程JMeter实例,并从它们收集所有的数据。这种方法有如下特性:
- 保存测试取样到一个本地机器
- 从单个机器管理多个JMeter引擎。
注意当你在你的应用程序服务器上真正执行JMeter引擎时,你需要注意这样一个事实。这就是它将会在应用程序服务器添加处理开销,所以你的测试结 果会稍微收到影响。推荐的方法是在同一个以太网段有一个或者多个机器作为你要配置运行JMeter引擎的应用程序服务器。这将在没有影响应用程序性能的前 提下最小化网络在测试结果中的影响。
第一步:启动服务器
为了在远程节点运行JMeter,通过运行 JMETER_HOME/bin/jmeter-server (unix)或者JMETER_HOME/bin/jmeter-server.bat (windows)脚本在你希望运行的所有机器上启动JMeter服务器组件。
第二步:添加服务器IP到你的客户端配置文件
在JMeter控制机上编辑配置文件。在/bin/jmeter.properties文件中找到属性"remote_hosts",并添加你运行的JMeter服务器的IP。添加多个服务器,逗号分隔。
注意你可以使用-J命令行参数来指定远程计算机。例如:
jmeter -Jremote_hosts=host1,127.0.0.1,host2
第三步:启动JMeter客户端
现在你准备启动JMeter
15.2 技巧
如果你运行Suse Linux,这些技巧会有帮助。默认安装会启用防火墙。如果那样的话,远程测试会不能完全工作。下列技巧是由Sergey Ten贡献。
如果你看到连接被拒绝,通过下列参数开启调试。
15.3 使用不同的端口
默认,JMeter使用标准的RMI端口1099。可能需要改变它。为了这样工作成功,所有下列需要保持一致:
- 在服务器,使用新的端口数启动rmiregistry
- 在服务器,启动JMeter时指定server_port
- 在客户端,更新remote_hosts属性包含新的远程主机:端口设置
自从JMeter2.1.1以后,jmeter-server脚本提供了更改端口支持。例如架设你想使用1664端口(可能1099已经被使用)。
在Windows下(在DOS窗口)
C:\JMETER> SET SERVER_PORT=1664
C:\JMETER> JMETER-SERVER [其他参数]
在Unix下
$ SERVER_PORT=1664 jmeter-server [其他参数]
[注意使用大写字母标示环境变量]
15.4 Using sample batching
Listeners in the test plan send their results back to the client JMeter which writes the results to the specified files By default, samples are sent back as they are generated. This can place a large load on the network and the JMeter client. There are some JMeter properties that can be set to alter this behaviour.
- mode - sample sending mode - default is Standard
- Standard - send samples as soon as they are generated
- Hold - hold samples in an array until the end of a run. This may use a lot of memory on the server.
- Batch - send saved samples when either the count or time exceeds a threshold
- Statistical - send a summary sample when either the count or time exceeds a threshold. The samples are summarised by thread group name and sample label. The following fields are accumulated:
- elapsed time
- latency
- bytes
- sample count
- error count
Other fields that vary between samples are lost.
The following properties apply to the Batch and Statistical modes:
- num_sample_threshold - number of samples in a batch (default 100)
- time_threshold - number of milliseconds to wait (default 60 seconds)
16.最佳实践
16.1 限制线程数
你的硬件能力会限制你有效运行JMeter的线程数。它也会依赖于你服务器的速度(一个更快的服务器因为它更加快速的返回一个请求所以会使 JMeter工作更加努力)。JMeter工作越多,它的时间信息就越不准确。JMeter做越多的动作,每个线程必须等待访问CPU的时间越长,定时信 息越长。如果你需要大规模的负载测试,考虑在多个机器上运行多个非用户界面的JMeter。
16.2 何处放置Cookie 管理器
见构建一个Web测试
16.3 何处放置授权管理器
见构建一个高级的Web测试
16.4 使用代理服务器
详细参见HTTP代理服务器设置代理服务器。要做的最重要的事是过滤你感兴趣的所有请求。例如,在记录图片请求方面并没有观点(JMeter被致使 下载一个页面的所有图片-见HTTP请求)。这些仅仅会能乱你的测试计划。大多数可能,所有你的文件共享一个扩展,例 如.jsp,.asp,.php,.html或者相似的。你应该通过输入".\jsp"作为一个"Include Pattern"包含这些。
另外,你可以通过输入".\gif"作为一个"Exclude Pattern"。依赖于你的应用程序,这可能是个好方法,也可能不是。你可能也必须包含样式表,javascript文件和其他包含文件。测试你的设置来验证你记录的是你想要的,然后清楚,重新启动。
The Proxy Server expects to find a ThreadGroup element with a Recording Controller under it where it will record HTTP Requests to. This conveniently packages all your samples under one controller, which can be given a name that describes the test case.
现在,经历测试用力的几步。如果你有一个以前定义的测试用力,使用JMeter记录你的行为来定义你的测试用例。一旦你完成一个明确步骤系列,使用一个适当的命名文件保存这个测试用例。然后,
代理服务器软件一个最实用的特性是你可以从被记录的取样中提取出某些通用的元件。通过在测试计划级别或者用户自定义变量元件中定义一些自定义变量, 你可以让JMeter在你记录的取样中自动的替换那些值。举例来说,如果你在服务器"xxx.yyy.com",测试一个应用,那么你可以使 用"xxx.yyy.com"定义一个变量叫做"server",然后在你记录的取样那个值被发现的任何地方都会被替换为"${server}"。
16.5 用户变量
一些测试计划需要为不同的用户/线程使用不同的值。例如,你可能想要测试一个为每个用户指定一个唯一的登录序列。这通过JMeter提供的设备很容易完成。
例如:
- 创建一个包含用户名和密码的文本文件,以逗号分隔。把这个文件放到你的测试计划的相同目录
- 添加一个CSV数据集配置元件到测试计划。创建USER和PASS变量
- 在设当的取样器使用${USER}替代登录名,使用${PASS}替代密码
CSV数据集元件会为每个线程读取一个新行。
16.6 减少资源需求
减少资源使用的一些建议:
- 使用非用户界面模式:jmeter -n -t test.jmx -l test.jtl
- 尽可能少的使用监听器;如果使用-l标志
- 不要使用函数模式
- 使用CSV输出而不是XML
- 仅保存你需要的数据
- 尽可能少的使用断言
16.7 BeanShell 服务器
BeanShell 拦截器有一个非常有用的特性——它扮演一个很容易通过telnet或者http访问的服务器
那是不安全的。连接到那个端口的任何人都可以发出任何BeanShell命令。这能够提供无限制的访问JMeter应用程序和主机。*如果那些端口不是受保护拒绝访问不要允许这个服务器。 |
如果你想使用这个服务器,在jmeter.properties文件定义下列属性:
beanshell.server.port=9000
beanshell.server.file=../extras/startup.bsh
在上面的例子中,服务器会被启动,并且监听9000和9001端口。9000端口会用来为http访问。9001端口会用来为telnet访问。 startup.bsh文件会通过服务器处理,并且可以用来定义各种函数和启动变量。startup文件为设置和打印JMeter和系统属性定义方法。这 是你将在JMeter控制台看到的:
Startup script running
Startup script completed
Httpd started on port: 9000
Sessiond started on port: 9001
作为一个实际例子,假设你有一个在非图形界面模式长期运行的JMeter,并且你想在测试中改变多个时间的吞吐量。测试计划包含了一个不变的吞吐量定时器,它定义了一个期限属性,例如${__P(throughput)}。下列BeanShell命令可以用来改变测试:
printprop("throughput");
curr=Integer.decode(args[0]); // 起始值Start value
inc=Integer.decode(args[1]); // 增量Increment
end=Integer.decode(args[2]); // 最终值Final value
secs=Integer.decode(args[3]); // 改变等待Wait between changes
while(curr <= end){
setprop("throughput",curr.toString()); // Needs to be a string here
Thread.sleep(secs*1000);
curr += inc;
}
printprop("throughput");
这个脚本可以存储到一个文件(throughput.bsh)的话,使用bshclient.jar发送到服务器。例如:
java -jar ../lib/bshclient.jar localhost 9000 throughput.bsh 70 5 100 60
16.8 BeanShell scripting
16.8.1 Overview
Each BeanShell test element has its own copy of the interpreter (for each thread). If the test element is repeatedly called, e.g. within a loop, then the interpreter is retained between invocations unless the "Reset bsh.Interpreter before each call" option is selected.
Some long-running tests may cause the interpreter to use lots of memory; if this is the case try using the reset option.
You can test BeanShell scripts outside JMeter by using the command-line interpreter:
$ java -cp bsh-xxx.jar[;other jars as needed] bsh.Interperter file.bsh [parameters]
or
$ java -cp bsh-xxx.jar bsh.Interperter
bsh% source("file.bsh");
bsh% exit(); // or use EOF key (e.g. ^Z or ^D)
16.8.2 Sharing Variables
Variables can be defined in startup (initialisation) scripts. These will be retained across invocations of the test element, unless the reset option is used.\
Scripts can also access JMeter variables using the get() and put() methods of the "vars" variable, for example: vars.get("HOST"); vars.put("MSG","Successful"); . The get() and put() methods only support variables with String values, but there are also getObject() and putObject() methods which can be used for arbitrary objects. JMeter variables are local to a thread, but can be used by all test elements (not just Beanshell).
If you need to share variables between threads, then JMeter properties can be used:
import org.apache.jmeter.util.JMeterUtils;
String value=JMeterUtils.getPropDefault("name","");
JMeterUtils.setProperty("name", "value");
The sample .bshrc files contain sample definitions of getprop() and setprop() methods.
Another possible method of sharing variables is to use the "bsh.shared" shared namespace. For example:
if (bsh.shared.myObj == void)
Unknown macro: { // not yet defined, so create it}
bsh.shared.myObj.process();
Rather than creating the object in the test element, it can be created in the startup file defined by the JMeter property "beanshell.init.file". This is only processed once.
17.求助!我的老板让我负担测试我们的web应用程序
这是一个相当开放的命题。首先有很多问题要问,另外还有一些必须的资源。你会需要一些硬件运行基准/负载测试。许多工具证明是有用的。可以考虑一些产品。最后,为什么Java是实现负载测试/基准产品的一个好选择。
17.1 要问的问题
我们预期的平均用户数(正常负载)是多少?
我们预期的峰值用户数是多少?
什么时候压力测试你应用程序是个好时间(例如,下班时间或者每个周末),记住这可能彻底崩溃你们一个或多个服务器?
我们侧应用程序是否有状态?如果是这样,你的应用程序如何管理它(cookies,session重写,或者其他方法)?
17.2 资源
下列资源会非常有用。记住如果你不定位这些资源,你将成为这些资源。As you already have your work cut out for you, it is worth knowing who the following people are, so that you can ask them for help if you need it.
17.2.1 网络
谁熟悉我们的网络技术?如果你遇到任何防火墙或者代理问题,这会变的很重要。一个专用测试网络(那会有一个非常低的网络延迟)是非常好的事情。知道谁可以为你设立一个是非常有用的(如果你感觉这是必须的)。如果应用程序不能预期测量,谁可以添加额外的硬件?
17.2.2 应用程序
谁知道应用程序的功能如何?正常顺序是
- 测试(低尺度--我们可以基准测试我们应用程序?)
- 基准测试(平均用户数)
- 负载测试(最大用户数)
- 破坏测试(最大极限是多少?)
测试过程可以从黑盒测试到白盒测试(不同点是第一个不需要应用程序知识[所以称为"黑河"],然而第二个需要应用程序知识)进行。在这个过程不难发现应用程序的问题,所以它准备否定你的工作。
17.3 我应该使用什么平台运行基准测试/负载测试?
这应该是一块普遍使用的有一个标准的(例如vanilla)软件安装硬件。记住,如果你公布你们结果,你的客户会做的第一件事雇佣一个研究生验证它 们。You might as well make it as easy for this person as you possibly can.
对于Windows,Windows XP Professional应该是最小的(其它的不支持多线程超过50-60个连接,你可能期望比那更多的用户)。
非常好的免费平台包括linux,BSD和Solaris Intel。如果你有跟多一点钱,还有一些商业的linux。如果你能适应它,一个商业的Unix(Solaris等)可能是最好的选择。
For non-Windows platforms, investigate "ulimit -n unlimited" with a view to including it in your user account startup scripts (.bashrc or .cshrc scripts for the testing account).
如果你进行更高尺度的基准测试/压力测试,这个平台会成为限制因素。所以使用你们可用的最好的硬件和软件是有价值。记得在你公布基准测试时包括硬件/软件配置。
不要忘记JMeter的批处理模式。如果你有一个服务器,它支持Java但可能没有一个快的绘图实现,或者你需要远程登录,这会是有用的。批处理模 式相比远程显示或者客户端-服务器模式可以减少网络流量。批处理文件可以被加载到工作站的JMeter来分析,或者你可以使用CSV输出和输入数据到电子 表格。
17.4 工具
下列工具会都很有用。熟悉它们将会很有用的。这应该包括实验它们,并阅读适当的文档(man-pages, info-files, application --help messages和任何提供的文档)。
17.4.1 ping
它常用来确定你是否你个到达目标站点。Options can be specified so that 'ping' provides the same type of route reporting as 'traceroute'.
17.4.2 nslookup/dig
当用户通常会使用一个人们易读的网络地址,但是你可能希望当执行基准测试/压力测试时避免DNS查找的开销。这就用来确定你目标站点的唯一地址(IP地址)。
17.4.3 traceroute
如果你不能"ping"通你的目标站点,这个命令多半可以用来确定问题(可能是防火墙或者代理)。它也可以用来估算整个网络延时(本地运行应该给出最小可能网络延迟-记住你的用户运行的将会是一个繁忙的Internet)。通常,跳跃越少越好。
17.5 其他产品还有什么?
有很多商业的产品,但都有相当高的价格。如果你可以适应它,这或许也是可以走的路线。如果那些产品不能做你想要的,或者你限制在一个预算,下列工具就值得一看。事实上,你或许应该开始试试Apache ab工具,如果你的需求不是特别的复杂它可以很好的工作。
17.5.1 Apache 'ab'工具
你应该明确从使用这个开始。它很好的处理HTTP 'get'请求,做一点工作也可以处理HTTP 'post'请求。它用'C'语言写的,它运行的非常好,并且提供很好的性能报告(if basic)。
17.5.2 HttpUnit
这个工具值得一看。它是一个用来执行HTTP测试/基准测试的类库(因此更值得开发人员关注)。它想要用来连同JUnit代替web浏览器(因此是非GUI的)。
17.5.3 微软WAS
这个工具也很值得一看。它有一个优秀的用户界面,但是它也许不能完全做你想做的。If this is the case, be aware that the functionality of this product is not likely to change.
17.5.4 JMeter
如果你有非标准的需求,那么这个解决方案提供了以开源社区来提供它们(当然,如果你正在阅读这个文档,你可能已经热衷于这个工具)。这个产品免费和你的需求一起进行。
17.6 为什么是Java?
为什么不是Perl或者C?
Perl多半是一个很好的选择,只可惜基准程序包似乎给出相当模糊的结果。还有,使用Perl模拟多个用户是一个很棘手的问题(多连接可以通过从一 个shell脚本分支多个进程模拟,但是那些都不是线程,它们是进程)。然而,Perl社区是很强大的。如果你发现某个东西已经写了一些好像有用的东西, 这可能是一个很好的解决方案。
C,当然是一个很好的选择(check out the Apache ab tool)。但是你需要准备所有测试你应用程序需要的常规网络,线程,状态管理码。
Java给你了(免费)你应用程序需要的常规网络,线程,状态管理码。Java有HTTP,FTP和HTTPS-也有RMI,IIOP和JDBC(没有提到cookies,URL编码和URL重定向)。另外Java提供了自动化垃圾回收和字节码安全。
And once Microsoft moves to a CLR (common language run-time) a Windows Java solution will not be any slower than any other type of solution on the Windows platform.
18 组件参考
18.1 Samplers
- FTP Request
- HTTP Request
- JDBC Request
- Java Request
- SOAP/XML-RPC Request
- WebService(SOAP) Request
- LDAP Request
- LDAP Extended Request
- Access Log Sampler
- BeanShell Sampler
- BSF Sampler
- TCP Sampler
- JMS Publisher
- JMS Subscriber
- JMS Point-to-Point
- JUnit Request
- Mail Reader Sampler
- Test Action
- 18.2 Logic Controllers
- Simple Controller
- Loop Controller
- Once Only Controller
- Interleave Controller
- Random Controller
- Random Order Controller
- Throughput Controller
- Runtime Controller
- If Controller
- While Controller
- Switch Controller
- ForEach Controller
- Module Controller
- Include Controller
- Transaction Controller
- Recording Controller
- 18.3 Listeners
- Sample Result Save Configuration
- Graph Full Results
- Graph Results
- Spline Visualizer
- Assertion Results
- View Results Tree
- Aggregate ReportO
- View Results in Table
- Simple Data Writer
- Monitor Results
- Distribution Graph (alpha)
- Aggregate Graph
- Mailer Visualizer
- BeanShell Listener
- Summary Report
- 18.4 Configuration Elements
- CSV Data Set Config
- FTP Request Defaults
- HTTP Authorization Manager
- HTTP Cache Manager
- HTTP Cookie Manager
- HTTP Request Defaults
- HTTP Header Manager
- Java Request Defaults
- JDBC Connection Configuration
- Login Config Element
- LDAP Request Defaults
- LDAP Extended Request Defaults
- TCP Sampler Config
- User Defined Variables
- Simple Config Element
- 18.5 Assertions
- Response Assertion
- Duration Assertion
- Size Assertion
- XML Assertion
- BeanShell Assertion
- MD5Hex Assertion
- HTML Assertion
- XPath Assertion
- XML Schema Assertion
- BSF Assertion
- 18.6 Timers
- Constant Timer
- Gaussian Random Timer
- Uniform Random Timer
- Constant Throughput Timer
- Synchronizing Timer
- BeanShell Timer
- 18.7 Pre Processors
- HTML Link Parser
- HTTP URL Re-writing Modifier
- HTML Parameter Mask
- HTTP User Parameter Modifier
- User Parameters
- Counter
- BeanShell PreProcessor
- BSF PreProcessor
- 18.8 Post-Processors
- Regular Expression Extractor
- XPath Extractor
- Result Status Action Handler
- Save Responses to a file
- Generate Summary Results
- BeanShell PostProcessor
- BSF PostProcessor
- 18.9 Miscellaneous Features
- Test Plan
- Thread Group
- WorkBench
- SSL Manager
- HTTP Proxy Server
- HTTP Mirror Server
- Property Display
- Debug Sampler
- Debug PostProcessor
- 18.10 Reports
- Report Plan
- Report Table
- HTML Report Writer
- Report Page
- Line Graph
- Bar Chart
19. 函数
JMeter函数是一些能够转化在测试树中取样器或者其他配置元件的域的特殊值。一个函数调用就像这样:
${__functionName(var1,var2,var3)}
"__functionName"匹配函数名。
圆括号周围设置函数的参数,例如${__time(YMD)}实际参数因函数而不同。不需要参数的函数使圆括号内
为空,例如${__threadNum}。
函数列表:
- regexFunction - 正则表达式计数器
- counter
- threadNum - 得到线程数
- intSum - 添加变量
- StringFromFile - 从文件读取一行
- machineName - 得到本地计算机名
- JavaScript (Apache Rhino)
- random number
- CSVRead - 从CSV文件读取
- 读取一个属性
- P - 读取一个属性
- setProperty - 设置一个属性
- log - 记录一个日志
- logn - 记录一个日志
- BeanShell - 运行BeanShell
- split - 分隔一个字符串为变量
- XPath - 使用一个xpath表达式
- time - 返回一些格式的当前时间
- jexl - 执行一个jexl表达式
19.1 函数可以做什么
有两类函数:自定义静态值(或者变量),和内置函数。
自定义静态值允许当一个测试树编译并且提交运行时自定义变量被它们的静态值代替。这个替代在测试运行开始时发生一次。这可以用来替换所有HTTP请求中的 DOMAIN域 ,例如 - 做一个简单的问题来使用同样的测试改变for example - making it a simple matter to change a test to target a different server with the same test.
这用不使用函数的替代是可能的,但是不方便而且intuitive。它需要用户创建默认配置元件来填充取样器空值。自定义函数允许one to replace only part of any given value, not just filling in blank values. 使用内建的函数用户可以计算基于在运行时前一个相应数据的新值, which thread the function is in, the time,and many other sources. These values are generated fresh for every request throughout the course of the test.
函数在线程之间是共享的。在测试计划中每个函数调用是被一个单独函数实例调用的。 |
19.2 函数被用来做什么
一个用户自定义函数可以写在任何测试组件的任何域中。一些域不允许随机字符串,因为他们期望数字,然而不期望一个函数。 然而,大多数域会允许函数。内建的函数允许写进任何非控制器测试组件的任何域。 这包含取样器,定时器,监听器,修改器,断言,前置处理器,后置处理器和配置元件。
当使用变量/函数When using variable/function references in SQL code (etc), remember to include any |
19.3 书写函数字符串
自定义函数使用这种格式: ${varName} . 在测试计划树元件中,一个自定义值两列的表格a two-column table of user-defined values is kept, matching up variable names with static values. Referencing the variable in a test element is done by bracketing the variable name with '${' and '}'.
内建函数使用同样的风格书写,但惯例,内建参数以"__"开始来避免和用户值名*冲突。一些函数使用参数配置它们,并且包含在括弧内,以逗号分隔。 如果函数没有参数,括弧可以省略。 A further complication for argument values that themselves contain commas is that the value should be escaped as necessary. Thus, if you need to include a comma in your parameter value, escape it like so: '\,'.
JMeter提供了一个工具来帮助你使用各种内建函数构建函数调用,然后你可以拷贝粘贴。 It will not automatically escape values for you, since functions can be parameters to other functions, and you should only escape values you intend as literal.
* 如果你使用和内建函数同样的名字定义一个自定义变量,你的静态变量会覆盖内建函数。 |
19.4 函数助手对话框
函数助手对话框从JMeter工具菜单中是可用的。
函数助手对话框
使用函数助手,你可以从下拉中选择一个函数,并赋予值。
对于它的参数,表格的左列提供了简短的参数描述,右边的列是你为那个参数填写的值。不同的函数使用不同的参数。
当你完成这些,点击"生成"按钮,适当的字符串就生成出来了,你可以拷贝粘贴到你喜欢的测试计划中。
19.5 函数
19.5.1__regexFunction
正则函数用来解析使用任何正则表达式的前响应(通过用户提供)。这个函数返回使用填充的变量值的模板字符串。
__regexFunction存储值以备以后使用。在第六个参数中,你可以指定一个参考名。在以后这个函数执行时,同样的值会在稍后使用自定义值规则时被得到。例如,如果你输入"refName"作为第六个参数,你将可以这样使用:
- ${refName} to refer to the computed result of the second parameter ("Template for the replacement string") parsed by this function
- ${refName_g0} to refer to the entire match parsed by this function.
- ${refName_g1} to refer to the first group parsed by this function.
- ${refName_g#} to refer to the n th group parsed by this function.
- ${refName_matchNr} to refer to the number of groups found by this function.
参数
属性 |
描述 |
是否需要 |
第一个参数 |
第一个参数使用应用于响应数据的正则表达式。It will grab all matches. Any parts of this expression that you wish to use in your template string, be sure to surround in parentheses. Example: <a href="(.)">. This will grab the value of the link and store it as the first group (there is only 1 group). Another example: <input type="hidden" name="(.)" value="(.*)">. This will grab the name as the first group, and the value as the second group. These values can be used in your template string |
Yes |
Second argument |
This is the template string that will replace the function at run-time. To refer to a group captured in the regular expression, use the syntax: $[group_number]$. Ie: $1$, or $2$. Your template can be any string. |
Yes |
Third argument |
The third argument tells JMeter which match to use. Your regular expression might find numerous matches. You have four choices:
|
No, default=1 |
Fourth argument |
If 'ALL' was selected for the above argument value, then this argument will be inserted between each appended copy of the template value. |
No |
Fifth argument |
Default value returned if no match is found |
No |
Sixth argument |
A reference name for reusing the values parsed by this function. |
No |
Seventh argument |
Input variable name. If specified, then the value of the variable is used as the input instead of using the previous sample result. |
No |
19.5.2__counter
counter每次调用产生一个新数字,从1开始每次增加1。counter可以配置来保持单独模拟每个用户的值,或者对于所有的用户使用同一个 counter。如果每个用户的值是单独增加的,那在整个测试计划过程中就像记录数字迭代一样。一个全局的counter就像记录请求运行了多少次。
counter使用一个数字变量来计数,它有一个最大值2,147,483,647.
counter函数实例现在完全是单独的。[JMeter 2.1.1和较早版本使用一个固定的线程变量来保持跟踪每个用户的计数,所以多个counter函数操作同样的值。] 全局counter - "FALSE" - 通过每个counter实例单独维护。
属性
属性 |
描述 |
是否需要 |
第一个参数 |
TRUE 如果你希望每个模拟的用户的counter保持单独并分隔其他用户设为TRUE。 FALSE for a global counter. |
是 |
第二个参数 |
A reference name for reusing the value created by this function. |
No |
19.5.3__threadNum
thread number函数简单返回当前执行的线程数量。那些数字是单独的线程组,意味着从函数的视角来看线程组1的线程 #1和在另一个线程组的线程#1是不可区分的。
这个函数没有参数。
这个函数不可以运行在那些任何运行在一个单独线程的配置元件中(例如 自定义变量)。 Nor does it make sense to use it on the Test Plan. |
19.5.4a__intSum
intSum函数用来计算两个或者更多int值的和。
JMeter2.3.1或者更早版本需要被表现的参考名,这个参考名现在是可选的,但是它必须不是一个非法的整数 |
属性
属性 |
描述 |
是否需要 |
第一个参数 |
第一个int值。 |
是 |
第二个参数 |
第二个int值。 |
是 |
第n个参数 |
第n个int值。 |
否 |
最后一个参数 |
为通过这个函数计算的值重用的参考名。如果指定,参考名必须包含至少一个非数字字符,否则它将被作为另一个int值对待添加进去。 |
否 |
19.5.4b__longSum
longSum函数用来计算两个或者更多long值的和。
属性
属性 |
描述 |
是否需要 |
第一个参数 |
第一个long值。 |
是 |
第二个参数 |
第二个long值。 |
是 |
第n个参数 |
第n个long值。 |
否 |
最后一个参数 |
为通过这个函数计算的值重用的参考名。如果指定,参考名必须包含至少一个非数字字符,否则它将被作为另一个long值对待添加进去。 |
No |
19.5.5 __StringFromFile
StringFromFile函数用来从文本文件读取字符串。对于运行需要许多变量数据的测试非常有用。例如当测试一个银行程序时,100个或者1000个不同的帐号数字可能是需要的。
另见CSV测试配置元件,它很容易使用。然而,那个元件现在不支持多个输入文件。
每次调用,它会从文件读取下一行。当文件到达最后,它会从开头再次开始读取,如果没有到达最大循环数。如果在一个测试脚本对于函数有多个参考名,每个都会单独打开文件,甚至文件名是相同的。 [如果这个值在其他任何地方再次使用,对于每个函数的调用使用不同的变量名。]
如果打开文件或者读取文件发生错误,函数返回字符串"*ERR*"
属性
属性 |
描述 |
是否需要 |
文件名 |
Path to the file name. (The path can be relative to the JMeter launch directory) If using optional sequence numbers, the path name should be suitable for passing to DecimalFormat. See below for examples. |
Yes |
Variable Name |
A reference name - refName - for reusing the value created by this function. Stored values are of the form ${refName}. Defaults to "StringFromFile_". |
No |
Start sequence number |
Initial Sequence number (if omitted, the End sequence number is treated as a loop count) No |
No |
The file name parameter is resolved when the file is opened or re-opened.
The reference name parameter (if supplied) is resolved every time the function is executed.
Using sequence numbers:
When using the optional sequence numbers, the path name is used as the format string for java.text.DecimalFormat. The current sequence number is passed in as the only parameter. If the optional start number is not specified, the path name is used as is. Useful formatting sequences are:
- - insert the number, with no leading zeros or spaces
000 - insert the number packed out to 3 digits with leading zeros if necessary
Examples:
pin#'.'dat -> pin1.dat, ... pin9.dat, pin10.dat, ... pin9999.dat
pin000'.'dat -> pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat
pin'.'dat# -> pin.dat1, ... pin.dat9 ... pin.dat999
If more digits are required than there are formatting characters, the number will be expanded as necessary.
*To prevent a formatting character from being interpreted, enclose it in single quotes. Note that "." is a formatting character, and must be enclosed in single quotes *(though #. and 000. work as expected in locales where the decimal point is also ".")
In other locales (e.g. fr), the decimal point is "," - which means that "#." becomes "nnn,".
See the documentation for DecimalFormat for full details.
If the path name does not contain any special formatting characters, the current sequence number will be appended to the name, otherwise the number will be inserted aaccording to the fomatting instructions.
If the start sequence number is omitted, and the end sequence number is specified, the sequence number is interpreted as a loop count, and the file will be used at most "end" times. In this case the filename is not formatted.
${_StringFromFile(PIN#'.'DAT,,1,2)} - reads PIN1.DAT, PIN2.DAT
${_StringFromFile(PIN.DAT,,,2)} - reads PIN.DAT twice
Note that the "." in PIN.DAT above should not be quoted. In this case the start number is omitted, so the file name is used exactly as is.
19.5.6 __machineName
machineName函数返回本地主机名。
属性
属性 |
描述 |
是否需要 |
变量名 |
为重用通过这个函数计算的这个值的一个参考名 |
否 |
19.5.7 __javaScript
javaScript函数执行一个JavaScript代码片段,并返回它的值。
JMeter的Javascript函数调用一个单独的JavaScript解析器。Javascript是一种脚本语言,所以你可以做计算等。
语言详细,请参考Mozilla Rhino概述
下列变量对于脚本是可用的:
- ctx - JMeterContext 对象
- vars - JMeterVariables 对象
- threadName - 字符串
- sampler - 当前取样器对象 (如果有的话)
- sampleResult - 前一个 SampleResult 对象 (如果有的话)
- props - JMeter Properties 对象
JMeter不是一个浏览器,并不能在下载页面解析JavaScript。 |
属性
属性 |
描述 |
是否需要 |
表达式 |
被执行的JavaScript表达式。例如:
|
Yes |
Variable Name |
A reference name for reusing the value computed by this function. |
No |
Remember to include any necessary quotes for text strings and JMeter variables. Also, if the expression has commas, please make sure to escape them. For example in: |
19.5.8__Random
random函数返回在最小值和最大值之间的一个随机数。
属性
属性 |
描述 |
是否需要 |
最小值 |
一个数字 |
是 |
最大值 |
一个更大的数 |
是 |
变量名 |
A reference name for reusing the value computed by this function. |
否 |
19.5.9__CSVRead
CSVFile函数从CSV文件返回一个字符串 (c.f. StringFromFile )
注意:1.9.1以下版本仅支持一个文件。JMeter自从1.9.1版本支持多文件名。
在大多数情况下,较新的CSV数据集配置元件更早使用
当一个文件名第一次遇到时,文件会被打开,并读取到一个内部数组。如果一个空行被发现,这被认为是文件的结尾 - 这允许使用跟随注释 (N.B.这个特性是在1.9.1以后引进的)
所有接下来同样文件名的参考使用相同内部数组。 N.B. 文件名大小写对于函数是有效的,甚至OS 不关心,所以 CSVRead(abc.txt,0) 和 CSVRead(aBc.txt,0) 会指向不同的内部数组。
*ALIAS 特性允许同样的文件被打开多次,并允许使用更短的文件名。
每个线程都有它自己的内部指针指向文件数组的当前行。当一个线程第一次指向这个文件,它会被分配到数组的下一个空行 ,所以每个线程会和其他线程访问不同的行。 [Unless there are more threads than there are rows in the array.]
注意: the function splits the line at every comma by default. If you want to enter columns containing commas, then you will need to change the delimiter to a character that does not appear in any column data, by setting the property: csvread.delimiter
属性
属性 |
描述 |
是否需要 |
File Name |
The file (or *ALIAS) to read from |
Yes |
Column number |
The column number in the file. 0 = first column, 1 = second etc. "next" - go to next line of file. *ALIAS - open a file and assign it to the alias |
Yes |
For example, you could set up some variables as follows:
- COL1a ${__CSVRead(random.txt,0)}
- COL2a ${_CSVRead(random.txt,1)}${_CSVRead(random.txt,next)}
- COL1b ${__CSVRead(random.txt,0)}
- COL2b ${_CSVRead(random.txt,1)}${_CSVRead(random.txt,next)}
This would read two columns from one line, and two columns from the next available line. If all the variables are defined on the same User Parameters Pre-Processor, then the lines will be consecutive. Otherwise, a different thread may grab the next line.
The function is not suitable for use with large files, as the entire file is stored in memory. For larger files, use CSV Data Set Config element or StringFromFile . |
19.5.9__property
property返回JMeter的属性的值。如果这个属性值没找到,没有默认值提供,它会返回属性名。当提供一个默认值时,就不需要提供一个函数名 - 参数可以为空,并它被忽略。
For example:
- ${__property(user.dir)} - 返回user.dir值
- ${__property(user.dir,UDIR)} - 返回user.dir值并保存在UDIR中
- ${__property(abcd,ABCD,atod)} - 返回属性abcd的值(如果未定义,返回"atod") 并保存在ABCD中
- ${__property(abcd,,atod)} - 返回属性abcd的值 (如果未定义,返回"atod")但并不保存它
属性
属性 |
描述 |
是否需要 |
属性名 |
要得到的属性名 |
是 |
变量名 |
A reference name for reusing the value computed by this function. |
否 |
默认值 |
这个属性的默认值 |
否 |
19.5.10_P
This is a simplified property function which is intended for use with properties defined on the command line. Unlike the __property function, there is no option to save the value in a variable, and if no default value is supplied, it is assumed to be 1. The value of 1 was chosen because it is valid for common test variables such as loops, thread count, ramp up etc.
For example:
Define the property value:
jmeter -Jgroup1.threads=7 -Jhostname1=www.realhost.edu
Fetch the values:
${__P(group1.threads)} - return the value of group1.threads
${__P(group1.loops)} - return the value of group1.loops
${__P(hostname,www.dummy.org)} - return value of property hostname or www.dummy.org if not defined
In the examples above, the first function call would return 7, the second would return 1 and the last would return www.dummy.org (unless those properties were defined elsewhere!)
Parameters
Attribute |
Description |
Required |
Property Name |
The property name to be retrieved. |
Yes |
Default Value |
The default value for the property. If omitted, the default is set to "1". |
No |
19.5.11__log
log函数把一条信息记入日志,并返回空字符串
参数
属性 |
描述 |
是否需要 |
被记录的字符串 |
一个字符串 |
是 |
日志等级 |
OUT, ERR, DEBUG, INFO (默认), WARN or ERROR |
否 |
Throwable文本 |
如果非空,创建一个Throwable传递到 logger |
否 |
OUT和ERR日志等级用来直接输出到System.out和System.err
相应的,既然这样,输出总是被打印 - 它不依赖当前的日志等级
19.5.12__logn
logn函数把一条信息记入日志,并返回空字符串
参数
属性 |
描述 |
是否需要 |
被记录的字符串 |
一个字符串 |
是 |
日志等级 |
OUT, ERR, DEBUG, INFO (默认), WARN or ERROR |
否 |
Throwable文本 |
如果非空,创建一个Throwable传递到 logger |
否 |
相应的,既然这样,输出总是被打印 - 它不依赖当前的日志等级
19.5.13__BeanShell
BeanShell函数执行通过它的脚本并返回结果。
请注意BeanShell的jar文件并没有包含在JMeter中;它需要单独下载。
*使用BeanShell的全部详细信息,请参见BeanShell站点http://www.beanshell.org/ *
Note that a different Interpreter is used for each independent occurence of the function in a test script, but the same Interpreter is used for subsequent invocations. This means that variables persist across calls to the function.
A single instance of a function may be called from multiple threads. However the function execute() method is synchronised.
If the property "beanshell.function.init" is defined, it is passed to the Interpreter as the name of a sourced file. This can be used to define common methods and variables. There is a sample init file in the bin directory: BeanShellFunction.bshrc.
The following variables are set before the script is executed:
- log - the logger for the BeanShell function
- ctx - the current JMeter context variable
- vars - the current JMeter variables
- threadName - the threadName
- Sampler the current Sampler, if any
- SampleResult - the current SampleResult, if any
means that this is set before the init file, if any, is processed. Other variables vary
from invocation to invocation.
Parameters
Attribute |
Description |
Required |
BeanShell script |
A beanshell script (not a file name) |
Yes |
Name of variable |
A reference name for reusing the value computed by this function. |
No |
Example:
${__BeanShell(123*456)} - returns 56088
${__BeanShell(source("function.bsh"))} - processes the script in function.bsh
19.5.14_split
split函数按照分隔符分隔字符串,并返回原始字符串。如果任何分隔符相邻,返回"?"。这个分隔的字
符串返回在变量${VAR_1},${VAR_2}等中。变量的数量返回在${VAR_n}中。自从JMeter 2.1.2以后,
一个连续的分隔符被作为一个缺少的变量处理,并以"?"返回。同时,允许它和ForEach控制器一起工作
的更好,__split now deletes the first unused variable in case it was set by a previous
split.
例如:
Define VAR="a||c|" in the test plan.
${__split(${VAR},VAR),|}
This will return the contents of VAR, i.e. "a||c|" and set the following variables:
VAR_n=4 (3 in JMeter 2.1.1 and earlier)
VAR_1=a
VAR_2=?
VAR_3=c
VAR_4=? (null in JMeter 2.1.1 and earlier)
VAR_5=null (in JMeter 2.1.2 and later)
**
属性 |
描述 |
是否需要 |
分隔的字符串 |
一个分隔的字符串,例如"a|b|c" |
是 |
变量名 |
A reference name for reusing the value computed by this function. |
是 |
分隔符 |
分隔符字符,例如 | 。If omitted, , is used. Note that , would need to be specified as \, . |
否 |
19.5.15_XPATH
XPATH函数读取一个XML文件并匹配XPath,每个节点的匹配都是迭代遍历,就像CVSReader。
例如:
${__XPath(/path/to/build.xml, //target/@name)}
这会匹配在build.xml文件的所有target元素,并返回name变量
参数
属性 |
描述 |
是否需要 |
要解析的XML文件 |
要解析的XML文件 |
是 |
XPath |
在XML文件一个匹配节点的XPath表达式 |
是 |
19.5.16_setProperty
setProperty函数设置JMeter属性的值。来自函数的默认返回值是空字符串。所以这个函数调用可以在任
何函数可用的地方使用。
原始值可以通过设置第三个可选参数为"true"来返回。
属性对于JMeter是全局的,所以可以用来在任何线程和线程组之间传递。
参数
属性 |
描述 |
是否需要 |
Property Name |
被设置的属性名 |
是 |
Property Value |
属性的值 |
是 |
True/False |
原始值是否被返回 |
否 |
19.5.17_time
这个时间函数以不同的格式返回当前时间
参数
属性 |
描述 |
是否需要 |
Format |
这个格式被传递给SimpleDateFormat。这个函数支持各种不同的简写别名,见下文 |
否 |
Variable |
要设置的变量名 |
否 |
如果这个格式字符串被删除,那么函数以毫秒返回当前时间。否则,当前时间被传递给SimpleDateFormat
。支持下列简写别名:
- YMD = yyyyMMdd
- HMS = HHmmss
- YMDHMS = yyyyMMdd-HHmmss
- USER1 = whatever is in the Jmeter property time.USER1
- USER2 = whatever is in the Jmeter property time.USER2
这些默认值可以通过适当的设置JMeter属性来改变,例如time.YMD=yyMMdd
19.5.18_jexl
jexl函数返回执行Commons JEXL 表达式的结果。
参数
属性 |
描述 |
是否需要 |
表达式 |
要被计算的表达式 |
是 |
19.6预先定义变量
大多说变量通过函数或者测试元件例如自定义变量调用来设置;假如用户已经完全控制使用的变量名了。
然而一些变量通过JMeter内部定义。它们列表如下
- cookiename - 包含cookie的值
- JMeterThread.last_sample_ok - 最后一个取样是否正确 - 正确/不正确
19.7预先定义属性
属性被定义在jmeter.properties文件内,或者在命令行上。一些附加属性通过JMeter定义。如下列出。
START属性也可以被拷贝给使用其他相同名字的变量。
- START.MS-开始时间,使用ms为单位
- START.YMD-开始时间,使用yyyyMMdd格式
- START.HMS-开始时间,使用HHmmssnctions
and many other sources. These values are generated fresh for every request throughout the
course of the test.
20. 正则表达式
20.1 概述
JMeter 包含了软件Apache Jakarta ORO模式匹配。
在Jakarta web 站点上有一些文档,例如模式匹配字符概要信息。
还有一个是建立在OROMatcher使用手册基础上的文档,它也很有用。
这里的模式匹配很接近Perl里的模式匹配。一个完全安装的Perl包括了大量的正则表达式的文档,可以查找perlrequick, perlretut, perlre, perlreref。
它最值得强调的是在响应断言上作为测试元件使用时"包含"和"匹配"之间的不同:
"包含"意味着正则表达式匹配至少目标的一些部分,所以'al.t'是"匹配"'alphabet'。因为正则表达式匹配'phabe'字串。
不像Perl,正则表达式不需要嵌套在//内。 |
20.2 例子
提取单个字符串
假如你想匹配下列web页面的一部分:
name="file" value="readme.txt" ,并且想提取readme.txt
一个合适正则表达式是:
name="file" value="(.+?)"
特定字符如下:
- (and)-它们会嵌套到被返回的匹配字符串部分
- .-匹配任何字符。+-一次或者多次。?-不是贪婪的,例如:当第一次匹配成功后停止
没有?,+第一匹配成功之后会继续,"直到发现最后一个可能"-可能并不是想要的。 |
提取多个字符串
假如你想匹配下列web页面的一部分:
name="file.name" value="readme.txt" ,并且想提取file.name和readme.txt
一个合适正则表达式是:
name="(.+?)" value="(.+?)"
这就创建了两个组,它们将被JMeter正则表达式提取器模板为$1$和$2$。
JMeter正则表达式提取器在附加变量中保存组的值。
例如,假设:
- 参考名:MYREF
- 表达式:name="(.+?)" value="(.+?)"
- 模板:$1$$2$
不要在//中嵌套正则表达式 |
下列变量将会被设置:
- MYREF: file.namereadme.txt
- MYREF_g0: name="file.name" value="readme.txt"
- MYREF_g1: file.name
- MYREF_g2: readme.txt
那些变量在JMeter测试计划中稍后会谈到,例如${MYREF},${MYREF_g1}等
20.3 命令行模式
模式匹配行为表现在多种细微的不同的情况,但是依赖于多行和单行修改者的设置。
会有四种可以的组合:
- 默认行为:'.'匹配任何字符除了"\n",^匹配仅这个字符串开始的,$匹配仅在结尾的或者一个新行的结尾。
- 单行修改者(?s):视字符串为一个单独行。'.'匹配任何字符,甚至"\n",^匹配仅这个字符串开始的,$匹配仅在结尾的或者一个新行的结尾。
- 多行修改者(?m):视字符串为一个多行集。'.'匹配任何字符除了"\n",$能够匹配在字符串内开始或者结束的任何行。
- 双修改者(?sm):视字符串为一个单独行,但是探测多行。'.'匹配任何字符,甚至"\n"。然而,^和$能够匹配在字符串内开始或者结束的任何行。
21. 测试结果分析
一、Listener的使用
用过LoadRunner的人应该都知道,LoadRunner会为我们提供一大堆图标和曲线。但是在Jmeter里,我们只能找到几个可怜的 Listener来方便我们查看测试结果。但是,对于初学者来说,一些简单的结果分析工具可以使我们更容易理解性能测试结果的分析原理。所以,千万别小看 这几个简单的Listener啊。
A.Aggregate Report 聚合报告
我们可以看到,通过这份报告我们就可以得到通常意义上性能测试所最关心的几个结果了。
Samples -- 本次场景中一共完成了多少个Transaction
Average -- 平均响应时间
Median -- 统计意义上面的响应时间的中值
90% Line -- 所有transaction中90%的transaction的响应时间都小于xx
Min -- 最小响应时间
Max -- 最大响应时间
PS: 以上时间的单位均为ms
Error -- 出错率
Troughput -- 吞吐量,单位:transaction/sec
KB/sec -- 以流量做衡量的吞吐量
B.View Results Tree 以树状列表查看结果
通过这个Listener,我们可以看到很详细的每个transaction它所返回的结果,其中红色是指出错的transaction,绿色则为通过的。
如果你测试的场景会有很多的transaction完成,建议在这个Listener中仅记录出错的transaction就可以了。要做到这样,你只需要将Log/Display:中的Errors勾中就可以了。
二、.jtl文件的分析
在性能测试过程中,我们往往需要将测试结果保存在一个文件当中,这样既可以保存测试结果,也可以为日后的性能测试报告提供更多的素材。
Jmeter中,结果都存放在.jtl文件。这个.jtl文件可以提供多种格式的编写,而一般我们都是将其以csv文件格式记录,这样做是因为csv文件格式看起来比较方便,更重要的是这样做可以为二次分析提供很多便利。
我这里所说的二次分析是指除了使用Listener之外,我们还可以对.jtl文件进行再次分析。
a.设置jtl文件格式
我们从jmeter官方网站中下载下来的Jmeter解压后是可以直接使用的。但是,使用默认配置生成的jtl文件内容并不能满足我们的需要。于是 我们必须进行必要的设置。在2.2版本中,如果要修改jtl设置必须要到jmeter.properties文件中设置;但是在2.3版本中,我们只需要 在界面上设置就可以了。你只需要选择某个Listener,点击页面中的configure按钮。此时,一个设置界面就会弹出来,建议多勾选如下 项:Save Field Name,Save Assertion Failure Message。
b.jtl文件中的各项
经过了以上设置,此时保存下来的jtl文件会有如下项:
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,Latency
请求发出的绝对时间,响应时间,请求的标签,返回码,返回消息,请求所属的线程,数据类型,是否成功,失败信息,字节,响应时间
其中聚合报告中的,吞吐量=完成的transaction数/完成这些transaction数所需要的时间;平均响应时间=所有响应时间的总和/完成的transaction数;失败率=失败的个数/transaction数
温馨提示:在jmeter2.2和2.3版本中,都存在的一个问题是当我们重新打开jmeter,使用某个Listener来查看jtl文件 时,jmeter是会报错的。因此当你使用命令行方式完成了一个场景的测试后,你得到的只是一堆保存在jtl文件中的原始数据。所以知道聚合报告中的各项 的来源是可以方便大家摆脱测试工具来进行结果的分析。