1. 程式人生 > 實用技巧 >Jmeter中如何進行對資料庫壓測

Jmeter中如何進行對資料庫壓測

前言 表面看來,JMeter與本系列課程似乎關係不大,但實際上在後面的很多場景中起著重要作用:如何獲知修改了某些程式碼或者設定之後系統性能是提升了還是下降了呢?商業的壓力測試工具LoadRunner確實很高大上,但是據說費用也不便宜且體積也不小,而目前最高版本的開源免費壓力測試工具JMeter3.2壓縮包體積才不到53M,而且對於開發人員而非專業測試人員來說,JMeter提供的測試功能已經夠強大了。要完整地介紹JMeter,即使把JMeter自帶的文件翻譯成中文就是一本厚厚的書了。但是在本篇只講述如何利用JMeter來對Web網站和資料庫進行壓力測試,因為測試場景的複雜性,本篇例項講述基於csv檔案的引數化測試。 JMeter提供了對不同的協議、伺服器及應用的測試支援,如下: Web – 各種開發語言開發出的網站,比如ASP/ASP.NET/JSP/PHP/Python/Perl等 SOAP / REST Webservices FTP Database via JDBC(基於JDBC對資料庫進行壓力測試) LDAP Message-oriented middleware (MOM) via JMS Mail - SMTP(S), POP3(S) and IMAP(S) Native commands or shell scripts TCP Java Objects 還是那句話:本篇只講述對Web網站和基於JDBC對資料庫進行壓力測試。 軟體準備 JMeter3.2:為保持與本文有比較好的對照,建議從官網下載3.2版本,下載地址:http://jmeter.apache.org/[preferred]/jmeter/binaries/apache-jmeter-3.2.zip 此軟體解壓後即可使用。 Tomcat8.5:本例項中的關於Web網站的壓力測試都是基於Tomcat8.5的,下載地址:http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.15/bin/apache-tomcat-8.5.15.tar.gz 如果嫌麻煩,可以直接在上一篇《開發人員學Linux(3):CentOS7中安裝JDK8和Tomcat8》的環境中進行。

MySQL Community Server5.7:本篇中將以MySQL為例講述如何對資料庫進行壓力測試,實際上本篇對MySQL版本沒有要求,但後來今後,還是建議下載5.7版本,下載地址:https://dev.mysql.com/downloads/mysql/,同時請下載MySQL的JDBC驅動。 注意:本篇中JMeter在Windows下執行,MySQL資料庫及Tomcat伺服器均在CentOS7下執行。 使用JMeter對一般性網站進行壓力測試 為便於演示,這裡以上一篇《開發人員學Linux(3):CentOS7中安裝JDK8和Tomcat8》中搭建起來的環境進行壓力測試,本人的虛擬機器支援橋接模式,IP地址為:192.168.60.198,在Tomcat中有一個簡單的提交表單,網址是:http://192.168.60.198:8080/examples/servlets/servlet/RequestParamExample,頁面如下圖所示:

該頁面中有一個Form,檢視頁面原始碼可知該Form提交給當前Servlet,且有兩個欄位,分別為:firstname和lastname,如下圖所示:

下面講述建立相關的JMeter元素。 1.執行JMeter 首先執行在解壓後的JMeter目錄下的bin目錄找到jmeter.bat來執行JMeter(重要的事情再說一遍:本篇中JMeter在Windows下執行,MySQL資料庫及Tomcat伺服器均在CentOS7下執行),JMeter支援多種語言,包括中文(其實對中文的支援不徹底),而在中文環境下JMeter的預設語言是中文,因為考慮到必要時候還需要看JMeter目錄下的printable_docs目錄中的文件,而這裡的文件全是英文的,所以我將它設定為英文,如下圖所示:

這是設定為英文之後的介面:

2.向“測試計劃”新增必要的元素。 新增測試計劃的必要元素的順序為:ThreadGroup->HTTPRequest->Listener。實際上還應包含TestPlan(測試計劃),因建立時預設會建立一個TestPlan,故新增TestPlan的步驟可省略。 2.1新增ThreadGroup 如下圖所示:

2.2新增HTTP Request Defaults 在ThreadGroup元素上滑鼠右鍵,”Add”-“Config Element”-“HTTP Request Defaults”,HTTP Request Defaults適合於在一個ThreadGroup裡面有大量的HTTP Request的情況,很多情況下HTTP Request的一些配置是相同的,那麼只需要在HTTP Request Defaults中設定好即可,無需在每個HTTP Request中單獨設定,新增HTTP Request Defaults的介面如下圖所示:

2.3新增HTTP Request 在ThreadGroup元素上滑鼠右鍵,通過”Add”-“Sampler”-“HTTP Request”來新增HTTP Request。

2.4新增Listener 在ThreadGroup元素上滑鼠右鍵,通過”Add”-“Listener”來新增Listener,在這裡根據需要新增Listener,本人一般會新增如下Listener: Summary Report:可以對測試的結果有一個概要了解,結果中包含了測試次數、平均/最大/最小響應時間、併發吞吐量、接收/傳送的位元組數等資訊; View Result Tree:由於預設情況下判斷某個測試是否成功是以是否收到了內容來判斷的,比如請求某個需要授權的頁面,如果未授權則會被導向到登入頁面,在JMeter看來未發生40X、50X這類HTTP Code的錯誤則仍會被當做測試結果正確,加View Result Tree後就可以看到客戶端和伺服器端傳送及響應的資料。 View Results in Table:和Summary Report類似,但側重點不同。

