今天,聽段唸的培訓,學了一下Jmeter寫Java請求的過程。java
根據某博文,修改其中代碼的bug後,貼在下面吧;另外公司一同窗Raylupas在半年前也寫過關於JMeter寫Java Sampler的文章,如今終於看明白了,寫得很是的好啊,其Word版做爲附件吧。apache
咱們在作性能測試時,有時須要本身編寫測試腳本,不少測試工具都支持自定義編寫測試腳本,好比LoadRunner就 有不少自定義腳本的協議,好比"C Vuser","Java Vuser"等協議.一樣,Jmeter也支持自定義編寫的測試代碼,不過與LoadRunner不一樣的是,Jmeter沒有自帶編譯器,須要藉助第三方 編譯器才能實現.下面舉一個簡單的Java自定義測試代碼例子,使用Java編譯器編寫測試代碼(Java編譯器能夠用Eclipse,JBulider 等),實現功能爲:在測試前輸入任意一個字符串,而後判斷該字符串的長度是否大於5,若是大於則測試結果成功,不然測試結果位失敗,而後在放到 Jmeter中模擬10個用戶測試,同時運行這段代碼,具體實現以下:app
1.打開Java編譯器,新建一個項目"TestLength",而後新建一個包"app".ide
2.從Jmeter的安裝目錄lib\ext中拷貝兩個文件"ApacheJMeter_core.jar" 和"ApacheJMeter_java.jar"到"Tester"的項目中,而後引入這兩個JAR文件.(具體的引入方法參考各個Java編譯器的使 用方法)函數
3.在"app"包中新建一個類,名字叫"TestLength",不過這個類要繼承"AbstractJavaSamplerClient"類,若是項目引入步驟二中的兩個文件,就能夠找到"AbstractJavaSamplerClient"類了.工具
4."TestLength"類在繼承"AbstractJavaSamplerClient"類的同時也會繼承四個方法,分別 是"getDefaultParameters","setupTest","runTest"和"teardownTest"方 法."getDefaultParameters"方法主要用於設置傳入的參數;"setupTest"方法爲初始化方法,用於初始化性能測試時的每一個線 程."runTest"方法爲性能測試時的線程運行體;"teardownTest"方法爲測試結束方法,用於結束性能測試中的每一個線程.性能
5.具體實現代碼以下:測試
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;
/**
* @author 笑遍世界
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style. - Code Templates
*/
public class TestLength extends AbstractJavaSamplerClient{
private SampleResult results;
private String testStr;this
//初始化方法,實際運行時每一個線程僅執行一次,在測試方法運行前執行,相似於LoadRunner中的init方法spa
public void setupTest(JavaSamplerContext arg0) {
results = new SampleResult();
testStr = arg0.getParameter("testString", "");
if (testStr != null && testStr.length() > 0) {
results.setSamplerData(testStr);
}
}
//設置傳入的參數,能夠設置多個,已設置的參數會顯示到Jmeter的參數列表中
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("testStr", "abc"); //定義一個參數,顯示到Jmeter的參數列表中,第一個參數爲參數默認的顯示名稱,第二個參數爲默認值
return params;
}
//測試執行的循環體,根據線程數和循環次數的不一樣可執行屢次,相似於LoadRunner中的Action方法
@SuppressWarnings("deprecation")
public SampleResult runTest(JavaSamplerContext context) {
int len = 0;
results.sampleStart(); //定義一個事務,表示這是事務的起始點,相似於LoadRunner的 lr.start_transaction
testStr = context.getParameter("testStr");
len = testStr.length();
results.sampleEnd(); //定義一個事務,表示這是事務的結束點,相似於LoadRunner的 lr.end_transaction
results.setDataEncoding("UTF-8");
if(len < 5){
System.out.println(testStr);
results.setResponseCode("testStr:"+testStr);
results.setResponseData("testStr:"+testStr);
results.setSuccessful(false); //用於設置運行結果的成功或失敗,若是是"false"則表示結果失敗,不然則表示成功
}else{
results.setResponseCode("testStr:"+testStr);
results.setResponseData("testStr:"+testStr);
results.setSuccessful(true);
}
return results;
}
//結束方法,實際運行時每一個線程僅執行一次,在測試方法運行結束後執行,相似於LoadRunner中的end方法
public void teardownTest(JavaSamplerContext arg0) {
}
}
六、把上面的例子打包,而後把生成的"TestLength。jar"文件拷貝到Jmeter的安裝目錄lib\ext下。
七、運行Jmeter,添加一個線程組,而後在該線程組下面添加一個Java請求(在Sampler中),在Java請求的類名稱中選擇我們剛 建立的類"app。TestLength",在下面參數列表的"testStr"後面輸入要測試的字符串,而後添加一個監聽器(聚合報告),設置一下模擬 的用戶數就能夠測試了。若是測試不成功,Jmeter會在它本身個輸出框中拋出這個字符串。
經過上面的例子咱們能夠發現,使用Jmeter自定義Java測試代碼,配合Jmeter自帶的函數,就能夠實現出LoadRunner 中"Java Vuser"協議的絕大多數功能,並且是沒有用戶數限制和徹底免費的(嘿嘿)。上面的例子很是簡單,並且沒有任何實際意義,只是一個簡單的Jmeter測 試代碼示例,用於拋磚引玉,但願你們一塊兒交流,共同進步。