Envelope
xmlns:
soapenv="http:
//schemas.xmlsoap.org/soap/envelope/">
Header/>
Body>
calculateAreaResponsexmlns:
m="http:
//myservice">
return>12
return>
calculateAreaResponse>
Body>
Envelope>
为了使测试结果更加可视化,向计划中添加SplineVisualizer,它紧靠着GraphResults。
SplineVisualizer提供了关于所有样本次数的视图。
它用分段插入功能绘制出一条连续的线,在绘制时跨越10个点,每个点代表10﹪的样本。
在样条图表中用直线取代连接点,提供了基于多项式近似算法的平滑分布视图。
结果如图7所示
图7:
使用SplineVisualizer说明与图6相同测试结果的图表
MultipleJMeters
JMeter还具有一项十分有用的RemoteStart功能,它允许用户从多台机器启动JMeter测试。
客户端主机地址可以输入到位于bin文件夹下的“jmeter.properties”文件中。
找到remote_hosts属性并在那里添加远程主机名称,使用逗号进行分隔。
重新启动Jmeter,在Run菜单中单击RemoteStart或RemoteStartAll。
某些Web和应用程序服务器可连续处理同一个IP地址的多个请求以及并行处理不同IP地址的请求,因此,对于请求来自不同的机器或将测试负载分布到几个客户端显得十分关键的情况,可以使用该选项来执行操作。
其他功能
前面已经提到,Jmeter包含HTTP、FTP和LDAP取样器。
创建这些请求是一项简单的任务,Jmeter用户手册中作了详细说明;它通常包括创建ThreadGroup、添加取样器、定时器和监听器。
下面我们介绍一些有关这些标准取样器之外的、可能需要一些非标准配置步骤的功能。
脚本
特别支持Java请求和BeanShell脚本的自定义测试和脚本是JMeter的另一个功能,它为负载测试开发人员提供了更大的灵活性。
我们可以创建脚本化测试并将其作为一个Java类进行编译,然后将其传递给JMeter运行。
为了使用BeanShell脚本功能,需要下载BeanShelljar并将其放置在/lib目录下面,以便JMeter在运行时可以选取它。
用户可以使用Java取样器中的beanshellAPI,或者创建BeanShell取样器,由它读取文件中的脚本或处理文本框中所键入的命令。
下面的代码样本说明了添加到HTTP取样器中的BeanShell断言。
用户可以对基于HTTP请求的响应的测试执行过程进行分析和控制。
一个好的方案应该创建具有线程组的测试计划,并在计划的时间循环启动负载测试。
请求将点击Web服务器并获得其响应。
print("HTTPreturncodeis:
"+ResponseCode);
print("HTTPreturnmessageis:
"+ResponseMessage);
if(SampleResult.isSuccessful())
{
print("Success");
SampleResult.setStopTest(true);
SampleResult.setStopThread(true);
}
响应可用添加到测试计划的BeanShell断言进行记录,它紧靠着HTTP取样器,如果Web服务器响应与某个条件相匹配,也就是说,如果成功或包含了预期的字符串,则脚本会停止测试或线程,否则将继续执行。
JMS应用程序
为了使用JMeter对JMS应用程序进行负载测试,要下载ActiveMQjar并将其复制到/lib目录。
根据前面的测试,我们首先创建线程组,并添加JMSPoint-to-Point样本。
JMSPoint-to-Point对话框需要填写下列参数:
QueueConnectionFactory、JNDINameRequest队列和JNDINameReceive队列。
例如,我们可以使用WebLogic示例服务器上安装的JMS模块中的参数;在这种情况下,它们为weblogic.examples.jms.QueueConnectionFactory和weblogic.examples.jms.exampleQueue。
我们也可以创建自定义的JMS连接工厂和队列。
对于WebLogic服务器,我们还需要添加weblogic.jndi.WLInitialContextFactory作为初始ContextFactory值和ProviderURL,通常情况下,其形式为:
t3:
//hostname:
7001,例如:
t3:
//localhost:
7001。
自定义取样器
许多测试人员迟早会面临下面这个问题:
假如必须要创建测试计划,而JMeter没有提供必需的取样器或监听器。
例如,用户需要测试EnterpriseJavaBeans应用程序。
用户仍然可以使用JMeter的JavaRequest,它实质上是Java类,可以向其添加需要的任何逻辑。
我们创建一个样本Java取样器,它将向应用程序服务器发送请求并调用会话bean。
首先,我们创建packagemytest和称为JBTest.javaJava的Java类:
packagemytest;
importmybeans.LoginBeanRemoteHome;
importmybeans.LoginBeanRemote;
importjava.io.Serializable;
importjavax.naming.Context;
importjavax.naming.InitialContext;
importjavax.rmi.PortableRemoteObject;
importjava.util.Hashtable;
importjavax.naming.*;
importjavax.rmi.*;
importjava.rmi.RemoteException;
importjavax.ejb.CreateException;
importorg.apache.jmeter.protocol.java.sampler.*;
importorg.apache.jmeter.config.Arguments;
importorg.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
importorg.apache.jmeter.samplers.SampleResult;
importorg.apache.jmeter.testelement.TestElement;
publicclassEJBTestimplementsJavaSamplerClient,
Serializable{
publicEJBTest(){
}
publicvoidsetupTest(JavaSamplerContextcontext){
}
publicArgumentsgetDefaultParameters(){
Argumentsparams=newArguments();
returnparams;
}
publicSampleResultrunTest(JavaSamplerContextcontext){
SampleResultresults=newSampleResult();
try{
Contextenv=getInitialContext("t3:
//localhost:
7001");
LoginBeanRemoteHomehome=(LoginBeanRemoteHome)
PortableRemoteObject.narrow(
env.lookup("ejb.LoginBeanRemoteHome"),
LoginBeanRemoteHome.class);
LoginBeanRemotebean=(LoginBeanRemote)home.create();
bean.login("TestUser","TestPassword");
results.setSuccessful(true);
}
catch(NamingExceptionne){
ne.printStackTrace();
results.setSuccessful(false);
}
catch(RemoteExceptionre){
re.printStackTrace();
results.setSuccessful(false);
}
catch(CreateExceptionce){
ce.printStackTrace();
results.setSuccessful(false);
}
returnresults;
}
staticContextgetInitialContext(Stringurl)throwsNamingException{
Hashtableenv=newHashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL,url);
returnnewInitialContext(env);
}
publicvoidteardownTest(JavaSamplerContextcontext){
}
}
为了使用该代码,要对它进行编译以创建jar文件myEJBTest.jar,将jar复制到JMeterclasspath(如lib目录),或者将classpath位置添加到jmeter.properties文件——其形式为:
user.classpath=d:
\jakarta-jmeter-2.1.1\lib\ext\myEJBTest.jar
重新启动JMeter,向测试计划添加JavaRequest元件,并从下拉菜单中选择mytest.EJBTest。
缺省情况下,JMeter提供的是“SleepTest”和“JavaTest”。
现在,我们可以向测试计划添加线程组、循环和监听器并运行测试计划。
测试数据库
Jmeter所支持的另一个功能是评价数据库服务器的性能。
用户可以使用软件提供的JDBCRequest元件,也可以使用脚本或Java类来创建自己的测试。
例如,使用一些与前面类似的示例可以测试存储过程的调用。
许多数据库优化技术都可以使用,包括使用特定供应商优化(如查询的并行处理),使用联结或索引。
此外,当用多个boolean评价创建查询时,数据组织知识很有用。
在处理大量数据时,应用程序中的数据库和查询优化是特别关键的,JMeter是一个可以在这类评价中提供某些评测的工具。
例如,可以在数据或查询优化前后执行性能或负载测试并对结果进行比较。
我们通过创建MySQL实例的测试计划来演示样本数据库性能测量计划是如何工作的。
首先,从MySQL网站下载JDBC驱动程序,并复制到/lib目录以便JMeter可以访问数据库。
现在启动JMeter,创建线程组,并设置循环数和相应的线程数。
添加JDBCConnectionConfiguration、JDBCQueryDefaults和JDBCRequest元件。
在这些对话框中,我们需要配置数据库连接和查询。
输入数据库URL值,它们的形式类似于:
jdbc:
mysql:
//hostname/databaseName,然后为JDBCDriverClass输入com.mysql.jdbc.Driver。
针对这个试验,我们创建了数据库customers,它带有包含下列三个字段的customer表格:
名称、地址和帐户。
在Query框中键入查询,例如,从客户中选择名称。
为了使结果可视化,可以添加带有响应时间的图表,或者,如果要检验响应是否匹配特定模式,可以添加响应断言。
例如,在ResponseAssertion中添加文本模式“Smith”。
在AssertionResult窗口将显示如“Testfailed,textexpectedtocontain/Smith/”之类的错误,或者,如果由于设置错误而没有连接,则显示“Responsewasnull”。
如果测试成功,将不返回任何内容。
除了图表和断言监听器,我们还可以使用AggregateReport,它以表格的形式显示样本数、平均值、中间值和吞吐量的摘要。
结束语
JMeter是一个十分灵活的工具,它不仅能够测试HTTP服务器,而且还能够对Webservices进行负载测试。
有经验的开发人员可以编写自己的脚本来模拟或自定义客户端请求,或者为测试结果添加自定义的可视化效果。
WebServices和SOAP取样器是JMeter的新功能,希望它们能够随着Webservices而发展,在行业和开发人员中获得更广泛的认可。
使用JMeter现有的功能和它所提供的用户界面,可以模拟5个并发线程,以10和5ms延迟点击服务器。
本教程说明了该工具能够用于对Webservices的响应时间进行测量的原理。
例如,利用JMeter脚本,可以查找客户端的身份认证和授权。
所测试的应用程序服务器和JMeter客户端都本地安装在同一个工作站,然而同样的设置也可以用于测试远程服务器。
所得到的结果和图表还不能提供有价值的