一.安装JMeter
? ? 在官网http://jmeter.apache.org/download_jmeter.cgi下载JMeter
? ? 直接解压JMeter安装包
? ? Linux下运行 $JMETER_HOME/bin/jmeter.sh
? ? Windows下运行? $JMETER_HOME?/bin/jmeter.bat 启动图形界面
?
二.编写JMeter测试类
? ? 1.在Eclipse中建立java工程,加入jmeter的一些基础包ApacheJMeter_core.jar,ApacheJMeter_java.jar,这两个jar包在$JMETER/lib/ext下面.同时为了方便调试,还需要加入一些日志包,avalon-framework-4.1.4.jar,commons-logging-1.1.1.jar,jorphan.jar,logkit-2.0.jar,加入之后具有如下的包结构:
? ? ?
?
? ? 2.新建SolrJmeterTest类,并继承AbstractJavaSamplerClient
? ??
package test.solr;import org.apache.jmeter.config.Arguments;import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;import org.apache.jmeter.samplers.SampleResult;/** * 使用Jmeter测试solr请求 * * @author wuwen * @date Feb 17, 2013 10:30:55 AM * */public class SolrJmeterTest extends AbstractJavaSamplerClient { private static String label = "SolrRequest"; // 定义label名称,显示在jmeter的窗口 private SolrRequest solrRequest; /** * 定义测试初始值,setupTest只在测试开始前使用,类似于LoadRunner中的init方法 */ @Override public void setupTest(JavaSamplerContext context) { super.setupTest(context); // System.out.println("setupTest....."); String url = context.getParameter("url"); // 获取Jmeter中设置的外界参数 solrRequest = SolrRequest.getInstance(url); } /** * 参数定义,也可以直接在Jmeter界面手工输入参数 * 代码里面可以通过Map<String, String> map = getDefaultParameters().getArgumentsAsMap()获取相关值 */ @Override public Arguments getDefaultParameters() { Arguments arg = new Arguments(); arg.addArgument("url", "http://172.16.19.68:5631/solr/zw"); arg.addArgument("q", "${q}"); return arg; } /** * 测试执行的循环体,根据线程数和循环次数的不同可执行多次,类似于LoadRunner中的Action方法 */ @Override public SampleResult runTest(JavaSamplerContext context) { // System.out.println("runTest....."); // System.out的输出会显示在启动的Jmeter命令窗口内,输出过多会影响性能的准确性 SampleResult results = new SampleResult(); // SampleResult封装了所有测试结果(如:测试是否成功,程序执行时间等) results.setSampleLabel(label); boolean success = true; results.sampleStart(); // 定义一个事务,表示这是事务的起始点,类似于LoadRunner的lr.start_transaction try { /** 这里就是需要测试的代码 */ solrRequest.query(context.getParameter("q")); // 调用solr请求 } catch (Exception e) { e.printStackTrace(); success = false; } finally { results.sampleEnd(); // 定义一个事务,表示这是事务的结束点,类似于LoadRunner的lr.end_transaction results.setSuccessful(success); // false表示失败 } return results; } /** * 结束方法,实际运行每个线程仅执行一次,在测试方法运行结束后执行,类似于LoadRunner中的end方法 */ @Override public void teardownTest(JavaSamplerContext context) { super.teardownTest(context); // System.out.println("teardownTest....."); } public static void main(String[] args) { SolrJmeterTest jt = new SolrJmeterTest(); JavaSamplerContext context = new JavaSamplerContext(jt.getDefaultParameters()); // 初始值执行 jt.setupTest(context); // 执行部分调用 jt.runTest(context); // 执行结束处理 jt.teardownTest(context); }}
? ? ? ?3.将工程打包成jar,放到$JMETER_HOME/lib/ext目录下面
?
? ? ? ?4.启动JMeter
?
三.运行JMeter
? ? ? ?1.添加线程组,选中主界面左侧的“测试计划”,右键菜单->添加->Threads(Users)->线程组
? ? ? ??
? ? ? ?线程组面板设置说明:
? ? ? ?
? ? ? ?2.添加java请求,选中刚才新增的"线程组",右键菜单->添加->Sampler->Java请求
? ? ? ?
? ? ? ?java请求面板说明:
? ? ? ?
? ? ? ?在类名称中选择之前打包的jar里面的类即可
? ? ? ?3.添加动态参数(CSV Data Set Config设置),选中刚才新增的"JAVA请求",右键菜单->添加->配置元件>CSV Data Set Config
? ? ??
? ? ? 参数设置说明:
? ? ??
? ? ??Filename:文件名,指保存信息的文件目录,可以相对或者绝对路径(比如:D:\word.txt)
? ? ? File Encoding ---?文件编码
? ? ? Variable Names:参数名称(如:有几个参数,在这里面就写几个参数名称,每个名称中间用分隔符分割,分隔符在下面的“Delimitet”中定义,为了和文件中的“,”对于,这里也用“,”分割每个参数名,(比如:use,password)
? ? ? Delimitet:定义分隔符,如文件中使用的是逗号分隔,则填写逗号;如使用的是TAB,则填写\t
? ? ? Recycle on EOF? ---?True=当读取文件到结尾时,再重头读取文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? False=当读取文件到结尾时,停止读取文件
? ? ?Stop thread on EOF? ---?当Recycle on EOF?一项为False时起效;True=当读取文件到结尾时,停止进程
? ? ? 4.结果监听,选中刚才新增的"Java请求",右键菜单->添加->监视器->聚合报告
? ? ? 5.保存测试用例之后,Ctrl + R,开始运行,?Ctrl + E,清除历史结果。
? ? ? 6.查看测试结果:
? ? ??聚合报告中基本已经包含我们所关心的几个数据了:
? ? ? Samples -- 本次场景中一共完成了多少个Transaction
? ? ? Average -- 平均响应时间
? ? ? Median -- 统计意义上面的响应时间的中值
? ? ? 90% Line -- 所有transaction中90%的transaction的响应时间都小于xx
? ? ? Min -- 最小响应时间
? ? ? Max -- 最大响应时间
? ? ? PS: 以上时间的单位均为ms
? ? ? Error -- 出错率
? ? ? Troughput -- 吞吐量,单位:transaction/sec
? ? ? KB/sec -- 以流量做衡量的吞吐量