使用JMeter做性能測試時,我們通常都是需要自己編寫測試腳本,才能滿足測試用例的需求,Jmeter也是支持我們自定義編寫測試腳本的,而且支持Java、Python等多種語言。在這裏,我們選擇使用Java語言開發測試腳本,是因爲Jmeter本身也是用Java實現的,所以使用Java開發腳本會更好。
首先,使用Eclipse或者IntelliJ IDEA來新建一個項目,然後新建一個包,再從Jmeter的lib/ext目錄下中拷貝ApacheJMeter_java.jar和ApacheJMeter_core.jar兩個文件,然後引入這兩個JAR包到項目中。在IntelliJ IDEA中的操作如下:
點擊File->Project Structure
點擊Project Structure界面左側的Modules
在Dependencies標籤界面下
點擊底部的+號,
選擇第一個選項JARs or directories…
選擇相應的jar包,點擊OK
然後,我們在包中新建一個TestNum類,該類繼承ApacheJMeter_java.jar包中的AbstractJavaSamplerClient類,引用它就可以調用了。在繼承AbstractJavaSamplerClient類的時候,我們需要實現4個方法:
setupTest():初始化方法,用於初始化性能測試時的每個線程,實際運行時每個線程僅執行一次
getDefaultParameters():用於設置傳入的參數,可以設置多個,已設置的參數會顯示到Jmeter參數列表中
runTest():性能測試時的線程運行體,即測試執行的循環體,根據線程數和循環次數的不同可執行多次
teardownTest():測試結束方法,用於結束性能測試中的每個線程,實際運行時,每個線程僅執行一次,在測試方法運行結束後執行
具體的代碼實現如下:
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class TestNum extends AbstractJavaSamplerClient {
// SampleResult類封裝了從入口樣本返回的各種信息
private SampleResult results;
// 輸入的數字
private String inNum;
// 需要匹配的數字
private String resultNum;
// 用於設置傳入的參數,可以設置多個,已設置的參數會顯示到Jmeter參數列表中
// Arguments類表示一組參數對象
public Arguments getDefaultParameters() {
// 聲明定義Arguments類
Arguments params = new Arguments();
// 添加一個新參數
params.addArgument("inNum", "");
params.addArgument("resultNum", "66");
return params;
}
// 初始化方法,用於初始化性能測試時的每個線程,實際運行時每個線程僅執行一次
//
// JavaSamplerContext類用於向JavaSamplerClient實現提供上下文信息
// 這當前由在GUI中指定的初始化參數組成,其他數據將來可以通過JavaSamplerContext訪問
public void setupTest(JavaSamplerContext jsc) {
// 定義SampleResult類
results = new SampleResult();
// 以String形式獲取指定參數的值,或者如果未指定該值,則返回指定的默認值
inNum = jsc.getParameter("inNum", "");
resultNum = jsc.getParameter("resultNum", "");
if (inNum != null && inNum.length() > 0) {
// 設置採樣器數據
results.setSamplerData(inNum);
}
if (resultNum != null && resultNum.length() > 0) {
results.setSamplerData(resultNum);
}
}
// 性能測試時的線程運行體,即測試執行的循環體,根據線程數和循環次數的不同可執行多次
public SampleResult runTest(JavaSamplerContext arg0) {
boolean flag = false;
// 定義一個事務,表示這是事務的起始點
results.sampleStart();
for (int i = inNum.length(); --i >= 0; ) {
// 使用isDigit判斷是否爲數字,charAt方法用於返回指定索引處的字符
if (!Character.isDigit(inNum.charAt(i))) {
flag = false;
} else {
flag = true;
}
}
for (int j = resultNum.length(); --j >= 0; ) {
if (!Character.isDigit(resultNum.charAt(j))) {
flag = false;
} else {
flag = true;
}
}
// 定義一個事務,表示這是事務的結束點
results.sampleEnd();
if (flag) {
Integer num = Integer.parseInt(inNum);
Integer rsNum = Integer.parseInt(resultNum);
if (num == rsNum) {
// 設置SampleResult對象的編碼和響應數據
results.setResponseData("恭喜你,答對了O(∩_∩)O~\n答案是【" + resultNum + "】", "UTF-8");
// 設置SampleResult對象的成功屬性,即返回正確還是錯誤
results.setSuccessful(true);
} else if (num > rsNum) {
results.setResponseData("好像大了點~~~~(>_<)~~~~ \n您輸入的是【" + inNum + "】", "UTF-8");
results.setSuccessful(false);
} else {
results.setResponseData("好像小了點~~~~(>_<)~~~~ \n您輸入的是【" + inNum + "】", "UTF-8");
results.setSuccessful(false);
}
} else {
results.setResponseData("請輸入數字:~~~~(>_<)~~~~ \n您輸入的inNum是【" + inNum + "】,resultNum是【" + resultNum + "】", "UTF-8");
results.setSuccessful(false);
}
return results;
}
// 測試結束方法,用於結束性能測試中的每個線程,實際運行時,每個線程僅執行一次,在測試方法運行結束後執行
public void teardownTest(JavaSamplerContext arg0) {
}
}
然後將上面的代碼打包成jar包,生成的包名稱爲TestNum.jar,在IntelliJ IDEA中的操作如下:
點擊File->Project Structure
點擊Project Structure界面左側的Artifact
依次點擊底部的+>JAR>Empty
輸入這個jar的Name,下面有這個jar包生成的路徑Output directory
在Output Layout中點擊+>Module Output給這個jar包添加Module Output
點擊OK退出Project Structure面板
最後依次點擊Build>Build Artifacts…>TestNum>Build/Rebuild
生成jar包後,將jar包拷貝到Jmeter的lib/ext目錄下。之後啓動Jmeter,添加線程組和Java請求,同時爲了方便,我們用隨機數函數(選項--函數助手)來隨機抽取數字,驗證與resultNum匹配的結果,再添加察看結果樹和聚合報告。
設置線程數爲10,執行後可以看到,10個請求中,有3個請求回答正確,響應數據對應了我們的代碼,表示執行成功。
通過使用Jmeter自定義Java測試代碼,再配合Jmeter自帶的各種函數,就可以實現絕大多數的性能測試需求。
轉載自原文:https://blog.csdn.net/hekaiyou/article/details/79439046