jmeter 测试java协议经验总结
对java协议的良好支持,是jmeter比loadrunner优秀的地方,但是坑也不少,本文将相关点都整理下来备忘
一. 依赖的jar包
使用IDE开发jemter java协议脚本时,需要导入以下几个包,否则会报找不到Class或者其他诡异问题,以下的包在jmeter\lib或者jmeter\lib\ext下找得到:
avalon-framework.jar、 jorphan.jar、 commons-logging.jar、 ApacheJMeter_core.jar、 ApacheJMeter_java.jar、 logkit-2.0.jar
需要注意的是: jmeter的jorphan.jar非常古怪,如果我们开发的脚本也用到类似的jar,请务必保证jmeter\lib下该jar不会被替换且不能存在多个版本,否则启动jmeter报错:
Uncaught Exception java.lang.NoSuchMethodError: org.apache.jorphan.gui.GuiUtils.makeScrollableMenu(Ljavax/swing/JMenu;)V. See log file for details.
二. 编码示范
使用jmeter开发java测试脚本的常规格式如下:
/** * */ package test; 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; /** * * */ public class PerformanceTest extends AbstractJavaSamplerClient { /** * 每个线程初始化时会调用且仅调用一次,可放一些初始化代码 */ public void setupTest(JavaSamplerContext arg0) { // 开始时间 start = System.currentTimeMillis(); } /** * 每个线程销毁时 会调用一次runTest()方法后会调用此方法. */ public void teardownTest(JavaSamplerContext arg0) { // 结束时间 end = System.currentTimeMillis(); // 总体耗时 System.err.println("cost time:" + (end - start) / 1000); } /** * JMeter界面中可手工输入参数,代码里面通过此方法获取 */ public Arguments getDefaultParameters() { Arguments args = new Arguments(); return args; } /** * JMeter测试用例入口 */ @Override public SampleResult runTest(JavaSamplerContext arg0) { SampleResult result = new SampleResult();
boolean isSuccessful = false;
try {
String strategy = arg0.getParameter("strategy");
String pin = arg0.getParameter("pin");
/*
* 其他构造参数代码
*/
result.sampleStart();
/*
执行测试代码
*/
if(xxx==xxx){
isSuccessful = true;
} else {
isSuccessful = false;
//打印失败信息
//logger.error("接口调用失败,结果信息");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
result.sampleEnd();
result.setSuccessful(isSuccessful);
}
return result;
}
}
三. 路径的一些说明
开发java协议脚本时候常常需要读取一些配置文件的内容,这里又主要分两种情况,spring容器配置文件和普通文本类
1. spring容器类配置
读取 spring容器配置文件的读取建议使用 ClassPathXmlApplicationContext类而非FileSystemXmlApplicationContext,因为后者是要写死路径的,不利于后面的打包并部署到jmeter环 境里,示范代码:
ApplicationContext applicationContext = null;
public void setupTest(JavaSamplerContext context) { try { applicationContext = new ClassPathXmlApplicationContext("jsf-consumer.xml"); } catch (Exception e) { e.printStackTrace(); } }
非Spring容器的配置文件,则需要使用如下代码读取:
InputStream is = null; try { String str = null; PropertiesTest pt = new PropertiesTest(); Properties pro = new Properties(); is = pt.getClass().getResourceAsStream("/ptest.properties"); pro.load(is); System.out.println("PAGESIZE-->" + pro.get("PAGESIZE")); System.out.println("CURRENT_PAGE-->" + pro.get("CURRENT_PAGE")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { if(is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); }
}
为了能让代码取到xml文件需要按照约定来配置:
(1) 非maven项目,需要放在项目的src目录下,如下图
(2) maven项目,除了src目录外还可以放在src/main/resource目录下
四. 打包和部署
测试代码打包步骤如下:
1. 右键--->export
2. 选择Runnable JAR file
3. 进行配置信息和保存路径的设置
注意,如果launch configuration找不到目标类,则可以执行一次这个类的Main函数
4.单击"Finish",即可得到一个jar和一个对应名字的目录,比如abcTest.jar和abcTest_lib 目录
5. 将上面的文件和目录直接拷贝到jmeter/lib/ext目录下即可
通常情况下,以上步骤不会有任何问题,如果非常不幸遇到诡异问题,请参照以下文章:http://www.cnblogs.com/onmyway20xx/p/4260216.html
将生成的abcTest.jar放在lib/ext目录,将abcTest_lib目录下文件去除jmeter本身自带的几个jar、剩余的jar拷贝到lib目录下!