您的位置:首页 > 数据库 > Mongodb

JMeter开发插件之一(JMeter开发Java Request Sampler测试mongodb)

2016-10-24 14:16 393 查看

前言

目前,在整个互联网上很少找到关于使用JMeter测试mongodb的文章,因此通过学习并参考一些文章后,再经过实践,将分享给大家在JMeter的Java Request中如何测试mongodb,当然希望大家可以举一反三的思维,测试不同的数据库(Mysql,Oracle和Sql Server),而不仅仅限制于测试mongodb。希望对测试人员有所帮助,如果文章

中有描述错误,请大家指出,谢谢。

学习参考文档地址:http://blog.csdn.net/xreztento/article/details/52473418

简介

在Jmeter提供了一种纯java的编码方式来构建Sampler的组件,但构建java sampler的前提条件必须要有java的编程基础。通过继承AbstractJavaSamplerClient抽象类后重写setupTest,runTest和teardownTest的方法可以构建成为JAVA Sampler的组件。

案例设计以及实现创建思路

1.编写一个访问mongodb的类,并提供一个查询数据的方法。访问mongodb的类称为MongodbClient,查询方法称为query,该方法的返回数据类型为MongoCursor。

2.编写一个TestMongodbSamplerClient通过继承AbstractJavaSamplerClient抽象类后重写setupTest,runTest和teardownTest的方法,在runTest方法中实现调用query的查询方法,并将返回的设置在result.setResponseData()方法中,以便可以在查看结果树(View Result Tree)中看到响应的数据。

开发环境

1.编写MongodbClient类的代码必须将mongo-java-driver-3.3.0.jar文件导入到项目工程中。可到mongodb的官方进行下载,下载地址:http://mongodb.github.io/mongo-java-driver/,该jar文件除了在项目工程中引用外,也需要拷贝一份在JMeter的lib中。

2.编写TestMongodbSamplerClient类需要在项目工程下导入以下jar文件,而这些文件可在JMeter的lib目录中找到:

ApacheJMeter_componets.jar

ApacheJMeter_core.jar

ApacheJMeter_java.jar

Jorphan.jar

Logkit-2.0.jar

3.将这些jar文件放入到lib目录下,并进行引用。





编写MongodbClient类

MongodbClient根据数据库的URL地址和数据端口号连接后,通过指定数据库名称获得操作数据库的对象,通过设定集合名称返回操作集合的对象,对集合进行查询操作。

MongodbClient代码如下:

package com.mongodb.client;

import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;

public class MongodbClient<Document, findIterable> {
public MongoClient mongoClient = null;
public MongoDatabase database = null;
public MongoCollection<org.bson.Document> collection = null;
public FindIterable<Document> findIterable = null;
public MongoCursor<Document> mongoCursor = null;

public void ConnectionMongoClient(String host, int port, String databaseName) {
try {
mongoClient = new MongoClient(host, port);
database = mongoClient.getDatabase(databaseName);
System.out.println("Connection Successfully !");

} catch (Exception e) {
System.out.println("Mongodb Connection Exception:");
e.printStackTrace();
}
}

public MongoCursor query(String collectionName, String queryStr) {
collection =  database.getCollection(collectionName);
findIterable =  (FindIterable<Document>) collection.find();
mongoCursor = findIterable.iterator();
System.out.print("Query Successfully !");
String str = "";
return mongoCursor;

}

public void closeConnection() {
if (mongoClient != null) {
mongoClient.close();
}
}

}


编写TestMongodbSamplerClient类

TestMongodbSamplerClient类是必须通过继承AbstractJavaSamplerClient抽象类后,重写方法去实现的。而setupTest、runTest、teardownTest方法是完成整个测试声明周期,其中setupTest与teardownTest在整个线程执行中只执行一次用于初始化和结束。

package test.mongodb.sampler;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.bson.Document;

import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongodbClient;

