前言
針對非http協議需要進行測試,對於這些協議,市場上可能沒有現成的工具可以直接使用。這時候我們就可以通過編寫相應的Java采樣器來做自己的工作,高效的進行性能測試工作。
環境准備
java環境已經搭建好了
jmeter環境已經搭建好了
idea開發環境已經配置
二次開發前提
- 需要 lib/ext 中的 Apache JMeter_core.jar
- 擴展 Java 請求也需要 Apache JMeter_ java.jar
- 擴展 HTTP 請求需要 Apache JMeter_ http.jar
- 導入jar包,自己導入
Jmeter Java 采樣器
public Arguments getDefaultParameters(); 可選,定義可用參數和默認值,獲取接口參數;
public void setupTest(JavaSamplerContext arg0);可選, 初始化工作相當於setUp();
public SampleResult runTest(JavaSamplerContext arg0);必選, 相當於 Action;
public void teardownTest(JavaSamplerContext arg0);可選, 相當於 tearDown();
方法執行順序
getDefaultParameters() > setupTest(JavaSamplerContext arg0) > runTest(JavaSamplerContext arg0) > teardownTest(JavaSamplerContext arg0)
常用方法
- addArgument("name", "value") 定義參數
- sampleStart()定義了一個事務的開始,類似於lr_start_transaction的LR,就像LR一樣,事務之間不要放不相關的代碼
- sampleEnd() 定義一個事務的結束,類似於lr_end_transaction的LR
- setSuccessful(true, false) 設置運行結果的成功或失敗。Jmeter統計成功和失敗的次數,可以反映在聚合報告中。
類繼承
做二次開發的時候,大家都知道自己定義的類需要繼承AbstractJavaSamplerClient,但是大家要知道為什么要繼承這個類而不是其他類。為了更清楚的理解代碼,我們來看一下代碼如下:
public abstract class AbstractJavaSamplerClient implements JavaSamplerClient { private static final Logger log = LoggerFactory.getLogger(AbstractJavaSamplerClient.class); private static final org.apache.log.Logger oldLogger = LoggingManager.getLoggerForClass(); public AbstractJavaSamplerClient() { } public void setupTest(JavaSamplerContext context) { log.debug(this.getClass().getName() + ": setupTest"); } public void teardownTest(JavaSamplerContext context) { log.debug(this.getClass().getName() + ": teardownTest"); } public Arguments getDefaultParameters() { return null; } /** @deprecated */ @Deprecated protected org.apache.log.Logger getLogger() { return oldLogger; } protected Logger getNewLogger() { return log; } }
從上面的代碼我們可以看出,有構造方法和三種常用方法。這三種方法熟悉嗎?是的,前面已經提到過。但是,仍然缺少一個 runTest 方法,那么它在哪里呢?它必須在此類 JavaSamplerClient 中。讓我們繼續代碼如下:
public interface JavaSamplerClient { void setupTest(JavaSamplerContext var1); SampleResult runTest(JavaSamplerContext var1); void teardownTest(JavaSamplerContext var1); Arguments getDefaultParameters(); }
好了,既然知道了這四種方法的來源,在自己的類中,來實現功能,其實就可以重寫這四種方法來實現自己的功能了。有了思路,我們真的來寫個demo。
輸出兩個參數,
package com.czq.com; 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_router: jiapengchu * @date: 2021-10-17 * */ public class PalindromeDemo extends AbstractJavaSamplerClient { private String name; private int age; @Override public SampleResult runTest(JavaSamplerContext javaSamplerContext) { return null; } @Override public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("name","tom"); params.addArgument("age","18"); return params; } }
導出jar 包放到 lib/ext 目錄下查看
完整代碼
package com.czq.com; 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_router: jiapengchu * @date: 2021-10-17 * */ public class PalindromeDemo extends AbstractJavaSamplerClient { // 聲明變量 private String name; private String age; @Override public Arguments getDefaultParameters() { Arguments params = new Arguments(); // 設置參數 params.addArgument("name","tom"); params.addArgument("age","18"); return params; } @Override public void setupTest(JavaSamplerContext arg0) { // 獲取變量值 name = arg0.getParameter("name"); age = arg0.getParameter("age"); } @Override public SampleResult runTest(JavaSamplerContext arg0) { SampleResult sr = new SampleResult(); // 邏輯處理 sr.setSamplerData("Request parameters name The values of are:"+name); sr.setSamplerData("Request parameters age The values of are:"+age); try{ // jmeter start statistics response time mark \ sr.sampleStart(); int iage = Integer.parseInt(age); if(iage<0){ sr.setResponseData("age can not be possive number","utf-8"); sr.setSuccessful(false); } else if(iage==0) { sr.setResponseData("age must be >0","utf-8"); sr.setSuccessful(false); }else { sr.setResponseData(name+"恭喜,注冊成功","utf-8"); sr.setSuccessful(true); } } catch(Throwable e) { sr.setSuccessful(false); e.printStackTrace(); }finally { sr.sampleEnd(); } return sr; } }
導出jar包后,測試
到此演練結束