開發人員學Linux(4):使用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,頁面如下圖所示:
wKiom1kxiAiwLvKbAABT6Z6HfD0847.png-wh_50 
該頁面中有一個Form,查看頁面源代碼可知該Form提交給當前Servlet,且有兩個字段,分別爲:firstname和lastname,如下圖所示:
wKioL1kxiBrTPu8fAAC3ElPt2K4231.png-wh_50 
下面講述創建相關的JMeter元素。
1.運行JMeter
首先運行在解壓後的JMeter目錄下的bin目錄找到jmeter.bat來運行JMeter(重要的事情再說一遍:本篇中JMeter在Windows下運行,MySQL數據庫及Tomcat服務器均在CentOS7下運行),JMeter支持多種語言,包括中文(其實對中文的支持不徹底),而在中文環境下JMeter的默認語言是中文,因爲考慮到必要時候還需要看JMeter目錄下的printable_docs目錄中的文檔,而這裏的文檔全是英文的,所以我將它設置爲英文,如下圖所示:
wKioL1kxiC7w62nBAACs3wzzi6o859.png-wh_50 
這是設置爲英文之後的界面:
wKiom1kxiD6BblfRAAC2qA4Yzog047.png-wh_50 
2.向“測試計劃”添加必要的元素。    
添加測試計劃的必要元素的順序爲:ThreadGroup->HTTPRequest->Listener。實際上還應包含TestPlan(測試計劃),因創建時默認會創建一個TestPlan,故添加TestPlan的步驟可省略。
2.1添加ThreadGroup
如下圖所示:

wKiom1kxiFzhkQqZAACsGAabW84733.png-wh_50


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的界面如下圖所示:
 

wKioL1kxiFzwRH4jAAE01ZDsN1g528.png-wh_50

2.3添加HTTP Request
在ThreadGroup元素上鼠標右鍵,通過”Add”-“Sampler”-“HTTP Request”來添加HTTP Request。
 

wKioL1kxiF3yMpqFAAE1pmZrO_o234.png-wh_50

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類似,但側重點不同。
 

wKiom1kxiKqguQdVAAFOWJbcmUQ361.png-wh_50





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

wKioL1kxiKui2bh5AAFg-fjQqqE838.png-wh_50

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

wKiom1kxiKvRekSTAACOBV2p2kw883.png-wh_50

在這裏再次強調一下,我們測試的是安裝在CentOS7中的Tomcat8自帶的實例程序,CentOS7虛擬機採用橋接方式,IP地址爲192.168.60.198,請求的URL地址爲:http://192.168.60.198:8080/examples/servlets/servlet/RequestParamExample

HTTP Request Defaults的配置信息如下圖:
 

wKioL1kxiKyjR6VJAACI6iWaxwM645.png-wh_50

CSV Data Set Config的配置信息如下圖:
 

wKioL1kxiQexREU7AAB-uS5YhOw357.png-wh_50



注意:在這裏提到了一個名爲Tomcat_performance_test_parameter.csv的文件,這個文件和當前JMeter項目文件Tomcat-based-test-plan-JMeter3.2_Demo.jmx放在同一目錄下。可以使用NotePad++之類的文本編輯軟件創建這個文件,並將文件編碼設置爲utf-8,文件內容如下:
 

wKioL1kxiQfi-Ed_AAA7LqE0X8U735.png-wh_50

HTTP Request的配置信息如下圖:
 

wKiom1kxiSihtVZpAACP2fsi6bY112.png-wh_50
Thread Group的配置信息
 

wKioL1kxiSmwFNpTAABv8FDfTDE521.png-wh_50

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

wKiom1kxiSmCDhn6AABLHkNgRT0413.png-wh_50

View Results in Table界面
 

wKioL1kxiWCBTTWXAAHxzVw-lBE136.png-wh_50
View Results Tree默認界面:
 

wKiom1kxiWGA6Rf6AAE2QVjVTD0583.png-wh_50

默認是以Text形式顯示響應數據,如果響應數據是XML/JSON/HTML的話,可以更改爲相對應的顯示方式,這樣更直觀。在本例中以瀏覽器方式顯示響應數據的界面如下:
 

wKiom1kxiWHhMG8PAAE6qtbzBf4458.png-wh_50


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

wKiom1kxiZXy8vghAACh693KpWE111.png-wh_50


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

wKioL1kxiZWTpd7kAACifcsyN9w300.png-wh_50

3.點擊”Create”即可基於模板的壓力測試項目的創建,如下圖所示:
 

wKiom1kxiZbimXXNAAEovVnb5i4790.png-wh_50

然後根據我們自己的需要增加或刪除一些元素,然後進行相應設置即可進行壓力測試了。
使用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,如下圖所示:
 

wKiom1kxieHQNLb9AAGuNPsWIik615.png-wh_50


4.修改配置信息
1.首先添加CSV Data Set Config,並且準備MySQL_JDBC_ArticleID.csv文件,MySQL_JDBC_ArticleID.csv內容如下:
 

wKioL1kxieGisbqWAAAkxX6Uj-g583.png-wh_50

在這個文件中共有6964條數據,它來自於ty_content表中ArticleId的統計(不含重複數據)。
CSV Data Set Config的配置信息如下:
 

wKiom1kxieLz5bKIAABbGo8WYxs424.png-wh_50

JDBC Connection Configuration配置信息如下:

wKioL1kxieKgqMDBAACRjV-XfL4764.png-wh_50

 
Thread Group配置信息如下:
 

wKiom1kxih2B8uAjAABErpm7flI964.png-wh_50


JDBC Request配置信息如下:
 

wKiom1kxih2jXTKlAABsSsnbHHk083.png-wh_50

最終測試效果:
 

wKioL1kxih7w2fDaAABFuAMgWtA444.png-wh_50


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


聲明:本文首發於本人個人微信訂閱號:zhoujinqiaoIT,其後會同時在本人的CSDN、51CTO及oschina三處博客發佈,本人會負責在此四處答疑。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章