目的:對Java程式進行測試;
一、核心步驟
1.建立一個Java工程;2.將JMeter的lib目錄下的jar檔案添加進此工程的Build Path;3.建立一個類並實現JavaSamplerClient介面或繼承AbstractJavaSamplerClient,並重寫:
- public Arguments getDefaultParameters():設定可用參數及的預設值;
- public void setupTest(JavaSamplerContext arg0):每個線程測試前執行一次,做一些初始化工作;
- public SampleResult runTest(JavaSamplerContext arg0):開始測試,從arg0參數可以獲得參數值;
- public void teardownTest(JavaSamplerContext arg0):測試結束時調用;
4.Export為
Runnable Jar File;5.將此jar包放入JMETER_HOME\lib\ext目錄;6.以
管理員身份開啟JMeter;7.建立線程組、Java Request、結果樹,進行測試;
二、執行個體
利用JMeter對服務進行效能測試,服務為:將輸入的兩個參數通過IO存入檔案;
1、編寫Java代碼
服務:
package test;import java.io.File;import java.io.PrintWriter;public class OutputService { public static void output(String filename,int a, int b) throws Exception { PrintWriter out = new PrintWriter(new File(filename)); out.write(a+":"+b); out.close(); }}測試類別:
package test;import org.apache.jmeter.config.Arguments;import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;import org.apache.jmeter.samplers.SampleResult;public class PerformenceTest implements JavaSamplerClient {private SampleResult results;private String a;private String b;private String filename;// 設定傳入的參數,可以設定多個,已設定的參數會顯示到Jmeter的參數列表中public Arguments getDefaultParameters() {Arguments params = new Arguments();params.addArgument("filename", "0");//設定參數,並賦予預設值0params.addArgument("a", "0");//設定參數,並賦予預設值0params.addArgument("b", "0");//設定參數,並賦予預設值0return params;}// 初始化方法,實際運行時每個線程僅執行一次,在測試方法運行前執行public void setupTest(JavaSamplerContext arg0) {results = new SampleResult();}// 測試執行的迴圈體,根據線程數和迴圈次數的不同可執行多次@Overridepublic SampleResult runTest(JavaSamplerContext arg0) {b = arg0.getParameter("b"); // 擷取在Jmeter中設定的參數值a = arg0.getParameter("a"); // 擷取在Jmeter中設定的參數值filename = arg0.getParameter("filename"); // 擷取在Jmeter中設定的參數值results.sampleStart();// jmeter 開始統計回應時間標記try {OutputService test = new OutputService();test.output(filename,Integer.parseInt(a), Integer.parseInt(b)); results.setSuccessful(true);// 被測對象調用} catch (Throwable e) {results.setSuccessful(false);e.printStackTrace();} finally {results.sampleEnd();// jmeter 結束統計回應時間標記}return results;}// 結束方法,實際運行時每個線程僅執行一次,在測試方法運行結束後執行public void teardownTest(JavaSamplerContext arg0) {}public static void main(String[] args) { // TODO Auto-generated method stubArguments params = new Arguments();params.addArgument("a", "0");//設定參數,並賦予預設值0params.addArgument("b", "0");//設定參數,並賦予預設值0 JavaSamplerContext arg0 = new JavaSamplerContext(params); PerformenceTest test = new PerformenceTest(); test.setupTest(arg0); test.runTest(arg0); test.teardownTest(arg0); }}
Export 為 Runnable Jar File;
2、設定JMeter
以管理員身份開啟JMeter,並建立Java Request後,結構如所示:在Java請求中發現了自己建立的測試類別:
我們在JMeter中發現參數有三個:我們在響應的數值中填入:
大家一定很奇怪,怎麼會有一些看不懂的東西,這是JMeter提供的函數,我們可以在因為我們要做的是效能測試,因此我們需要開多個線程並發測試,因此隨機數很重要;常用的函數為:(1)_Random產生隨機整數;(2)_RandomString產生隨機字串;
線上程組中設定並發線程數為10000,儲存後即可運行;圖形結果如下所示:彙總報告:表格查看結果:結果成功,成功產生了接近10000個檔案:
3.期間遇到的問題1.Export為Jar File導致Java Request的類名稱無法找到;2.JMeter java.lang.OutOfMemoryError: PermGen space問題:在JMeter.bat 中修改:set HEAP=-Xms512m -Xmx1024mset NEW=-XX:NewSize=128m -XX:MaxNewSize=128mset SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%set TENURING=-XX:MaxTenuringThreshold=2set RMIGC=-Dsun.rmi.dgc.client.gcInterval=600000 -Dsun.rmi.dgc.server.gcInterval=600000set PERM=-XX:PermSize=256m -XX:MaxPermSize=512m
3.JMeter需要以管理員身份開啟,否則會出現: