JMeter測試MongoDB性能有兩種方式,一種是利用JMeter直接測試MongoDB【即通過MongoDB協議測試】,另一種是寫Java代碼方式測試MongoDB【即通過java請求測試】
注:
1、用於插件不准,所以在使用JMeter直接測試MongoDB時例如find()、insert()等命令返回結果會不准,因此3.0里去掉了mongodb的協議,如果要用JMeter測試MongoDB我們一般選擇寫Java代碼的方式【即第二種方式】,具體情況會在后面說明。
2、JMeter2.10、JMeter2.11版本里有mongodb協議,3.0里無mongodb協議,如果想使用該協議注意JMeter版本的選擇
第一種JMeter直接進行測試MongoDB
1.啟動JMeter,新建線程組,設置線程組屬性
2.右鍵添加-MongoDB Source Config
3.右鍵添加-Sampler-MongoDB Script
4.右鍵-監聽器-察看結果樹
可以看出JMeter測試count()命令結果和mongodb查詢結果一直,但是JMeter由於插件不准,有的命令不准,例如find()、insert()命令,具體如下:
insert命令測試:
insert測試結果:
會發現雖然請求發送成功了,但是返回的結果是一串很長的字符串,很難確定插入是否成功,通過客戶端查詢,數據已插入成功;JMeter直接錄入db.foo.find()和insert()命令響應結果相似,響應結果也是一串類似字符串,而不是數據結果,所以我們一般不用該種方法測試mongodb,具體如下圖:
第二種JMeter結合Java代碼測試MongoDB
1.編寫Java代碼,內容如下:
package com.test.mongodb; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; 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 com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.MongoOptions; import com.mongodb.ServerAddress; import com.mongodb.WriteResult; public class TestMongodb extends AbstractJavaSamplerClient{ private static Mongo m; private static DB db; // private static AtomicLong read_key = new AtomicLong(0); //private static FileOutputStream fos; static { try { //MongoDB連接池配置 //fos = new FileOutputStream(new File("jmeter_error.log")); MongoOptions options = new MongoOptions(); //options.autoConnectRetry = true; options.connectionsPerHost = 1000; options.maxWaitTime = 5000; options.socketTimeout = 0; options.connectTimeout = 15000; options.threadsAllowedToBlockForConnectionMultiplier = 5000; m = new Mongo(new ServerAddress("127.0.0.1", 27017), options); db = m.getDB("myTest"); //獲取myTest數據庫 } catch (Exception e) { throw new RuntimeException(e); } } public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("rw", "w"); return params; } public SampleResult runTest(JavaSamplerContext context) { // System.out.println(read_key.getAndIncrement()); SampleResult results = new SampleResult(); //System.out.println(context.getParameter("rw")); results.sampleStart(); //1、獲取一個集合foo DBCollection coll = db.getCollection("foo"); //獲取一個集合foo //2、對集合foo進行插入操作 if ("w".equalsIgnoreCase(context.getParameter("rw"))) { // long key = 1; //2.1 構造一個文檔doc BasicDBObject doc = new BasicDBObject(); //2.2 向文檔中放入數據 doc.put("_id", UUID.randomUUID()); doc.put("_class", "com.iflashbuy.bi.source.pojo.AreaDataEntity"); doc.put("province", "廣東"); doc.put("city", "廣州"); doc.put("pv", 35522924); doc.put("uv", 52556); doc.put("orderCount", 963); doc.put("orderTotal", 1548563); doc.put("entpriseCode", "00540001"); //2.3 將文檔插入到集合foo中 coll.insert(doc); } results.setSuccessful(true); results.sampleEnd(); return results; } /*public static void main(String args[]) throws Exception { Arguments a = new Arguments(); a.addArgument("rw", "w"); final JavaSamplerContext c = new JavaSamplerContext(a); long startTime = System.currentTimeMillis(); for (int i = 0; i < 5; i++) { new Thread() { public void run() { TestMongodb t = new TestMongodb(); for (int j = 0; j < 2; j++) { t.runTest(c); } } }.start(); } long endTime = System.currentTimeMillis(); System.out.println(endTime-startTime); } */ }
注:在編寫java代碼時要引入幾個包,如圖
2.生成jar包,放在Jmeter_HOME/lib/ext文件夾下
3.啟動JMeter,新建線程組,Java請求,察看結果樹,聚合報告