Jmeter之JAVA Request的应用

当我们使用Jmeter进行接口测试的时候,我们一定会遇到一个问题,那就是如果这些接口不是http协议的,是经过封装以后的接口,用Jmeter该怎么解决呢?

当你想到这个问题,说明你已经了解Jmeter的一些初级应用了,接下来的应用就涉及一些编程能力了,首先我们知道Jmter是纯JAVA开发的工具,也就是说只要你能通过JAVA代码实现的接口请求,在Jmeter中都可以实现,比如JAVA Request,接下来将介绍一些JAVA Request的使用,这次使用的接口是我上次使用的HTTPS请求接口。如果嫌这样麻烦可以找其他实例中的接口,我这里为了方便,并且是有目的性的,实践遇到过坑,所以就这么用了。

1,首先创建一个JAVA工程,这个就不仔细说了。

2,将Jmter的lib目录下的jar文件添加进此工程的Build Path,主要是为了接下来我们要集成Jmeter中的抽象类,所以相当于引用jar包,具体哪几个是必须要引用的还是不太清楚,所以就干脆全引用了。

3.创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写:
1)public Arguments getDefaultParameters():设置可用参数及的默认值;
2)public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
3)public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;
4)public void teardownTest(JavaSamplerContext arg0):测试结束时调用;

4.Export为Runnable Jar File;
5.将此jar包放入JMETER_HOME\lib\ext目录;
6.以管理员身份打开JMeter;
7.创建线程组、Java Request、结果树,进行测试;

好了,接下来就上实例

一个是我写好的接口,另一个是JAVA Request类,

这里主要讲JAVA Request的应用,那个类参考我的HTTPS POST JSON的JAVA实现

package https;
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;
import https.PostJson;
import java.net.MalformedURLException;


public class JavaTest extends AbstractJavaSamplerClient {


private PostJson postjson = null;
private String url;
private String charset;
private String content;
private static long start;
private static long end;
private String resultData;
@Override 
public Arguments getDefaultParameters(){
Arguments params = new Arguments();  
       params.addArgument("url", "0");  
       params.addArgument("charset", "0"); 
       
       return params;

}
@Override
public void setupTest(JavaSamplerContext arg0){
postjson = new PostJson();
url = arg0.getParameter("url");
charset = arg0.getParameter("charset");

start = System.currentTimeMillis();
}
@Override
public SampleResult runTest(JavaSamplerContext arg0){
SampleResult sr = new SampleResult(); 
sr.setSamplerData("请求地址"+url+"编码格式"+charset);
try { 
sr.sampleStart();// jmeter 开始统计响应时间标记
String str = new String(postjson.post(url, charset).getBytes(),"UTF-8");
resultData = str;
if (resultData != null && resultData.length() > 0) {  
                sr.setResponseData("结果是:"+resultData, null);  
                sr.setDataType(SampleResult.TEXT);  
            }  
            Thread.sleep(10);  
             System.out.println(resultData);  
            sr.setSuccessful(true);  
        } catch (Throwable e) {  
            sr.setSuccessful(false);  
            e.printStackTrace();  
        } finally {  
            sr.sampleEnd();// jmeter 结束统计响应时间标记  
        }  
        return sr;  
    }
@Override
public void teardownTest(JavaSamplerContext arg0) {  
        end = System.currentTimeMillis();  
        // 总体耗时  
        System.err.println("cost time:" + (end - start) + "毫秒");  
    }  
public static void main(String[] args) {  
Arguments params = new Arguments();  
        /*Arguments params = new Arguments();  
        params.addArgument("url", "https://bapi.txffp.com/api/service/fpkk");  
        params.addArgument("charset", "UTF-9"); 
        */
        

       
      //  JavaSamplerContext arg0 = new JavaSamplerContext(params);  
        JavaTest test = new JavaTest();  
      //  test.getDefaultParameters();
        JavaSamplerContext arg0 = new JavaSamplerContext(test.getDefaultParameters());
        test.setupTest(arg0);  
        test.runTest(arg0); 
        test.teardownTest(arg0);  
   } 
}

重写的第一个方法getDefaultParameters,这里是我们请求这个接口是的一些参数,我这里传了URL和CHARSET,为什么不传报文后边会说,这个方法的主要作用就是,

当我们在Jmeter中未传递这个接口的参数时,它做的默认处理,直接写在这里,这样当我们不传参数的时候就自动填写了。

重写的第二个方法setupTest,这里是我们在每个线程执行任务的时候进行的一些初始化工作,将我们已经初始化好的参数作为形参传入第二个函数中,然后通过arg0.getParameter

的方法获得参数

重写的第三个方法runTest,在这个方法里面主要是设置请求报文,并添加测试结果,通过程序进行判断请求成功或者失败,相当于断言。

重写的第四个方法tearDownTest,主要是请求结束后需要我们做的一些事情,我这里记录了请求结束的时间,用来计算请求耗时

在运行时我们既可以通过添加主函数运行也可以通过Jmeter运行,但是我这里试了两种方法,1,在主函数中自己构建参数,2,直接引用getDefaultParameters,这里遇到的问题就是

即使,你自己构建了参数,在Jmeter运行时依然显示默认构造的参数,而且运行时也是传的默认构造的参数,也就是说自己构建的参数没有生效,但是如果通过eclipse运行,那么他取得

参数就是你自己构建的。这个也是自己第一天没写完的原因,当时写到这里心生疑惑,后来看了一下官方api便试了一下,所以大家还是要多动手。





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值