2.5新增CSV Data Set Config 前面的form表單中可以看出需要firstname和lastname兩個值,我們可以直接分別指定固定的值,也可以設定從csv檔案中資料中的一系列符合要求的值。 在ThreadGroup元素上滑鼠右鍵,通過”Add”-“Config Element”-“CSV Data Set Config”來新增CSV Data Set Config。

2.6引數配置 按照上述步驟建立的TestPlan最終效果如下圖所示:

在這裡再次強調一下,我們測試的是安裝在CentOS7中的Tomcat8自帶的例項程式,CentOS7虛擬機器採用橋接方式,IP地址為192.168.60.198,請求的URL地址為:http://192.168.60.198:8080/examples/servlets/servlet/RequestParamExample HTTP Request Defaults的配置資訊如下圖:

CSV Data Set Config的配置資訊如下圖:

注意:在這裡提到了一個名為Tomcat_performance_test_parameter.csv的檔案,這個檔案和當前JMeter專案檔案Tomcat-based-test-plan-JMeter3.2_Demo.jmx放在同一目錄下。可以使用NotePad++之類的文字編輯軟體建立這個檔案,並將檔案編碼設定為utf-8,檔案內容如下:

HTTP Request的配置資訊如下圖:

Thread Group的配置資訊

注意:為了便於展示結果,這個將測試次數改為100了。 2.7測試結果 執行完測試後即可在Listener中檢視結果。 Summary Report介面

View Results in Table介面

View Results Tree預設介面:

預設是以Text形式顯示響應資料,如果響應資料是XML/JSON/HTML的話,可以更改為相對應的顯示方式,這樣更直觀。在本例中以瀏覽器方式顯示響應資料的介面如下:

基於模板建立壓力測試計劃 前面講述了一個簡單但完整的HTTP Web壓力測試例子,基本上大多數同一型別的壓力測試總有一些共同的元素,為此可以使用模板來建立壓力測試計劃。 1.選擇從模板建立壓力測試計劃,如下圖:

2.在彈出的對話方塊中選擇”Building a Web Test Plan”,如下圖所示:

3.點選”Create”即可基於模板的壓力測試專案的建立,如下圖所示:

然後根據我們自己的需要增加或刪除一些元素,然後進行相應設定即可進行壓力測試了。 使用JMeter對資料庫進行壓力測試 前面講過JMeter支援多種壓力測試,下面講一下JMeter對資料庫進行壓力測試。 1.資料庫準備 首先準備好需要進行壓力測試的資料庫,本次以本人以前學習爬蟲時所使用的一個數據,基本資訊如下: 資料庫版本:mysql-5.1.58 資料庫名:netskycn 查詢用表名:ty_content(含748007條資料,2.2GB)。 ty_content的建立指令碼如下:

CREATE TABLE `ty_content` (
    `Id` INT(11) NOT NULL AUTO_INCREMENT,
    `ArticleId` INT(11) NOT NULL,
    `Content` MEDIUMTEXT NOT NULL,
    `ContentHash` VARCHAR(32) NOT NULL,
    `CreateAt` DATETIME NOT NULL,
    `IsVisible` TINYINT(1) NULL DEFAULT '1',
    PRIMARY KEY (`Id`),
    UNIQUE INDEX `IDX_ContentHash` (`ContentHash`),
    INDEX `IDX_ArticleId` (`ArticleId`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

2.JDBC驅動準備 JDBC驅動可從各資料庫廠商官網下載,這裡本人已下載好的MySQL JDBC驅動mysql-connector-java-5.1.36.jar,將其複製到JMeter目錄下的lib目錄中。 3.建立TestPlan 可以基於模板建立JDBC Test Plan,如下圖所示:

4.修改配置資訊 1.首先新增CSV Data Set Config,並且準備MySQL_JDBC_ArticleID.csv檔案,MySQL_JDBC_ArticleID.csv內容如下:

在這個檔案中共有6964條資料,它來自於ty_content表中ArticleId的統計(不含重複資料)。 CSV Data Set Config的配置資訊如下:

JDBC Connection Configuration配置資訊如下:

Thread Group配置資訊如下:

JDBC Request配置資訊如下:

最終測試效果:

總結: 本篇講述瞭如何使用JMeter來進行Web和資料庫壓力測試,為快速建立壓力測試計劃,可給予模板進行建立。可以看出一個JMeter壓力測試計劃必須包含如下元素:ThreadGroup、與壓力測試計劃對應的Request(如HTTP Request或JDBC Request)、Listener(可以根據需要新增多個Listener),並且為了減小快取的影響,我們介紹瞭如何利用csv檔案將測試中的引數資訊儲存起來。 本文未盡之處就是如何對需要身份驗證的Web網站進行壓力測試,對於帶有驗證碼的需要在壓力測試期間暫時禁用驗證碼功能。另外對於多種驗證方式,所使用的方法也有區別,在這期間我試過針對性地對一些需要身份驗證的網站建立壓力測試計劃,但沒發現太多共性的東西,故在本篇中沒有講述這方面的內容,等後期有時間再總結整理這方面的內容。