實際過程中采用Jmeter壓測Http接口比較多,但當有些請求邏輯比較復雜的時候,Jmeter 中自帶的sample比較難實現,或者是實際工作中也可能會遇見一些無法通過http 來實現的,比如通過SDK來獲取token,然后拿token再去請求其他的接口等等,就需要借助java request來實現邏輯。
Jmeter自帶的java request defaults(包含 java test 和 Sleep test 2個)
下面來看下創建自己需要的Java Request 的步驟:
1. 創建Java 工程
2. 引入JMeter在lib目錄和lib\ext 目錄下的jar包:
ApacheJMeter_core.jar
ApacheJMeter_java.jar
avalon-framework-4.1.4.jar
jorphan.jar
logkit-2.0.jar
-------------------------------------------------------------------
import org.apache.jmeter.config.Arguments; //請求參數
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; //請求基類
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; //請求上下文,可以理解為Jmeter傳過來的內容
import org.apache.jmeter.samplers.SampleResult;//請求結果
3. 創建一個類並實現javaSamplerClient 接口或繼承AbstractJavaSamplerClient,並重寫:
public Arguments getDefaultParameters():設置可用參數及默認值;
public void setupTest(JavaSamplerContext arg0):每個線程測試前執行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContest arg0):開始測試,從arg0參數可以獲得參數值;
public void teardownTest(JavaSamplerContest arg0):測試結束時調用;
( 調用順序: getDefaultParameters——> setupTest——> runTest ——> teardownTest )
4. 導出jar包到 {JMETER_HOME}\lib\ext目錄中。
5. 重啟JMeter界面
6. 新增java請求,選擇需要的類名稱,填寫參數。
7. 設置線程組、結果樹、進行測試。
舉例:新建一個隨機生成中文姓名的Java請求
1. 創建類 TestDemo, 繼承自AbstractJavaSamplerClient
public class TestDemo extends AbstractJavaSamplerClient;
2. getDefaultParameters: 默認參數設置,將顯示在JMeter界面。
public Arguments getDefaultParameters(){
Argument args = new Arguments();
args.addArgument(name:"name_count", value:"2"); //設置參數name_count,並賦予默認值2
args.addArgument(name:"name_count", value:"3");
args.addArgument(name:"all_random", value:"true");
args.addArgument(name:"last_name", value:"張");
return args;
}
3. setupTest:初始化的操作,比如將參數復制給變量。
public void setupTest(JavaSamplerContest JavaSamplerContest){
this.labeName = JavaSamplerContest.getParameter( "TestElement");
this.nameCount = JavaSamplerContest.getIntParament("name_count");
this.nameLength = JavaSamplerContest.getIntParameter("name_length");
this.allRandom = Boolean.valueOf(JavaSamplerContest,getOaraneter("all_random");
this.lastName = javaSamplerContext.getParameter("last_name");
}
4. runTest: 邏輯主體
(sampleStart和sampleEnd作為統計事務的開始和結束。 setSuccessful 可以設置事務的成功失敗。)
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult results = new SampleResult();
try{
results.sampleStart(); //統計時間開始標志
List<String> names = CreateName.GetName(nameCount, nameLength, allRandom, lastName);
//正常
results.setResponseDate(names.toString(),"UTF-8");
results.setDataType(SampleResult.TEXT);
results.setSuccessful(true);
} catch (Throwable e) {
//有異常
results.setSuccessful(false);
results.setResponseMessae(e.toString());
} finally {
results.sampleEnd();// jmeter 統計時間結束標記
}
return resules;
}
5. teardownTest:結束時的操作
public void teardownTest(JavaSamplerContext JavaSamplerContext) {
6. 導出jar包:TestDemo.jar, 放入 {JMETER_HOME}\lib\ext目錄中.
7. 重啟Jmeter, 新創建 java request,名稱處可選擇到TestDemo