JMeter開發外掛之一(JMeter開發Java Request Sampler測試mongodb)
前言
目前,在整個網際網路上很少找到關於使用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元件到執行的整個過程,每一個步驟都是經過實踐的。當然如果在描述的地方有錯誤,可留言指出錯誤,後續會繼續學習編寫外掛的方法,將分享更多的技術給大家。
相關推薦
JMeter開發外掛之一(JMeter開發Java Request Sampler測試mongodb)
前言 目前,在整個網際網路上很少找到關於使用JMeter測試mongodb的文章,因此通過學習並參考一些文章後,再經過實踐,將分享給大家在JMeter的Java Request中如何測試mongodb,當然希望大家可以舉一反三的思維,測試不同的資料庫(Mysql,Oracl
git 團隊開發常用操作(適用於 gogs、gitlab、github)
git bash 開發 -m sgi pull .cn 定義 check 右鍵 git 團隊開發常用操作流程(適用於 gogs、gitlab、github) NO1 項目構建者 (1)在遠程倉庫創建倉庫 (2)將夥伴添加到倉庫合作者中(無先後要求) (2)cd 到項目將要
在64位的ubuntu 14.04 上開展32位Qt 程式開發環境配置(pro檔案中增加 QMAKE_CXXFLAGS += -m32 命令)
為了能中一個系統上開發64或32位C++程式,費了些周折,現在終於能夠開始幹過了。在此記錄此時針對Q5.4版本的32位開發環境配置過程。 1. 下載Qt 5.4 的32位版本,進行安裝,安裝過程中會發現一些32位的庫沒有安裝,根據提示的錯誤逐個安裝上即可。 2. 開啟一個SampleCode 中的cube
【Keras】使用Keras開發的流程(IMDB資料集電影評論二分類)
Keras簡介 \quad\quad Keras是一個Python深度學習框架,是一個模型級的庫,為開發深度學習模型
壓測JMeter---3、JMeter的元件---》3.3取樣器---》3.3.3 Java Request Sampler
3.3.3 Java Request Sampler 用以傳送Java請求,測試Java程式,需要基於JMeter測試框架編寫測試用例。 編寫測試用例步驟如下: 1 . 新建一個普通的Java工程 2 . 新增JMeter的
ARM裸板程式的開發和編譯(以點亮LED燈為例)
製作好交叉編譯工具鏈後,怎麼確定是否有效呢,當然是編譯一個程式燒寫到板上跑一下了。這裡我們以點亮LED燈為例描述如何使用我們製作的交叉編譯工具鏈編譯裸板程式。 首先,需要了解下Nor flash,Nand flash,片內記憶體,片外記憶體,地址空間這幾個概念。其中,Nor
JMeter“監視器結果”配置(監視器結果無資料的解決方法)
轉自:http://blog.csdn.net/catoop/article/details/8055947 從JMeter的幫助文件可以看出它僅支援TOMCAT5以上版本,詳情見:http://jakarta.apache.org/jmeter/usermanual/bu
windows7安裝ios開發環境總結(VMware9.0+VMware補丁+dmg映象+Xcode)
我的電腦配置CPU: 英特爾-酷睿i3處理器 記憶體:4GB 硬碟:1TB 系統:win7 32位 安裝步驟:1 . 安裝虛擬機器VMware Workstation 9.0 2.安裝虛擬機器補丁。 預設情況下,VMware虛擬機器沒有Mac系統選項。需要安裝補丁之後,
OMAP開發資源推薦(可以幫你少走不少彎路)
1. TI官方資源 TI中文主頁: http://focus.ti.com.cn/cn/tihome/docs/homepage.tsp 或者 http://www.ti.com 從“處理器”連結可以連結到每個晶片的資料主頁,比如: http://focus.ti.c
Android開發總結之一,搭建開發環境
Android的開發現在是如火如荼,逞現在不是很忙了,學習了下,這裡記錄下了在windows在如何搭建Android開發環境,對自己是個記錄,對新入門的兄弟姐妹們可以參考一下! (1)安裝JDK,省略。(2)下載Android SDK並配置。 可以到http://www.an
Web前端開發大系概覽 (前端開發技術棧)
前言 網際網路建立50多年了,網站開發技術日新月異,但web前端始終離不開瀏覽器,最終還是HTML+JavaScript+CSS這3個核心,圍繞這3個核心而開發出來大量技術框架/解決方案。 我從2000年初開始做網站開發,使用的技術不斷迭代,一些消失了,更多的出現了。 爆棧三部曲 問題
iOS開發本地快取(資料離線快取、讀取、釋放)
1、設定全域性的Cache 在AppDelegate.h中新增一個全域性變數 @interface AppDelegate : UIResponder { ASIDownloadCache *myCache; } @property (strong, nonat
開發工具使用(Android Studio、SQLite Expert 、TortoiseSVN)
8、AS載入的Module無法執行 在project 下的setting.gradle檔案中include 即可 7、AS載入專案出錯 Android studio Cannot load module 解決:close project ,
Eclipse+超快的模擬器Genymotion開發Android應用(第一步:安裝及配置Genymotion)
一、安裝及配置Genymotion (1)由於Eclipse中自帶的SDK模擬器,啟動之慢,不說了 現在給大家介紹一種比較快的模擬器Genymotion (2)首先去Genymotion的官網註冊一個賬號,這個賬號是有用的 請記著你的賬號和密碼(我用的是QQ好註冊的)
微信公眾號開發——網頁授權 (頁面分享 、獲取使用者基本資訊)
第一步:要用到的介面文件如下 第二步:使用網頁服務,公眾號需要如下配置 1.設定 授權回撥頁面域名 2.設定 JS介面安全域名設定(點選公眾號左邊選單 公眾號設定 進入設定頁面 點選 功能設定) 上程式碼 BLL呼叫程式先貼
一個遊戲是如何被設計和開發出來的(怎樣開發一款遊戲)
本專欄是著重於討論“開發一款遊戲需要怎樣的能力”,以及“如何學習開發遊戲所需的所有技能”。在開始討論我們的兩個主題之前,我認為非常有必要讓初學者瞭解一下:一個遊戲是如何被設計和開發完成的。 下面簡單列舉了四個能力,分別是:程式、設計、美術、音樂。但是礙於篇幅限
eclipse+sdk+adk安卓開發環境部署(全程詳解,適合小白)
寫給第一次想在自己Windows上建立eclipse的Android開發環境的朋友們,為了確保大家能順利完成開發環境的搭建,希望對準備進入Android開發的朋友有幫助。 我們知道eclipse+sdk+adk有很多版本的選擇,為了方便剛接觸的朋友 首先我介紹本人的套裝:
工廠模式(think in java中的設計模式)
org 我們 import lac otf 返回值 類型 int ava 工廠模式:工廠模式是利用工廠類的工廠方法創建對象的一種設計模式,目的是創建對象,但是很多時候創建對象我們會考慮很多其他因素~~~~比如限定輸入,限定返回值是否某個,比如在創建的過程中進行一些判斷,通過
叠代器模式(think in java中的設計模式)
一個 div 封裝 imp 叠代器 方法 println rri 數字 叠代器模式:用來叠代一個容器集合數組的一種模式。可能大家很多時候是用for循環進行叠代的,但是實際上for循環內部不能使用remove方法,但是叠代器可以,這是因為叠代器內部進行了該方法的邏輯處理。同樣
模板方法模式(think in java中的設計模式)
方法 bst pac code pri ack 單點 size clas 模板方法模式:模板方法模式顧名思義就是一種構造模塊化的設計模式。將一次行為分為多種行為,靈活的調用不同模塊進行工作。比如在飯店吃飯,分為:點菜,吃飯,買單等行為無論什麽飯店大致都是這三種行為。因此我們