1.jmeter測試腳本,有兩種方式。
- 實現JavaSamplerClient接口
- 繼承AbstractJavaSamplerClient抽象類
本次使用實現JavaSamplerClient接口方式
2.如圖,需要重寫四個方法
@Override
public void setupTest(JavaSamplerContext javaSamplerContext) {
}
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
return null;
}
@Override
public void teardownTest(JavaSamplerContext javaSamplerContext) {
}
@Override
public Arguments getDefaultParameters() {
return null;
}
setupTest 啟動時,需要做的處理
getDefaultParameters 傳參
runTest方法體
teardownTest結束時,需要做的處理
3.因為需要在jmeter中進行參數化,所以需要getDefaultParameters 方法進行傳參
// 這個方法是用來自定義java方法入參的。
// params.addArgument("applyAmount", "966100000000");表示入參名字叫applyAmount,默認值為966100000000。
//設置可用參數及它的默認值;
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("applyAmount", "966100000000");
return params;
}
左側是代碼中參數獲取,右側是jmeter頁面輸入參數

4.runTest中進行業務的代碼實現或者調用實現方法即可
//開始測試,從javaSamplerContext參數可以獲得參數值;
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
String applyAmount = javaSamplerContext.getParameter("applyAmount");
String url = "http://172.28.38.81:40505/czCredit/v1/repaychargeplan/repayTrial";
System.out.println("[Test Case] url = " + url);
// 必填
String productCode="A3"; //產品編碼 信貸核心表product_term.loan_product_code
String applyDate="2018-08-13"; //申請日期
//選填
String buyInsurance="1"; //是否購買保險 1是 0否
String channelCode="O20170809100414"; //渠道編碼
Map<String,Object> paraMap = new HashMap<String, Object>();
paraMap.put("productCode",productCode);
paraMap.put("applyDate",applyDate);
paraMap.put("applyAmount",applyAmount);
paraMap.put("buyInsurance",buyInsurance);
paraMap.put("channelCode",channelCode);
System.out.println("[request Data]請求參數 paraMap = " + JSONObject.toJSONString(paraMap));
Map<String, String> headers = new HashMap<String, String>();
headers.put("appId", "100");
headers.put("t",t);
headers.put("X-Real-IP","127.0.0.1");
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
// 構造 Header
Iterator i$ = headers.keySet().iterator();
while (i$.hasNext()) {
String header = String.valueOf(i$.next());
httpPost.setHeader(header, String.valueOf(headers.get(header)));
}
// 構造 Body
Iterator t$ = paraMap.keySet().iterator();
while (t$.hasNext()) {
String body = String.valueOf(t$.next());
httpPost.setHeader(body, String.valueOf(paraMap.get(body)));
}
String signBodyData = HttpUtils.getSignMap(t, paraMap);
StringEntity requestEntity = new StringEntity(signBodyData, Consts.UTF_8);
httpPost.setEntity(requestEntity);
CloseableHttpResponse httpResponse = null;
String responseString = null;
String responseMessage = null;
String status = null;
String info = null;
String result = null;
SampleResult sampleResult = new SampleResult();
try {
httpResponse = httpClient.execute(httpPost);
HttpEntity responseEntity = httpResponse.getEntity();
if (responseEntity != null && SC_OK == httpResponse.getStatusLine().getStatusCode()) {
responseString = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));
System.out.println("[Test Case] responseString = " + responseString);
responseMessage = String.valueOf(JSONPath.eval(JSON.parseObject(responseString),"$message"));
System.out.println("[Test Case] responseMessage = " + responseMessage);
info = String.valueOf(JSONPath.eval(JSON.parseObject(responseString),"$info"));
System.out.println("[Test Case] responseMessage = " + info);
status = String.valueOf(JSONPath.eval(JSON.parseObject(responseString),"$status"));
System.out.println("[Test Case] status = " + status);
result = String.valueOf(JSONPath.eval(JSON.parseObject(responseString),"$result"));
System.out.println("[Test Case] result = " + result);
}
EntityUtils.consume(requestEntity);
EntityUtils.consume(responseEntity);
httpResponse.close();
httpClient.close();
sampleResult.setSampleLabel(getClass().getName()); //設置標簽
sampleResult.sampleStart();
sampleResult.setResponseCode(String.valueOf(httpResponse.getStatusLine().getStatusCode())); //設置響應碼
sampleResult.setResponseMessage(responseMessage); //設置響應信息
sampleResult.setResponseData(responseString,"utf-8");//設置響應數據
sampleResult.setSamplerData(paraMap.toString());//設置請求參數
sampleResult.setDataType(SampleResult.TEXT);//設置數據類型
if("0000".equals(status) && "success".equals(info) && null != result){
sampleResult.setSuccessful(true);//設置結果成功
}else{
sampleResult.setSuccessful(false);//設置結果成功
}
}catch (Exception e){
sampleResult.setSuccessful(false);
sampleResult.setResponseMessage(e.toString());
e.printStackTrace();
}finally {
sampleResult.sampleEnd();
System.out.println("[Test Case] 接口 " + getClass().getName() + " 測試完畢.");
}
return sampleResult;
}
5.代碼寫好后,將代碼進行打包操作,輸出jar包,具體操作如下:
1)右鍵點擊工程,選擇open Module Settings,進入頁面
2)選擇Artifacts->JAR->From modules with dependencies
3)彈出對話框
,點擊OK,頁面顯示jar包的輸出路徑。點擊OK,配置完成
4)在idea菜單欄,點擊Build->BuildArtifacts
->
5)到指定路徑 即可獲取jar包
6)jmeter添加java請求
給jmeter指定jar包路徑:進入jmeter/bin下,找到jmeter.properties文件,修改search_paths參數,參數值為jar包所在路徑,可以配置多個,用;隔開,如圖

創建線程組->創建Java請求->在jira請求中選擇類名稱,如圖,添加參數->生成腳本

7)linux上執行腳本
a.linux上安裝jmeter
將windows上的zip包直接放到linux上
進入bin目錄,chmod 777 jmeter
修改環境變量:
# vim /etc/profile export PATH=/opt/apache-jmeter-3.3/bin/:$JAVA_HOME/bin:$PHP_HOME/bin:$PATH # source /etc/profile 使改動生效
b.在linux的jmeter中導入jar包,執行命令:
腳本執行命令:jmeter -n -t /opt/jmx/push5000.jmx -l log.jtl
-n 非 GUI 模式 -> 在非 GUI 模式下運行 JMeter -t 測試文件 -> 要運行的 JMeter 測試腳本文件
-l 日志文件 -> 記錄結果的文件
注意: jmeter需要jdk1.8以上版本,否則執行腳本命令時,會報錯: Error: Java version is too low to run JMeter. Needs at least Java >= 1.8.0. 解決辦法: 升級即可
