一、環境准備
1、新建一個java工程
2、導入jar包:ApacheJMeter_core.jar ApacheJMeter_java.jar
這兩個jar是使用jmeter最基礎的jar,能夠讓你的代碼在jmeter中運行起來,如果在寫代碼的過程中需要其他的jar,自行導入。
二、寫代碼前該知道的
1、如果想要讓你的代碼在jmeter中運行起來,在創建類的時候需要去繼承AbstractJavaSamplerClient抽象類或者是實現JavaSamplerClient接口
AbstractJavaSamplerClient抽象類是JavaSamplerClient接口的子類,當你不需要復寫所有的需要復寫的方法時,那么你只需要去繼承AbstractJavaSamplerClient抽象類即可。
如果你選擇了實現JavaSamplerClient接口,那么你需要復寫的方法有:
public SampleResult runTest(JavaSamplerContext context) {}
public void setupTest(JavaSamplerContext context) {}
public void teardownTest(JavaSamplerContext context) {}
public Arguments getDefaultParameters() {}
這4個方法就必須要復寫,但是如果選擇繼承AbstractJavaSamplerClient這個抽象類,那么只需要復寫你需要的方法即可。
2、方法說明:
public Arguments getDefaultParameters() {}
這個方法由Jmeter在進行添加javaRequest時第一個運行,它決定了你要在GUI中默認顯示出哪些屬性。
public void setupTest(JavaSamplerContext context) {}
這個方法相當於loadrunner中的init,我們可以用它來進行一些初始化的動作。
public SampleResult runTest(JavaSamplerContext context) {}
這個方法相當於loadrunner中的action,我們的核心測試代碼就在這里了。
public void teardownTest(JavaSamplerContext context) {}
這個方法相當於loadrunner中的end,收尾的工作可以由它來做。
3、除了以上2點,我們一般還需要去實現Serializable,序列化標記接口,這樣可以讓我們的類去實現序列化。
三、代碼書寫
package com.lingfeng.jmeter.practice;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
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 MyJavaRequest extends AbstractJavaSamplerClient implements Serializable {
private static final long serialVersionUID = 1L;
private String sUrl;//存儲用戶輸出的url
private static final String URL_NAME="URL" ;//設置GUI頁面顯示的變量名稱
//設置GUI頁面默認顯示的變量值,默認值就是訪問百度
private static final String URLVALUE_DEFAULT="http://www.baidu.com";
//resultData變量用來存儲響應的數據,目的是顯示到查看結果樹中。
private String resultData;
StringBuilder sbResultData = new StringBuilder();
/*
* 這個方法用來控制顯示在GUI頁面的屬性,由用戶來進行設置。
* 此方法不用調用,是一個與生命周期相關的方法,類加載則運行。
* (non-Javadoc)
* @see org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient#getDefaultParameters()
*/
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument(URL_NAME, String.valueOf(URLVALUE_DEFAULT));
return arguments;
}
@Override
public void setupTest(JavaSamplerContext context) {
sUrl = context.getParameter(URL_NAME, URLVALUE_DEFAULT);
if(sUrl.length()==0){
sUrl="http://www.baidu.com";//假如用戶沒有設置url,那么就讓他訪問百度,哈哈。
}
}
@Override
public SampleResult runTest(JavaSamplerContext context) {
/*
* SampleResult這個類是用來將測試結果輸出到查看結果樹中的。
* 並且也是用來控制事務的開始和結束的。
*/
SampleResult results = new SampleResult();
results.setSampleLabel("測試"+sUrl+"網站訪問速度了啊!!");
try{
URL url = new URL(sUrl);
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
byte[] buffer = new byte[1024];
int len;
//事務開始標記
results.sampleStart();
while((len=in.read(buffer))!=-1){
resultData = new String(buffer,"UTF-8");//將每次讀到的頁面返回信息存儲到resultData中
sbResultData.append(resultData);//每讀到一次,添加到sb中。
}
in.close();
}catch (MalformedURLException e) {
results.setSuccessful(false);
e.printStackTrace();
}catch (IOException e) {
results.setSuccessful(false);
e.printStackTrace();
}catch(Exception e){//如果發生異常,則捕捉,並且發送事務失敗的消息。
results.setSuccessful(false);
e.printStackTrace();
}finally{
//標記事務結束
results.sampleEnd();
}
results.setSuccessful(true);
resultData = sbResultData.toString();//將所有讀到的數據轉換為字符串
results.setResponseData(resultData,null);//將數據打印到查看結果樹當中
results.setDataType(SampleResult.TEXT);
return results;
}
}
四、jmeter運行java代碼
1、將代碼打包成jar
2、把打包成的jar放在\apache-jmeter-2.12\lib\ext路徑下
3、打開jmeter GUI,添加線程組,再添加一個java請求,如下圖:
4、添加查看結果樹,運行后結果如下:
五、補充事項
當我們的代碼在運行時發生異常,就會被打印在doc窗口中
我這里沒有發生異常,所以沒有數據,當發生異常時就會打印在這里。注意觀察,有助於調試代碼
六、最后的話
其實由以上的代碼可以看出,這一段測試代碼其實沒有太大的測試意義,就是模擬了一個HTTP請求訪問一個網站。
但是當我們需要進行一段代碼的性能測試的時候,這樣來進行書寫,並且在runTest方法中進行調用后,那么就可以測試出這段代碼的性能如何。
經常總結,互相學習!!
