jmeter之java請求二次開發
說明與步驟
- 原則上jmeter的java請求,可以壓測一切可使用java訪問的東西,包括Redis,MQ等等。
- 需要lib/ext中的ApacheJMeter_core.jar,如擴充套件java請求則還需要ApacheJMeter_java.jar,擴充套件http請求則需要ApacheJMeter_http.jar,依次類推,都在lib/ext中,另外lib中的avalon-framework-4.1.4.jar根據實際需要也會用到(jmeter3.2中名稱是framework)
- 下文中的程式碼,則是具體的被測類和測試類的編寫。(當然,你要先用eclipse建立工程,匯入前面說的jar包,再新建package,新建class,擼程式碼),完成後匯出被測jar包放到lib中,測試用的jar包放到lib/ext中。
- 新建java請求,就可以看到。並傳入響應的引數。比如method=add,num1=111,num2=222,然後點選執行,就可以看到結果,如下圖。
程式碼例項
被測類
public class Calc {
public int add(int x, int y){
return x + y;
}
public int minus(int x, int y){
return x - y;
}
}
測試類
package com.cmos.test;
/*
* 一般來說,擴充套件java請求通常需要的類有:
* AbstractJavaSamplerClient
* JavaSamplerContext 容器類
* SampleResult 結果統計類
* Argument 引數類
* */
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.config.Arguments;
import java.util.Random;
import com.cmos.JmeterTest.Calc;
public class TestCalc extends AbstractJavaSamplerClient {
/*
* 一般來說,需要定義全域性變數,是用來實現邏輯處理
* 包括控制變數、入參、結果。一般由被測方法決定
* */
private String method;
private int x;
private int y;
private String resultData;
Calc c = new Calc();
/*
* 通過getDefaultParameters()可以來定義入參
*
* */
public Arguments getDefaultParameters(){
//定義屬性物件,用來新增GUI引數
Arguments params = new Arguments();
//新增一個GUI引數,名稱叫"method",值是"add"
params.addArgument("method", "add");
params.addArgument("num1","111");
params.addArgument("num2",null);
return params;
}
//每個執行緒測試前執行一次,做一些初始化工作;
public void setupTest(JavaSamplerContext arg0) {
}
//JavaSampleContext arg0()就是用來接收GUI所提交的
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
// TODO Auto-generated method stub
SampleResult sr = new SampleResult();
try{
//將GUI介面傳遞過來的值賦給全域性變數
method = arg0.getParameter("method");
x = Integer.parseInt(arg0.getParameter("num1",null));
y = Integer.parseInt(arg0.getParameter("num2",null));
//是表示請求開始計時
sr.sampleStart();
//實際測試不需要,模擬處理過程中所需消耗的時間
// Random rnd = new Random();
// Thread.sleep(rnd.nextInt(1000));
//通過GUI傳遞的method引數來決定所執行的方法
if(method.equals("add")){
resultData = String.valueOf(c.add(x, y));
}
else if(method.equals("minus")){
resultData = String.valueOf(c.minus(x, y));
}
if(resultData != null && resultData.length()>0){
//設定響應資料為resutlData;也可以用sr.setSamplerData("OK");
sr.setResponseData(resultData,null);
//設定響應程式碼為0
sr.setResponseCode("0000");
//設定響應型別為text
sr.setContentType(SampleResult.TEXT);
//設定響應狀態為true
sr.setSuccessful(true);
//設定響應資訊
sr.setResponseMessage("方法執行成功!");
}
else{
sr.setResponseData(resultData,null);
//設定響應程式碼為-9999
sr.setResponseCode("-9999");
//設定響應型別為txt
sr.setContentType(SampleResult.TEXT);
//設定響應狀態為true
sr.setSuccessful(false);
//設定響應資訊
sr.setResponseMessage("方法執行失敗!");
}
}
catch(Exception e){
sr.setResponseData(e.getMessage(),null);
e.printStackTrace();
sr.setResponseCode("-1");
sr.setContentType(SampleResult.TEXT);
sr.setSuccessful(false);
sr.setResponseMessage("捕獲異常!");
}
finally{
//表示請求結束計時
sr.sampleEnd();
}
//表示返回這個SampleResult物件sr
return sr;
}
public void teardownTest(JavaSamplerContext arg0) {
// System.out.println(end);
// System.out.println("The cost is"+(end-start)/1000);
}
}