對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目錄下!
