jmeter java接口_JMeter接口Java开发五步曲
想做jmeter接口二次開發但不知道如何入手,要解決這個問題,我們可以分為5個步驟
第一步:了解jmeter處理java請求的流程
第二步:通過實現jmeter中的接口JavaSamplerClient編寫自定義JAVA接口
第三步:打包
第四步:將jar包放在jmeter 的第三方庫目錄
第五步:運行jmeter,添加java請求,進行測試
第一步:了解jmeter處理java請求的架構流程
目標:明白jmeter是怎么處理java請求的。
首先,我們先簡單了解一下Jmeter處理請求的流程:
Jmeter會讀取用戶傳入的數據,把數據初始化到Jmeter中。
調用Java請求時,jmeter會運行內部的runTest函數,調用封裝的JAVA接口,獲取到返回數據
獲取到返回數據后,Jmeter可以把返回數據寫入到結果樹中,這樣就能使用查看結果樹來觀察返回的數據了。
在這個過程中,JMeter內部是使用什么類來進行處理的呢?我們一起來看一下:
Arguments:
org.apache.jmeter.config.Arguments
Jmeter初始化時,會把用戶的參數數據通過Arguments類來加載到內存當中。
JavaSamplerContext:
org.apache.jmeter.protocol.java.sampler.JavaSamplerContext
JavaSamplerContext用于向JavaSamplerClient實現提供上下文信息。比如加載Arguments中的用戶數據
JavaSamplerClient:
這個接口定義了JavaSampler和外部Java程序之間的交互,這些程序可以由JMeter執行。任何想要作為JMeter測試執行的Java類都必須實現這個接口(直接或間接地通過AbstractJavaSamplerClient)。 JMeter將為測試中的每個用戶/線程創建一個JavaSamplerClient實現實例。可以創建額外的實例供JMeter內部使用(例如,了解客戶機支持哪些參數)。
當測試啟動時,將在每個線程的JavaSamplerClient實例上調用setupTest()來初始化客戶機。然后在測試的每次迭代中調用runTest()。最后,將調用teardownTest()來允許客戶機進行任何必要的清理。
JavaSamplerClient包括以下4個函數(必須實現這4個函數)
SampleResult runTest(JavaSamplerContext var1);voidteardownTest(JavaSamplerContext var1);
Arguments getDefaultParameters(); ```void setupTest(JavaSamplerContext var1):
加載類時初始化調用的方法,一般獲取參數,建立連接等功能寫在這里。
SampleResult runTest(JavaSamplerContext var1)
實現接口調用的邏輯代碼主要寫在runTest函數下。一般在這里通過SampleResult類定義在Jmeter GUI界面中請求和返回結果數據。
如下圖中,View Results Tree中內容,就是通過SampleResult進行定義
void teardownTest(JavaSamplerContext var1)
類運行結束時,運行這個函數下面的語句,主要用來釋放資源,關閉連接等請求后的操作。
Arguments getDefaultParameters()
提供測試時支持的參數列表。一般參數的初始化放在這里進行,避免在runTest中執行。可以提高執行效率。
SampleResult
主要用于控制展示每次迭代的測試結果。
綜上,用戶數據初始化時,會初始化到Config中,由config模塊的Arguments管理參數,然后我們實現的java請求會通過runTest方法調用封裝的API接口,并根據返回數據在JMeter設置要展示的返回結果。
所以我們二次開發jmeter的JAVA接口請求,需要繼承JavaSamplerClient接口,并實現其中的4個函數。具體怎么實現,我們接下來詳細介紹。
二. 第二步 —— 實現JAVA接口請求--實現登陸接口調用
目標:實現Jmeter的JAVA接口請求
創建Maven項目和項目結構,解決Jmeter Java請求開發的依賴問題
這里使用的是IDEA:新建一個Maven項目
項目的GroupID和ArtifactId
自動生成的項目名稱和項目地址
新建好后就是這樣:然后右下角會彈出一個maven的提示,選擇開啟自動導入
在src/main/java 下添加一個java包名字為 utils
在彈出的窗口中輸入包名:utils,然后點擊ok
成功之后的效果:
這樣,我們的項目和目錄結構就建立完畢了,結構非常簡單。
封裝JAVA的HTTP請求工具類
在utils下新建一個java文件,名稱為HTTPRequestUtils,詳細步驟就不貼圖了,就是對utils點擊右鍵,選擇new->java class
寫上如下的代碼(JAVA實現HTTP請求有多種方式,這只是其中一種):
packageutils;importcom.alibaba.fastjson.JSONObject;import java.io.*;importjava.net.HttpURLConnection;importjava.net.MalformedURLException;importjava.net.URL;public classHTTPRequestUtils {public staticString getDemo(String url) {
HttpURLConnection connection= null;
InputStream inputStream= null;
BufferedReader br= null;
String result= null;//返回結果字符串
try{//創建遠程url連接對象
URL url_obj = newURL(url);//通過遠程url連接對象打開一個連接,強轉成httpURLConnection類
connection =(HttpURLConnection) url_obj.openConnection();//設置連接方式:get
connection.setRequestMethod("GET");//連接服務器的超時時間:10000毫秒
connection.setConnectTimeout(10000);//讀取返回的數據時間:30000毫秒
connection.setReadTimeout(30000);//發送請求
connection.connect();//通過connection連接,獲取輸入流
if (connection.getResponseCode() == 200) {
inputStream=connection.getInputStream();//封裝輸入流is,并指定字符集
br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));//存放數據
StringBuffer stringBuffer = newStringBuffer();
String temp;
temp= null;while (null != (temp =br.readLine())) {
stringBuffer.append(temp);
stringBuffer.append("\r\n");
}
result=stringBuffer.toString();
}
}catch(MalformedURLException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally{//關閉資源
if (null !=br) {try{
br.close();
}catch(IOException e) {
e.printStackTrace();
}
}if (null !=inputStream) {try{
inputStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}//關閉連接
if (null !=connection) {
connection.disconnect();
}
}returnresult;
}public staticString postDemo(String url, JSONObject param, JSONObject headers) {
HttpURLConnection connection= null;
InputStream inputStream= null;
OutputStream outputStream= null;
BufferedReader br= null;
String result= null;try{
URL url_obj= newURL(url);//通過遠程url連接對象打開連接
connection =(HttpURLConnection) url_obj.openConnection();//連接請求方式
connection.setRequestMethod("POST");//設置連接主機服務器超時時間:10000毫秒
connection.setConnectTimeout(10000);//設置讀取主機服務器返回數據超時時間:30000毫秒
connection.setReadTimeout(30000);//默認值為:false,當向遠程服務器傳送數據/寫數據時,需要設置為true
connection.setDoOutput(true);//默認值為:true,當前向遠程服務讀取數據時,設置為true,該參數可有可無
connection.setDoInput(true);//設置傳入參數的格式:請求參數應該是 name1=value1&name2=value2 的形式。
if (null != headers.get("Content-Type")) {
connection.setRequestProperty("Content-Type", (String) headers.get("Content-Type"));
}else{
connection.setRequestProperty("Content-Type", "application/json");
}//通過連接對象獲取一個輸出流
outputStream =connection.getOutputStream();//通過輸出流對象將參數寫出去/傳輸出去,它是通過字節數組寫出的
outputStream.write(param.toJSONString().getBytes());//通過連接對象獲取一個輸入流,向遠程讀取
if (connection.getResponseCode() == 200) {
inputStream=connection.getInputStream();//對輸入流對象進行包裝:charset根據工作項目組的要求來設置
br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuffer stringBuffer= newStringBuffer();
String temp;
temp= null;//循環遍歷一行一行讀取數據
while ((temp = br.readLine()) != null) {
stringBuffer.append(temp);
stringBuffer.append("\r\n");
}
result=stringBuffer.toString();
}
}catch(MalformedURLException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally{//關閉資源
if (null !=br) {try{
br.close();
}catch(IOException e) {
e.printStackTrace();
}
}if (null !=outputStream) {try{
outputStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}if (null !=inputStream) {try{
inputStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}//斷開與遠程地址url的連接//關閉連接
if (null !=connection) {
connection.disconnect();
}
}returnresult;
}public static voidmain(String[] args) {
String url= "http://182.92.81.159/api/sys/login";
JSONObject loginParams= newJSONObject();
loginParams.put("mobile", "13800000002");
loginParams.put("password", "123456");
JSONObject headers= newJSONObject();
headers.put("Content-Type", "application/json");
String result=HTTPRequestUtils.postDemo(url, loginParams, headers);
System.out.println(result);
}
}
在這個代碼里面,我們封裝了Get請求和Post請求,其中postDemo請求是我們要使用的方法。
postDemo簡單封裝了url,data,headers,能進行簡單的post請求,并返回請求結果。
然后Pom文件中增加對Json的依賴
4.0.0
ihrmLogin
ihrmLogin
1.0-SNAPSHOT
com.alibaba
fastjson
1.2.47
運行調試一下,查看返回結果:
封裝IHRM登陸接口API,并調試通過
補充新建一個api包,包下面新建IHRMLogin文件
IHRMLogin就是登陸的接口,我們寫上如下代碼:
packageapi;importutils.HTTPRequestUtils;importcom.alibaba.fastjson.JSONObject;public classIHRMLogin {public JSONObject headers = newJSONObject();public JSONObject login_data = newJSONObject();publicString url;publicIHRMLogin(){
url= "http://182.92.81.159/api/sys/login";
}publicString loginIHRM(String mobile, String password) {
login_data.put("mobile", mobile);
login_data.put("password", password);
headers.put("Content-Type", "application/json");return HTTPRequestUtils.postDemo(this.url, login_data, headers);
}public static voidmain(String[] args){
IHRMLogin ihrmLogin= newIHRMLogin();
String response= ihrmLogin.loginIHRM("13800000002","123456");
System.out.println(response);
}
}
我們調用了封裝的HTTPRequestUtils中的postDemo函數,發送了post請求,然后輸出返回結果到控制臺
運行調試:
至此,IHRM系統的登陸接口就已經封裝完畢,后面我們就可以實現java的接口測試用例了。
編寫測試用例實現Jmeter的JavaSamplerClient接口
接下來開始開發jmeter的java 接口,jmeter要訪問外部的java類,必須通過JavaSampleClient或者AbstractJavaSamplerClient。我們這里學習的是“實現JavaSampleClient接口”
添加對JavaSampleClient的依賴包:
點擊File,選擇Project Structure進入
進入配置依賴包的界面
點擊+添加$jmeter_home/lib/ext/中的ApacheJmeter_code和ApacheJmeter_java
添加之后,我們就可以導入我們需要的JavaSamplerClient等相關的類了。
在java目錄下新建java文件TestIHRMLogin
編寫代碼,步驟有5步:
實現的JavaSamplerClient中的4個接口。
importorg.apache.jmeter.config.Arguments;importorg.apache.jmeter.protocol.java.sampler.JavaSamplerClient;importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;importorg.apache.jmeter.samplers.SampleResult;importapi.IHRMLogin;public class TestIHRMLogin implementsJavaSamplerClient {public voidsetupTest(JavaSamplerContext javaSamplerContext) {
}publicSampleResult runTest(JavaSamplerContext javaSamplerContext) {return null;
}public voidteardownTest(JavaSamplerContext javaSamplerContext) {
}publicArguments getDefaultParameters() {return null;
}
}
實現Arguments函數,代碼如下:
publicArguments getDefaultParameters() {//定義Jmeter GUI中java請求的參數:目前在代碼中添加了兩個參數分別是mobile和password
Arguments arguments = newArguments();
arguments.addArgument("mobile", "");
arguments.addArgument("password", "");returnarguments;
}
實現setupTest,代碼如下:
privateString mobile;privateString password;public voidsetupTest(JavaSamplerContext javaSamplerContext) {//從JavaSamplerConext中讀取用戶傳入的參數:mobile和password
this.mobile = javaSamplerContext.getParameter("mobile");this.password = javaSamplerContext.getParameter("password");
}
實現runTest,runTest是邏輯調用部分,實現調用登陸接口,獲取返回數據,設置返回結果等功能,代碼如下:publicSampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult result= newSampleResult();
IHRMLogin loginApi= newIHRMLogin();//獲取當前線程編號
String threadName =Thread.currentThread().getName();
System.out.println(threadName);//設置返回結果標簽的名稱
result.setSampleLabel("ihrm-" +threadName);//在Jmeter的GUI中展示請求數據
result.setSamplerData("請求的mobile為:" + this.mobile + "\n請求的密碼為:"+ this.password);//開始事務,開始計算時間
result.sampleStart();try{//調用登陸接口,并獲取返回數據
String response = loginApi.loginIHRM(this.mobile, this.password);//把返回結果設置到SampleResult中
result.setResponseData(response, null);//設置返回結果的為Text類型
result.setDataType(SampleResult.TEXT);
result.setSuccessful(true);//輸出結果到控制臺
System.out.println(response);
}catch(Throwable e) {//如果出現異常,則判斷調用失敗
result.setSuccessful(false);
e.printStackTrace();
}finally{//結束事務,計算請求時間
result.sampleEnd();
}returnresult;
}
綜上,完整的代碼是這樣:
importorg.apache.jmeter.config.Arguments;importorg.apache.jmeter.protocol.java.sampler.JavaSamplerClient;importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;importorg.apache.jmeter.samplers.SampleResult;importapi.IHRMLogin;public class TestIHRMLogin implementsJavaSamplerClient {privateString mobile;privateString password;public voidsetupTest(JavaSamplerContext javaSamplerContext) {//從JavaSamplerConext中讀取用戶傳入的參數:mobile和password
this.mobile = javaSamplerContext.getParameter("mobile");this.password = javaSamplerContext.getParameter("password");
}publicSampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult result= newSampleResult();
IHRMLogin loginApi= newIHRMLogin();//獲取當前線程編號
String threadName =Thread.currentThread().getName();
System.out.println(threadName);//設置返回結果標簽的名稱
result.setSampleLabel("ihrm-" +threadName);//在Jmeter的GUI中展示請求數據
result.setSamplerData("請求的mobile為:" + this.mobile + "\n請求的密碼為:"+ this.password);//開始事務,開始計算時間
result.sampleStart();try{
String response= loginApi.loginIHRM(this.mobile, this.password);//把返回結果設置到SampleResult中
result.setResponseData(response, null);//設置返回結果的為Text類型
result.setDataType(SampleResult.TEXT);
result.setSuccessful(true);//輸出結果到控制臺
System.out.println(response);
}catch(Throwable e) {
result.setSuccessful(false);
e.printStackTrace();
}finally{//結束事務,計算請求時間
result.sampleEnd();
}returnresult;
}public voidteardownTest(JavaSamplerContext javaSamplerContext) {
}publicArguments getDefaultParameters() {//定義Jmeter GUI中java請求的參數:目前在代碼中添加了兩個參數分別是mobile和password
Arguments arguments = newArguments();
arguments.addArgument("mobile", "");
arguments.addArgument("password", "");returnarguments;
}
}
這樣,我們的代碼部分,就編寫完成了,接下來,我們要把編寫的代碼構建成jar包然后使用起來
三. 第三步 —— 打包
目標:把我們編寫的依賴包和代碼構建成jar包
主要分為2步:
添加jar包
進入Project Structure:
點擊File->Project Structure->Artifacts進入下圖中的界面
添加和配置jar包
添加jar包第一步:
添加jar包第二步:點擊Main Class右邊的文件夾
添加jar包第三步:選擇IHRMLogin,然后連續ok下去,jar包就添加成功了
添加成功后的效果:
點擊Apply和ok
構建jar包
構建jar包第1步:
點擊Build-> Build Artifacts...
構建jar包第2步:在彈出的窗口選擇Build
構建jar包第三步,查看生成的jar包
通過以上4步,我們使用IDEA構建生成了一個jar包,生成jar包在項目工具目錄的out文件下,當然,我們也可以使用maven生成,有興趣可以自己嘗試。
四. 第四步 —— 上傳jar包到jmeter的第三方庫
目標:上傳生成的jar包到jmeter的第三方庫
步驟:
第一步:復制生成的jar包
先定位到jar包,對ihrmLogin.jar單擊右鍵,選擇在Finder中打開(Windows 操作系統有略微區別,但是意思差不多)
打開文件夾:
第二步:拷貝到jmeter根目錄/lib/ext目錄下:
五. 第五步 —— 運行jmeter,添加java請求,進行測試
目標:使用jmeter測試我們編寫的java請求
運行jmeter
添加線程組
在線程組下添加Java請求
設置Java請求,在Classname中選擇我們編寫的TestIHRMLogin請求,填入mobile:13800000002,password:123456
從Listener中添加查看結果樹
保存、運行、查看結果
保存
運行
查看結果
結果樹中的返回結果為:
{"success":true,"code":10000,"message":"操作成功!","data":"ec309ba7-c7ee-4b9b-a6da-8161d3ed9569"}
啟動Jmeter終端的顯示:
Thread Group 1-1是線程名稱
總結:
在本篇文章中,我們主要完成了以下事情:
使用IDE工具IDE開發了jmeter的java請求。
通過jmeter對暴露的api接口JavaSamplerClient來實現編寫能內嵌到jmeter的java請求。
封裝了IHRM項目中的登陸接口
封裝了HTTP協議中的GET請求和Post請求
使用IDEA構建jar包
使用maven的pom文件添加依賴包Json
使用IDEA添加了外部依賴包ApacheJmeter_code.jar和ApacheJmeter_java.jar
但重點是,我們成功的編寫java請求的接口,并實現了在jmeter中成功調用和驗證返回結果
總結
以上是生活随笔為你收集整理的jmeter java接口_JMeter接口Java开发五步曲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支持商用,开源的商城系统,推荐给你
- 下一篇: 启动activity的标准的action