這篇教程討論的是JMeter,它是一款基於Java的、集合了幾個應用程序、具備特定用途的負載和性能測試工具。html
本篇主要涉及的內容:java
全部的例子都是基於Java 8 update 0.20,Eclipse Luna 4.4, JMeter 2.11, MySQL Community Server 5.6.21的開發環境。那咱們就開始吧!node
引言
採用的技術
教程內容簡介
安裝
用戶界面
可用的請求
測試計劃和測試組件
執行順序
啓動與中止
HTTP請求的測試計劃
MySQL測試計劃
JUnit Request測試計劃
記錄測試
插件
最佳實踐
總結
下載
資源mysql
JMeter使用了不一樣技術和協議,是一款能夠進行配置和執行負載測試、性能測試和壓力測試的工具。web
它可以模擬不一樣類型的請求,例如各類類型的數據庫,FTP, HTTP, HTTPS 或者其餘的服務端應用。ajax
最好先來了解一下以下概念:正則表達式
JMeter最初的用途是用來測試web應用的,可是它的功能已獲得擴展,現在已經能夠針對絕大部分的程序進行測試,同時能夠在你的程序中進行功能測試。sql
JMeter是一款Java桌面應用程序,它的用戶界面採用Swing Java API實現。基於這兩點,JMeter是一個跨平臺工具,可以運行在任何安裝了Java虛擬機的操做系統(Windows, Linux, Mac)的設備上。
它的框架支持併發和多線程或者線程組的執行。這對於配置負載測試和壓力測試很是有用。
它是可擴展的,提供了大量的可用插件。
JMeter是Apache軟件基金會下的一個子項目,是徹底免費和開源的(http://www.apache.org/licenses/)。shell
這篇文章是針對那些沒有JMeter使用經驗的開發人員和軟件設計人員,介紹如何使用JMeter的教程。數據庫
同時針對可能不一樣的配置和測試計劃,提供了一些例子和使用說明。在下一個章節中,咱們將會看到如何安裝JMeter,並配置、運行它,如何保存和分析不一樣測試計劃的結果。
爲了JMeter在你的電腦上安裝並運行,你須要按照以下步驟進行操做:
1 | JAVA_HOME=C:\Program Files\Java\jdk1.8.0_20 |
注意設置正確你的Java版本。
而後測試java環境在你的設備上是否安裝成功,使用以下命令行:
1 | java -version |
應該輸出相似以下信息:
1
2
3
|
java version"1.8.0_20"
Java(TM) SE Runtime Environment (build1.8.0_20-b26)
Java HotSpot(TM)64-Bit Server VM (build25.20-b23, mixed mode)
|
1
2
3
4
5
6
7
8
|
apache-jmeter-2.9
apache-jmeter-2.9bin
apache-jmeter-2.9docs
apache-jmeter-2.9extras
apache-jmeter-2.9lib
apache-jmeter-2.9libext
apache-jmeter-2.9libjunit
apache-jmeter-2.9printable_docs
|
JMeter的GUI很是直觀易用。有文件處理的通用菜單,例如:新建,打開,保存,另存爲等。還有啓動和中止測試計劃,配置的可用的菜單項。每個測試計劃,線程組,測試計劃節點(咱們將會在下一章看到更多這方面的內容)均可以經過點擊鼠標右鍵,提供不一樣的上下文菜單選項。
也能夠改變用戶界面的語言,有許多語言可供選擇。
正如咱們所說的,圖形用戶界面是很是直觀和易用的,爲每一個菜單和動做提供了易用理解的工具提示。除此以外,暫且不談它的質量,那爲何JMeter是如此普遍使用?由於它很容易理解,而且易學。
JMeter幾乎提供任何一種系統的測試配置。總的來講,下列協議被包含在內:
基本上,使用JMeter能夠進行以下操做:建立,配置,執行測試計劃及結果分析。測試計劃是對已配置的本地或遠程服務器(或客戶端)的請求集執行的具體說明。
在一個測試計劃的配置中,你能夠指定多個輸入和輸出參數,能夠配置使測試計劃成功執行或失敗的基本條件。
JMeter測試計劃是由不一樣的組件組成。這裏有一個最重要組件的列表,指導你如何使用JMeter的用戶界面添加它們以及這些插件的做用:
一個線程組基本上是不一樣的測試計劃元素的組合,它是一個測試計劃的核心,它控制着基本核心參數。
爲了建立一個測試計劃,首先你不得不去建立一個線程組,配置以下參數:線程數量,過渡時期,循環次數和正常狀況或者錯誤狀況下的行爲:
一個線程組也有配置選項的開始和結束時間。經過單擊複選框「Scheduler」,彈出帶有調度參數的面板,能夠爲你的測試配置開始和結束時間。
一旦配置完成,你就能夠開始添加其餘測試計劃元素到線程組,例如採樣器,偵聽器和定時器。咱們將在下一章解釋這一切。
採樣器用於發送請求到不一樣類型的服務器。它們是每個測試計劃的基本要素,一切都圍繞這些採樣器而工做:採樣器執行請求(基於配置的請求),這些請求產生一個或多個響應,後續將被分析。
這裏有一個在JMeter可用的採樣器列表(在本教程咱們將看到其中一些):
在上面的列表中咱們能夠看到,有不少不一樣類型的採樣器。這個清單是不完整的,由於存在多種其餘不一樣於JMeter插件的實現技術。每一個採樣器的配置取決於它所執行的請求;這意味着一些採樣器有一些共性的配置,而另一些採樣器因爲它們各自請求的不一樣而徹底不一樣。
邏輯控制器容許你配置一個線程組內不一樣採樣器的執行順序。該列表包含了在JMeter全部可用的邏輯控制器:
監聽器提供不一樣的方式查看由採樣器請求產生的結果。監聽器以報表、樹型結構、或簡明的日誌文件的形式分析結果。
還能夠在測試計劃中的任何地方添加監聽器,但他們只會在各自的應用範圍內解析和收集來自採樣器的數據。
這些都是JMeter可用的監聽器:
可使用定時器來定義請求之間的等待時間。若是不指定,JMeter會一個請求完成後當即執行下一個請求,沒有任何等待時間。
可在JMeter使用的計時器以下:
斷言經過驗證採樣器請求產生的響應,來驗證測試計劃的有效性。它基本上相似於單元測試斷言,用來檢測被測試應用程序的響應質量。你能夠爲每一個測試計劃配置任何生效的斷言。
這裏是一個在JMeter可使用的斷言列表:
經過使用配置元素你能夠將不一樣的參數傳遞給取樣器請求。他們提供了建立變量(不一樣的和動態的)的一種方式,這些參數以後被採樣器所使用。在採樣器被執行前,參數所屬節點啓動時,這些參數被執行;這就是爲何採樣器能夠依賴這些變量。
這裏是一個在JMeter使用的全部配置節點列表:
在採樣器執行前,前置處理器被觸發。他們可用於從響應中提取變量,這些變量後續將經過配置元素被採樣器所使用。
下面都是能夠用來做爲前置處理器的元素:
後置處理器是取樣器被執行後被觸發執行的元素。他可用於解析響應數據,提取變量,以便後續使用
下列元素可用於後置處理器:
測試計劃的元素是有序的,經過如下方式執行:
1–配置節點
2–前置處理器
3–定時器
4–取樣器
5–後置處理器(只在有結果可用狀況下執行)
6–斷言(只在有結果可用狀況下執行)
7–監聽器(只在有結果可用狀況下執行)
一個測試計劃能夠包含一個或多個測試計劃。經過功能性或者技術邏輯將測試組織在一塊兒是一種常見的作法。
運行一個測試計劃,你只須要點擊「play」按鈕:
點擊按鈕「Play no pauses」,開始一個測試並忽略全部暫停:
經過點擊「中止」按鈕,能夠中止測試:
也能夠禁用執行測試計劃。你只須要「切換」的測試計劃的狀態:
你能夠看到在上面的截圖中看到,不可執行的計劃呈現灰色,但能夠修改他們或從新配置。
在這一章中,咱們將看到如何建立一個經過HTTP測試一個特定的網頁的測試計劃。爲此目的,我將用http://www.wikipedia.org網站。
有了足夠理論知識,如今咱們將看到如何配置一個HTTP請求的測試計劃。
在這一步中,配置測試計劃可能會影響線程的行爲,您能夠添加可能使用到的外部類庫。不過咱們不打算在這個例子中那樣作。
在這一步,你須要建立一個負責執行全部測試組件的線程組,並配置主要屬性:線程數,秒級的過渡時期,迭代次數。
在菜單中這樣操做
Test Plan -> Add -> Thread ->ThreadGroup
你也能夠指定錯誤狀況下行爲模式(繼續,中止,中止當前線程……)
在這一步,給要測試HTTP請求添加採樣器:
Add Sampler->HTTP Request
咱們須要爲這種類請求設置不一樣的屬性:
在這個例子中,爲要測試的服務器設置名稱:www.wikipedia.org(不用指明HTTP或HTTPS協議)。若是須要的話,你應該修改端口,協議,執行方法等。在咱們的案例中這是沒必要要的。這有幾個關於配置代理,超時和不一樣的頭信息的參數,但在咱們的例子中,使用默認值。
爲了後續可以看到結果,這是有必要的;就如咱們以前在本教程中看到那樣,對於咱們的http請求的測試計劃,有幾種可選配置,咱們使用結果樹:
Add Listener -> View Results Tree
在咱們的示例中,咱們沒有改變任何東西,保留全部配置屬性的默認值。
File->Save(或單擊「Control + s」)
Run->Start(或單擊「play」)
咱們能夠看到,全部的請求已經完成,如預期那樣,他們都提供有意義的響應,如此看來,咱們測試的網頁工做正常(若是這是咱們的預期行爲)。咱們能夠玩的轉這些結果,檢查全部返回的數據。
咱們已經配置了一個測試計劃,它發送大量請求到指定的服務器並解析響應。接下來咱們將看到如何使用其餘類型的測試組件,如定時器和斷言。
爲了增長一個定時器,咱們只要右擊測試計劃並添加一個定時器:
Add Timer->Constant Timer
咱們配置500毫秒。每個請求都將在上一個請求執行完成後等待500毫秒。
在測試計劃中,單擊右鍵並添加一個斷言持續時間,若是響應時間超過100毫秒,配置錯誤斷言。針對the main sample only選項的配置以下:
Add assertion->Duration assertion
Add assertion->Size Assertion
咱們需確保響應信息的尺寸大於5000字節:
若是咱們運行測試計劃,咱們將會看到響應信息老是大於設定的值,若是響應信息尺寸小於設定值,斷言也會失敗。
咱們將看到如何配置,運行一個針對MySQL數據庫的測試,並對結果進行分析。這個例子是關於MySQL的,也可使用任何其餘類型的數據庫如Oracle,MongoDB或別的。
若是你沒有在你的電腦安裝MySQL,你能夠從http://dev.mysql.com/downloads/ 下載安裝MySQL服務器,這是很容易的。
下載MySQL鏈接器(mysql-connector-java-5.1.6),將它複製到JMeter安裝目錄下的lib目錄下,本例中是C:\jmeter\apache-jmeter-2.11\lib
啓動數據庫服務器,你能夠對它進行查詢。
你能夠建立一個你想要的數據庫,咱們這裏只是一個很是簡單的例子:
1
2
3
4
5
6
7
8
9
10
11
|
createdatabasejmeter;
use jmeter;
createtablejmeter_stuff(idint,namevarchar(50), descriptionvarchar(50));
insertintojmeter_stuff(id,name, description)VALUES(1,"dani","the boss");
insertintojmeter_stuff(id,name, description)VALUES(2,"topo","the worker");
insertintojmeter_stuff(id,name, description)VALUES(3,"tupac","the other");
|
跟上一章節同樣,進行以下操做建立測試計劃:一個新的線程組,一個JDBC類型的配置元素和一個新的JDBC類型請求,以一樣的方式添加一個監聽器來解析和查看結果。
惟一的區別是採樣器的類型,在這種狀況下使用JDBC採樣器。
1 | select*fromjmeter_stuff; |
添加一個新的JDBC鏈接配置到採樣器:
點擊右鍵 JDBC採樣器->添加鏈接配置
改變參數以下:
1
2
3
4
5
|
Variable BoundtoPool= samenameasinthe sampler
DatabaseURl=jdbc:mysql://localhost:3306/jmeter
JDBC Driver.mysql.jdbc.Driver
username=
password=
|
設置用戶名密碼
您能夠以相似在HTTP請求的測試計劃相同的方式驗證和檢查輸出結果。只要你須要,你也能夠添加前置處理器,後置處理器,斷言或其餘任何一種元素。
在這種狀況下,輸出的是SELECT語句的結果。
你能夠用這種取樣器用於更新數據,以及修改採樣器配置的SQL語句。
在下面的屏幕捕獲的是請求響應結果的基本信息:
在這一章中,咱們將解釋如何結合JUnit使用JMeter。從負載和性能的角度來看,JMeter爲執行功能測試,提供了很是強大的機制。
首先,須要建立一個像下面的JUnit測試:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
publicclassJMeterTest
{
publicJMeterTest()
{
// just for testing purposes
System.out.println("calling the constructor");
}
@Before
publicvoidsetUp()throwsException
{
// just for testing purposes
System.out.println("calling setup");
}
@After
publicvoidtearDown()throwsException
{
// just for testing purposes
System.out.println("calling tearDown");
}
@Test
publicvoidtestMe()
{
for(inti =0; i <30; i++ )
{
// just asserting randomly in order to check what happens in each case
intrandomNumber = (int)( Math.random() *100);
System.out.println( randomNumber );
assertEquals(0, randomNumber %2);
}
}
}
|
1 |
爲了查看JMeter如何使用他們,本試驗主要包含兩個斷言,固然這本教程的目的不是詳細解釋單元測試或JUnit測試。
將單元測試打成一個JAR包,把它複製到JMeter的安裝目錄下的/lib/JUnit下。確保JAR文件包含你想讓JMeter執行的測試類的.class文件。在文章的最後,你能夠找到一個帶有pom.xml文件的Java項目,你能夠直接使用他去生成的JAR文件。如今你只須要編譯代碼:
1 | mvn compile |
或者直接在Eclipse或你喜歡的其餘IDE中導出你的項目,生成包括字節碼JAR文件。
入前所述,建立一個測試計劃,添加一個JUnit類型採樣器:Add Sampler->Junit Request ,配置並執行你想要測試的方法。
在咱們的例子中,咱們將運行基於JUnit 4的方法,但你也能夠勾選框使用JUnit 3。
在這裏,能夠看到咱們剛剛建立的JUnit測試結果:
如上述截圖所示,咱們全部的測試(一個測試,10次循環)都失敗了。這是預期的行爲,由於咱們但願咱們的測試失敗。其實咱們只是寫了個單元測試,沒有功能上的意義,是無用的。它的目的是要說明如何配置JMeter去執行這些類的單元測試。
在這一章所解釋的內容 有助於你使用JMeter提供的便利性的功能進行應用程序的功能測試和業務邏輯的測試.它也頗有趣,由於它能夠將Java語言的全部優點與JMeter的多線程能力相結合。
如今咱們將說明如何配置JMeter記錄HTTP請求。爲此咱們須要Firefox安裝在咱們的機器,我是用版本32。
進入Firefox網絡設置,選擇手動代理選項和設置爲本地主機服務器和端口8080(實際上,這加深了對你的JMeter配置)。以後選中「爲全部協議使用代理服務器」。
咱們添加了一個新的線程組,給它起名。配置線程組線程數量爲50,過渡時期爲10秒,循環次數等於1。
在剛剛建立的線程組中添加一個新的配置元素,選擇「HTTP Request Defaults」。
在這裏你應該填寫你想測試服務器名稱。
如今咱們添加一個記錄控制器到工做臺。
選擇工做臺,不是測試計劃,並添加一個非測試元件的」Test Script Recorder」。
你如今應該讓工做臺保存起來,而且與你的測試計劃無關。保存測試計劃不意味着保存了工做臺。
配置記錄以下:
若是你想爲你的記錄器添加一個定時器(常量類型),那麼該定時器將由每一個被記錄的HTTP請求所使用。
經過點擊記錄器啓動按鈕,你將啓動JMeter代理服務器。
若是你爲了生成一個HTTP請求而訪問一個網頁,例如使用Firefox(配置爲在本章的第一步解釋以後)訪問http://www.oviedin.com,那麼你會看到不一樣的請求入口出如今你的測試計劃記錄控制器中。
這些記錄其實是以前訪問的web頁面的HTTP請求。那些包含在過濾器配置測試腳本配置過的記錄將被保存。能夠在你的後續測試計劃中從新配置使用。
不一樣的插件應用的場景和用戶不一樣,其中的一些須要安裝,有些不須要安裝。
一些很是有用的插件,它們經過一些高級選項來解析結果,並利用圖表分析結果 例如http://jmeter-plugins.org/wiki/GraphsGeneratorListener/。
也有一些可用插件,可以將JMeter與你的持續集成工具鏈接,直接從CI軟件運行JMeter,執行測試計劃,例如」https://wiki.jenkins-ci.org/display/JENKINS/Performance+Plugin「。
正如我所說的,隨着插件數量的上升,不可能列出全部的插件。因此你在實現本身的插件功能時,儘量的去互聯網上查找一下是否有可用的插件,這對本身是很是有價值的。
你也能夠建立你本身的JMeter插件,但這超出了本文的範圍。
在文章末尾,咱們要寫下兩個頗有用的技巧和最佳實踐:
你能夠經過命令行:
1 | jmeter -n -t test.jmx -l test.jtl. |