当我们使用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便试了一下,所以大家还是要多动手。