jmeter不仅仅可以压测http、jdbc等常见应用场景,而且可以测试自定义的java请求。大多数情况下我们不会用到这种情况,但是有些情况下确实需要我们自己定义一个java请求取样器。例如我在使用服务器驱动连接Neo4j的时候,就需要自己定义这个操作。当然Neo4j也是支持jdbc的。下面以 Neo4j 的服务器驱动为例说明整个流程。
1、配置
在Java工程中添加JMETER_HOME/lib目录下的jar包到你的依赖中。新建一个java类,继承AbstractJavaSamplerClient抽象类或实现JavaSamplerClient接口。AbstractJavaSamplerClient类可以不重写getDefaultParameters方法。
2、定义
重写下面方法
public Arguments getDefaultParameters() //设置可用参数及的默认值
public void setupTest(JavaSamplerContext arg0) //每个线程测试前执行一次,做一些初始化工作
public SampleResult runTest(JavaSamplerContext arg0) //开始测试,从arg0参数可以获得参数值
public void teardownTest(JavaSamplerContext arg0) //测试结束时调用
基于Neo4j的案例。
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.neo4j.driver.v1.*;
public class Match extends AbstractJavaSamplerClient{
private Driver driver = null;
private Session session = null;
@Override
public void setupTest(JavaSamplerContext context) {
driver = GraphDatabase.driver("bolt://IP:7687", AuthTokens.basic("neo4j", "neo4j"));
session = driver.session();
}
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
SampleResult sampleResult = new SampleResult();
sampleResult.sampleStart(); //计时开始
try {
//执行你的操作
StatementResult res = session.run("match(n:Person{name:913000}) return n.name as name, n.s1 as s1");
sampleResult.sampleEnd(); //计时结束
sampleResult.setSuccessful(true); //成功
String tmp="";
tmp = res.toString();
while(res.hasNext())
{
tmp += res.next().toString()+"\n";
}
sampleResult.setResponseData(tmp, null); //返回结果
sampleResult.setDataType(SampleResult.TEXT);
return sampleResult;
} catch (Exception e) {
sampleResult.sampleEnd(); //计时结束
sampleResult.setSuccessful(false); //失败,Error
//e.printStackTrace();
sampleResult.setResponseData(e.getMessage(), null);
return sampleResult;
}
}
@Override
public void teardownTest(JavaSamplerContext context) {
// TODO Auto-generated method stub
session.close();
driver.close();
}
}
本例中不需要传参,所以没有重写getDefaultParameters()方法。setupTest()做一些初始化工作,这里连接Neo4j。runTest()是测试主题,定义自己的测试内容,返回结果等。SampleResult类用来计时,返回结果树的内容等。teardownTest()做测试结束的处理工作,这里关闭连接。
如果我们起了10个线程,循环100次,则总共执行10*100 = 1000次。意味着,setupTest()方法执行了10次,runTest()方法执行了1000次,teardownTest方法执行了10次。
3、使用
将编写好的Java工程导出为jar包,放到jmeter的lib/ext目录下。启动jmeter,根据需要添加线程组。右击线程组添加-->取样器-->Java请求。
在类名称选择自定义的类名。如果需要传参,则在下面同请求一起发送参数添加所需参数即可。
依次添加需要的监听器,启动测试即可。如果在Linux下测试,则需要把所有依赖包都copy到Linux的jmeter所在lib对应目录中。对于上述流程不熟悉的同学,可以参考前一篇文章。
4、结束语
该系列文章到此结束,在第一篇文章中也说明了本系列文章不适用于系统学习jmeter,主要用于非测试人员快速完成测试任务,在下在此之前也从未接触过jmeter。如果有什么错误的地方,欢迎指正。