開發人員學Linux(4):使用JMeter對網站和數據庫進行壓力測試

前言java

表面看來,JMeter與本系列課程彷佛關係不大,但實際上在後面的不少場景中起着重要做用:如何獲知修改了某些代碼或者設置以後系統性能是提高了仍是降低了呢?商業的壓力測試工具LoadRunner確實很高大上,可是聽說費用也不便宜且體積也不小,而目前最高版本的開源免費壓力測試工具JMeter3.2壓縮包體積纔不到53M,並且對於開發人員而非專業測試人員來講,JMeter提供的測試功能已經夠強大了。要完整地介紹JMeter,即便把JMeter自帶的文檔翻譯成中文就是一本厚厚的書了。可是在本篇只講述如何利用JMeter來對Web網站和數據庫進行壓力測試,由於測試場景的複雜性,本篇實例講述基於csv文件的參數化測試。mysql

 

JMeter提供了對不一樣的協議、服務器及應用的測試支持,以下:sql

◦Web – 各類開發語言開發出的網站,好比ASP/ASP.NET/JSP/PHP/Python/Perl等shell

◦SOAP / REST Webservices數據庫

◦FTPapache

◦Database via JDBC(基於JDBC對數據庫進行壓力測試)瀏覽器

◦LDAP緩存

◦Message-oriented middleware (MOM) via JMStomcat

◦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 RequestDefaults適合於在一個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:和SummaryReport相似,但側重點不一樣。

2.5添加CSV Data Set Config

前面的form表單中能夠看出須要firstname和lastname兩個值,咱們能夠直接分別指定固定的值,也能夠設定從csv文件中數據中的一系列符合要求的值。

在ThreadGroup元素上鼠標右鍵,經過」Add」-「Config Element」-「CSV Data Set Config」來添加CSV DataSet 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.在彈出的對話框中選擇」Buildinga 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 SetConfig,而且準備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網站進行壓力測試,對於帶有驗證碼的須要在壓力測試期間暫時禁用驗證碼功能。另外對於多種驗證方式,所使用的方法也有區別,在這期間我試過針對性地對一些須要身份驗證的網站創建壓力測試計劃,但沒發現太多共性的東西,故在本篇中沒有講述這方面的內容,等後期有時間再總結整理這方面的內容。

 

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

相關文章
相關標籤/搜索