JMeter進(jìn)階—詳解Java sampler的設(shè)計(jì)方法(附源碼)
JMeter Java Sampler介紹
我們通常使用jmeter做http或者h(yuǎn)ttps請(qǐng)求的測(cè)試,但是有些場景我們需要直接調(diào)用Java接口進(jìn)行性能測(cè)試, jmeter通過Java請(qǐng)求可以實(shí)現(xiàn)該需求(這樣就可以處理一些公司自定義的協(xié)議了,開發(fā)提供協(xié)議接口,然后我們通過java sampler進(jìn)行調(diào)用)。本文將會(huì)詳細(xì)介紹jmeter中如何編寫 java請(qǐng)求并對(duì)其進(jìn)行調(diào)用!
添加Java請(qǐng)求

Java請(qǐng)求如下:

其中上圖里com.my.demo.JmeterDemo2,即我們需要調(diào)用的Java類;str是我們需要傳入的參數(shù)。那么Jmeter中如何實(shí)現(xiàn)對(duì)java請(qǐng)求的調(diào)用呢?我會(huì)在本文詳細(xì)講解!
設(shè)計(jì)Java請(qǐng)求思路與代碼解析
如何編寫jmeter java請(qǐng)求,簡單地說分如下幾點(diǎn):
1寫一個(gè)類,叫做Demo,使其繼承AbstractJavaSamplerClient;
2.在public SampleResult runTest(JavaSamplerContext arg0)方法里,寫處理java代碼的邏輯;
3.在public Arguments getDefaultParameters()方法里定義從jmeter中傳入java代碼的參數(shù);
4.把類Demo 打成jar包并放入jmeter的\lib\ext 目錄下(如果Demo需要依賴其它jar包需要一起放入\lib\ext目錄下)
實(shí)例代碼如下:
- import org.apache.commons.lang3.StringUtils;
- 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 JmeterDemo2 extends AbstractJavaSamplerClient
- {
- private SampleResult sr;
- public Arguments getDefaultParameters() {
- Argumentsparams = new Arguments();
- params.addArgument("str", "");
- return params;
- }
- public SampleResult runTest(JavaSamplerContext arg0) {
- this.sr.setSampleLabel("commonsio-demo2");
- try {
- Stringstr=arg0.getParameter("para");
- //使用jar包中StringUtils類的countMatches方法來統(tǒng)計(jì)字符串a(chǎn)的個(gè)數(shù)
- int num=StringUtils.countMatches(str, "a");
- if (num==0) {
- this.sr.setResponseMessage("ResponseMessage:參數(shù)匹配0個(gè)"); //Sample Result 中的Response message
- this.sr.setResponseData("ResponseData:參數(shù)匹配0個(gè)","UTF-8"); //Response Data的值,會(huì)被后面的覆蓋
- this.sr.setSuccessful(true);//Sample Result 中的結(jié)果
- }else {
- this.sr.setResponseMessage("ResponseMessage:參數(shù)匹配"+num+"個(gè)");
- this.sr.setResponseData("ResponseData:參數(shù)匹配"+num+"個(gè)","UTF-8");
- this.sr.setSuccessful(false);
- }
- }catch (Exception e) {
- this.sr.setResponseMessage(e.getMessage().toString());
- this.sr.setSuccessful(false);
- }finally {
- //this.sr.setResponseData("結(jié)束測(cè)試", "UTF-8");
- super.getNewLogger().info("####測(cè)試執(zhí)行####");
- try {
- Thread.sleep(500);
- }catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return this.sr;
- }
- public void setupTest(JavaSamplerContext context) {
- super.setupTest(context);
- super.getNewLogger().info("####測(cè)試開始####");
- this.sr = new SampleResult();
- this.sr.sampleStart();
- }
- public void teardownTest(JavaSamplerContext context) {
- super.teardownTest(context);
- this.sr.sampleEnd();
- super.getNewLogger().info("####測(cè)試結(jié)束####");
- }
- }
這里對(duì)上述代碼做詳細(xì)分析:
主要用到的方法如下:

方法執(zhí)行的先后順序?yàn)椋?/p>
getDefaultParameters() -->
setupTest(JavaSamplerContext context)-->
runTest(JavaSamplerContext context) -->
teardownTest(JavaSamplerContext context)
代碼運(yùn)行后,打開日志結(jié)果如下,參數(shù)para 對(duì)應(yīng)代碼String str=arg0.getParameter("para");

從日志中可以看到
setupTest(JavaSamplerContext context) 中的代碼被執(zhí)行1次,打印
####測(cè)試開始####
teardownTest(JavaSamplerContext context) 中的代碼被執(zhí)行1次,打印
####測(cè)試結(jié)束####
而runTest中的方法super.getNewLogger().info("####測(cè)試執(zhí)行####"); 被執(zhí)行5次,因?yàn)樵诰€程組中,設(shè)置執(zhí)行5次。(線程組線程執(zhí)行的次數(shù),影響java請(qǐng)求中的runTest,而不會(huì)影響setupTest和teardownTest)。方法super.getNewLogger().info("")會(huì)把值寫入日志。
setResponseMessage("ResponseMessage:參數(shù)匹配0個(gè)");打印到Sample Result 中的Response message里;setSampleLabel("commonsio-demo2");設(shè)置java請(qǐng)求的顯示名稱,如下圖:

setResponseData("ResponseData:參數(shù)匹配0個(gè)","UTF-8"); 打印到Response Data,如下圖:

最后,方法setSuccessful(true)會(huì)影響測(cè)試結(jié)果
在IDE中開發(fā)Jmeter Java 請(qǐng)求
在IDE中開發(fā)Jmeter Java 請(qǐng)求與普通java開發(fā)一致,引入需要的java包以及jmeter相關(guān)jar包即可,引入Jmeter lib\ext下的ApacheJMeter_core.jar和ApacheJMeter_java.jar到IDE中!