public class TestMongodbSamplerClient extends AbstractJavaSamplerClient {

public static String host = null;
public static int port = 0;
public String collection = "";
public MongodbClient mc = null;
public MongoCursor<Document> mongoCursor = null;
/* 获取页面填写的参数 */

@Override
public void setupTest(JavaSamplerContext context) {

}

@Override
public SampleResult runTest(JavaSamplerContext arg0) {
// TODO Auto-generated method stub
SampleResult result = new SampleResult();
result.setSampleLabel("MongodbSampler" + Thread.currentThread().getId());
result.sampleStart();
mc = new MongodbClient();
mc.ConnectionMongoClient("10.190.130.73", 27017, "apiDB");
mongoCursor = mc.query("HttpRequestSampler", "");
while(mongoCursor.hasNext()) {
collection = collection + mongoCursor.next().toString() + "\n";
System.out.println("collection" + collection);
}
if (collection != "" || !collection.equals("")) {
result.setResponseData(collection.getBytes());
}else {
result.setResponseData(("the return data is null !").getBytes());
}
mc.closeConnection();
result.setSuccessful(true);
result.sampleEnd();
return result;
}

@Override
public void teardownTest(JavaSamplerContext context) {

}

}


在TestMongodbSamplerClient类中实现的是无参数参数请求,也就是说在JAVARequest中没有设置任何参数。接下来近三个重写的方法作用可进行说明:

public void setupTest(JavaSamplerContextcontext),启动整个线程过程中,该方法只执行一次,在该方法中,我们可以做一些初始化事件的准备或者获

取在JAVA Request中设置的参数的值。获取参数的值的方法如下:

@Override
public
void
setupTest(JavaSamplerContext context) {
host =
context.getParameter("host");
port =
context.getIntParameter("port");
collection =
context.getParameter("collection");
}

使用context.getParameter("host")就是获取host的直,如果设置

host=10.190.130.70,那么host就是10.190.130.70.通过这样的参数设置方法,可更加灵活地设置mongodb的参数,随时可修改成不同的数据库地址,

数据库名称和端口号。PublicSampleResult runTest(JavaSamplerContext arg0),该方法会根据设定的线程数来运行,调用mongodb的操作方法就在

该方法中实现操作,是这个类的核心方法,以下是runTest的代码模版:

@Override
public SampleResult runTest(JavaSamplerContextarg0) {
// TODOAuto-generated method stub
SampleResult result =
new
SampleResult();
result.setSampleLabel("MongodbSampler" + Thread.currentThread().getId());
result.sampleStart();
操作mongodb的核心代码区域。
result.setSuccessful(true);
result.sampleEnd();
return
result;
}

在方法中必须要new一个SampleResult的实例对象,有该对象可以设定View Result tree的响应数据,最后需要返回对象。

result.setSampleLabel(),该方法设定View Result Tree中显示的请求名称和Aggregate Report中的Label名称。

result.sampleStart(),该方法设置执行的开始时间.

result.setResponseData(),该方法设定响应的数据,在View Result Tree中可看到响应的数据。

result.setSuccessful(),该方法设定执行是否成功。
result.sampleEnd(),该方法设置执行结束时间。

当然result对象中原因不止目前介绍的几个操作方法,还有很多的操作,如果还需要其他的设置或者了解更多信息,可以对查看SampleResult类的源代码。

public voidteardownTest(JavaSamplerContext context)在该方法中在整个生命周期中,只执行一次,可在该方法中,编写一些十分资源的一些操作代码。

导出jar包



选择中创建的项目,右键打开Export,在Export窗口中,选择JAR file,将项目导出成为jar文件。



设置输出jar文件的路径。

拷贝导出的jar文件到JMeter的lib/ext目录下



将TestMongodbSampler.jar拷贝到JMeter的lib/ext目录下后,必须要重新启动JMeter工具才生效。

执行TestMongodbSampler插件



启动JMeter后分别创建线程组,Java Request组件,查看结果树以及聚合报告。



创建线程组



创建Java Request组件请求,并且选中test.mongodb.sampler.TestMongodbSamplerClient,由于没有编写获取参数的代码,所以在Send Parameters With the Request

中不用设置参数。



运行成功后,查看View Result Tree中的响应数据



运行成功后查看聚合报告中的数据。

以上就是整个编写Sampler组件到运行的整个过程,每一个步骤都是经过实践的。当然如果在描述的地方有错误,可留言指出错误,后续会继续学习编写插件的方法,将分享更多的技术给大家。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息