2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

使用JMeter進(jìn)行性能測(cè)試

 燮羽 2010-10-30


概述

 

JMeter 最早是為了測(cè)試 Tomcat 的前身 JServ 的執(zhí)行效率而誕生的。到目前為止,它的最新版本是2.3.4,它的測(cè)試能力也不再僅僅只局限于對(duì)于Web服務(wù)器的測(cè)試,而是涵蓋了數(shù)據(jù)庫(kù)、JMS、Web Service、LDAP等多種對(duì)象的測(cè)試能力。在最新的 2.3.4 中,它還提供了對(duì)于 JUNIT 的測(cè)試。

JMeter 的安裝非常簡(jiǎn)單,從官方網(wǎng)站上下載,解壓之后即可使用。運(yùn)行命令在%JMETER_HOME%/bin 下,對(duì)于 Windows 用戶來(lái)說(shuō),命令是 jmeter.bat。運(yùn)行前請(qǐng)檢查JMeter 的文檔,查看是否具備相關(guān)的運(yùn)行條件。對(duì)于最新版,需要JDK的版本要求是JDK 1.4以上。

 

JMeter作用領(lǐng)域

JMeter可以用于測(cè)試靜態(tài)或者動(dòng)態(tài)資源的性能(文件、Servlets、Perl腳本、java對(duì)象、數(shù)據(jù)庫(kù)和查詢、ftp服務(wù)器或者其他的資源)。JMeter用于模擬在服務(wù)器、網(wǎng)絡(luò)或者其他對(duì)象上附加高負(fù)載以測(cè)試他們提供服務(wù)的受壓能力,或者分析他們提供的服務(wù)在不同負(fù)載條件下的總性能情況。你可以用JMeter提供的圖形化界面分析性能指標(biāo)或者在高負(fù)載情況下測(cè)試服務(wù)器/腳本/對(duì)象的行為。

使用JMeter測(cè)試Web應(yīng)用

接下來(lái)的章節(jié)里,作者將詳細(xì)的演示如何使用JMeter來(lái)測(cè)試Web應(yīng)用的完整過(guò)程。

2.1 測(cè)試環(huán)境

作者使用了Tomcat作為Web服務(wù)器進(jìn)行測(cè)試,被測(cè)試的內(nèi)容是一個(gè)jsp文件和一個(gè)servlet,jsp文件調(diào)用JavaBean、打印相關(guān)信息,servlet接受用戶參數(shù)、調(diào)用javabean、輸出相關(guān)信息。詳細(xì)的內(nèi)容請(qǐng)參考作者提供的JMeter.war的內(nèi)容。

2.2 安裝啟動(dòng)JMeter

下載JMeter的release版本,然后將下載的.zip文件解壓縮到C:/JMeter(后面的文章中將使用%JMeter%來(lái)引用這個(gè)目錄)目錄下。

現(xiàn)在,請(qǐng)使用%JMeter%/bin下面的jmeter.bat批處理文件來(lái)啟動(dòng)JMeter的可視化界面,下面的工作都將在這個(gè)可視化界面界面上進(jìn)行操作。下面的圖片是JMeter的可視化界面的屏幕截圖。

圖一: JMeter打開(kāi)時(shí)的屏幕截圖 

clip_image002

 

 

 

2.3 建立測(cè)試計(jì)劃(Test Plan)

測(cè)試計(jì)劃描述了執(zhí)行測(cè)試過(guò)程中JMeter的執(zhí)行過(guò)程和步驟,一個(gè)完整的測(cè)試計(jì)劃包括一個(gè)或者多個(gè)線程組(Thread Groups)、邏輯控制(Logic Controller)、實(shí)例產(chǎn)生控制器(Sample Generating Controllers)、偵聽(tīng)器(Listener)、定時(shí)器(Timer)、比較(Assertions)、配置元素(Config Elements)。打開(kāi)JMeter時(shí),它已經(jīng)建立一個(gè)默認(rèn)的測(cè)試計(jì)劃,一個(gè)JMeter應(yīng)用的實(shí)例只能建立或者打開(kāi)一個(gè)測(cè)試計(jì)劃。

現(xiàn)在我們開(kāi)始填充一個(gè)測(cè)試計(jì)劃的內(nèi)容,這個(gè)測(cè)試計(jì)劃向一個(gè)jsp文件和一個(gè)servlet發(fā)出請(qǐng)求,我們需要JMeter模擬五個(gè)請(qǐng)求者(也就是五個(gè)線程),每個(gè)請(qǐng)求者連續(xù)請(qǐng)求兩次,下面的章節(jié)介紹了詳細(xì)的操作步驟。

2.4 增加負(fù)載信息設(shè)置

這一步,我們將向測(cè)試計(jì)劃中增加相關(guān)負(fù)載設(shè)置,是Jmeter知道我們需要模擬五個(gè)請(qǐng)求者,每個(gè)請(qǐng)求者在測(cè)試過(guò)程中連續(xù)請(qǐng)求兩次。詳細(xì)步驟如下:

1. 選中可視化界面中左邊樹(shù)的Test Plan節(jié)點(diǎn),單擊右鍵,選擇Add'Thread Group,界面右邊將會(huì)出現(xiàn)他的設(shè)置信息框。

2. Thread Group有三個(gè)和負(fù)載信息相關(guān)的參數(shù): 
Number of Threads: 設(shè)置發(fā)送請(qǐng)求的用戶數(shù)目 
Ramp-up period: 每個(gè)請(qǐng)求發(fā)生的總時(shí)間間隔,單位是秒。比如你的請(qǐng)求數(shù)目是5,而這個(gè)參數(shù)是10,那么每個(gè)請(qǐng)求之間的間隔就是10/5,也就是2秒 
Loop Count: 請(qǐng)求發(fā)生的重復(fù)次數(shù),如果選擇后面的forever(默認(rèn)),那么 請(qǐng)求將一直繼續(xù),如果不選擇forever,而在輸入框中輸入數(shù)字,那么請(qǐng)求將重復(fù) 指定的次數(shù),如果輸入0,那么請(qǐng)求將執(zhí)行一次。

根據(jù)我們演示例子的設(shè)計(jì),我們應(yīng)該將Number of Threads設(shè)置為5,Ramp-up period設(shè)置為0(也就是同時(shí)并發(fā)請(qǐng)求),不選中forever,在Loop Count后面的輸入框中輸入2,設(shè)置后的屏幕截圖如下:

圖二:設(shè)置好參數(shù)的Thread Group。 
clip_image004

2.5 增加默認(rèn)Http屬性(可選)

實(shí)際的測(cè)試工作往往是針對(duì)同一個(gè)服務(wù)器上Web應(yīng)用展開(kāi)的,所以Jmeter提供了這樣一種設(shè)置, 在默認(rèn)Http屬性設(shè)置需要被測(cè)試服務(wù)器的相關(guān)屬性,以后的http請(qǐng)求設(shè)置中就可以忽略這些相同參數(shù)的設(shè)置,減少設(shè)置參數(shù)錄入的時(shí)間。

我們這里將采用這種屬性。你可以通過(guò)下面的步驟來(lái)設(shè)置默認(rèn)http屬性:

1. 選中可視化界面中左邊樹(shù)的Test Plan節(jié)點(diǎn),單擊右鍵,選擇Add'config element'http request defaults,界面右邊將會(huì)出現(xiàn)他的設(shè)置信息框。

2. 默認(rèn)http屬性的主要參數(shù)說(shuō)明如下: 
protocal:發(fā)送測(cè)試請(qǐng)求時(shí)使用的協(xié)議 
server name or ip:被測(cè)試服務(wù)器的ip地址或者名字 
path: 默認(rèn)的起始位置。比如將path設(shè)置為/jmeter,那么所有的http請(qǐng)求的url中都將增加/jmeter路徑。 
port number: 服務(wù)器提供服務(wù)的端口號(hào)

我們的測(cè)試計(jì)劃將針對(duì)本機(jī)的Web服務(wù)器上的Web應(yīng)用進(jìn)行測(cè)試,所以protocal應(yīng)該是http,ip使用localhost,因?yàn)檫@個(gè)web應(yīng)用發(fā)布的context路徑是/jmeter,所以這里的path設(shè)置為/jmeter,因?yàn)槭褂肨omcat服務(wù)器,所以port number是8080。設(shè)置后的屏幕截圖如下:

圖三: 測(cè)試計(jì)劃中使用的默認(rèn)Http參數(shù) 
clip_image006

2.6 增加Http請(qǐng)求

現(xiàn)在我們需要增加http請(qǐng)求了,他也是我們測(cè)試的內(nèi)容主體部分。你可以通過(guò)下面的步驟來(lái)增加性的http請(qǐng)求:

1. 選中可視化界面中左邊樹(shù)的Thread Group節(jié)點(diǎn),單擊右鍵,選擇Add'sampler'http request,界面右邊將會(huì)出現(xiàn)他的設(shè)置信息框。

2. 他的參數(shù)和2.5中介紹的http屬性差不多,增加的屬性中有發(fā)送http時(shí)方法的選擇,你可以選擇為get或者post。

我們現(xiàn)在增加兩個(gè)http 請(qǐng)求,因?yàn)槲覀冊(cè)O(shè)置了默認(rèn)的http屬性,所以和默認(rèn)http屬性中相同的屬性不再重復(fù)設(shè)置。設(shè)置后的屏幕截圖如下:

圖四:設(shè)置好的jsp測(cè)試請(qǐng)求 
clip_image008 
圖五:設(shè)置好的Servlet測(cè)試請(qǐng)求(帶參數(shù)) 
clip_image010

2.7 增加Listener

增加listener是為了記錄測(cè)試信息并且可以使用Jmeter提供的可視化界面查看測(cè)試結(jié)果,里面有好幾種結(jié)果分析方式可供選擇,你可以根據(jù)自己習(xí)慣的分析方式選擇不同的結(jié)果顯示方式,我們這里使用表格的形式來(lái)查看和分析測(cè)試結(jié)果。你可以通過(guò)下面的步驟來(lái)增加listener:

1. 選中可視化界面中左邊樹(shù)的Test Plan節(jié)點(diǎn),單擊右鍵,選擇Add'listener'view result in table,界面右邊將會(huì)出現(xiàn)他的設(shè)置信息和結(jié)果顯示框。

2. 你可以設(shè)置界面上面的filename屬性設(shè)置將測(cè)試結(jié)果保存到某個(gè)文件中界面下面將使用表格顯示測(cè)試結(jié)果,表格的第一列sampleno顯示請(qǐng)求執(zhí)行的順序和編號(hào),url顯示請(qǐng)求發(fā)送的目標(biāo),sample-ms列顯示這個(gè)請(qǐng)求完成耗費(fèi)的時(shí)間,最后的success列顯示改請(qǐng)求是否成功執(zhí)行。

界面的最下面你還可以看到一些統(tǒng)計(jì)信息,最關(guān)心的應(yīng)該是Average吧,也就是相應(yīng)的平均時(shí)間。

2.8 開(kāi)始執(zhí)行測(cè)試計(jì)劃

現(xiàn)在你可以通過(guò)單擊菜單欄run -> Start開(kāi)始執(zhí)行測(cè)試計(jì)劃了。下面這兩個(gè)圖是作者第一次、第二次執(zhí)行該測(cè)試計(jì)劃的結(jié)果圖:

圖六:第一次執(zhí)行后的結(jié)果顯示 
clip_image012 
圖七:第二次執(zhí)行的結(jié)果顯示 
clip_image014

大家可以看到第一次執(zhí)行時(shí)的幾個(gè)大時(shí)間值均來(lái)自于jsp request,這可以通過(guò)下面的理由進(jìn)行解釋:jsp執(zhí)行前都需要被編譯成.class文件。所以第二次的結(jié)果才是正常的結(jié)果。

總結(jié)

JMeter用于進(jìn)行供能或者性能測(cè)試,通過(guò)使用JMeter提供的供能,我們可以可視化的制定測(cè)試計(jì)劃:包括規(guī)定使用什么樣的負(fù)載、測(cè)試什么內(nèi)容、傳入的參數(shù),同時(shí),他提供了好多種圖形化的測(cè)試結(jié)果顯示方式,使我們能夠簡(jiǎn)單的開(kāi)始測(cè)試工作和分析測(cè)試結(jié)果。

本文中,作者根據(jù)自己的使用經(jīng)驗(yàn),詳細(xì)演示了如何使用JMeter來(lái)進(jìn)行Web測(cè)試的全部過(guò)程,簡(jiǎn)單的介紹了JMeter提供測(cè)試結(jié)果的圖形化顯示界面中相關(guān)參數(shù)的含義。希望能夠幫助大家學(xué)會(huì)使用JMeter的基本知識(shí),同時(shí),大家可以參考這個(gè)過(guò)程和JMeter的幫助文檔來(lái)實(shí)現(xiàn)對(duì)java對(duì)象、數(shù)據(jù)庫(kù)等的測(cè)試過(guò)程。

JMeter測(cè)試講解

本文介紹了 JMeter 相關(guān)的基本概念。并以 JMeter 為例,介紹了使用它來(lái)完成最常用的三種類型服務(wù)器,即 Web 服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器和消息中間件,壓力測(cè)試的方法、步驟以及注意事項(xiàng)。

講到測(cè)試,人們腦海中首先浮現(xiàn)的就是針對(duì)軟件正確性的測(cè)試,即常說(shuō)的功能測(cè)試。但是軟件僅僅只是功能正確是不夠的。在實(shí)際開(kāi)發(fā)中,還有其它的非功能因素也起著決定性的因素,例如軟件的響應(yīng)速度。影響軟件響應(yīng)速度的因素有很多,有些是因?yàn)樗惴ú粔蚋咝?;還有些可能受用戶并發(fā)數(shù)的影響。

在眾多類型的軟件測(cè)試中,壓力測(cè)試正是以軟件響應(yīng)速度為測(cè)試目標(biāo),尤其是針對(duì)在較短時(shí)間內(nèi)大量并發(fā)用戶的訪問(wèn)時(shí),軟件的抗壓能力。本文以 JMeter 為例,介紹了如何使用它來(lái)完成常用的壓力測(cè)試:Web 測(cè)試、數(shù)據(jù)庫(kù)測(cè)試和 JMS 測(cè)試。

JMeter 的主要測(cè)試組件總結(jié)如下:

1. 測(cè)試計(jì)劃是使用 JMeter 進(jìn)行測(cè)試的起點(diǎn),它是其它 JMeter 測(cè)試元件的容器。

2. 線程組代表一定數(shù)量的并發(fā)用戶,它可以用來(lái)模擬并發(fā)用戶發(fā)送請(qǐng)求。實(shí)際的請(qǐng)求內(nèi)容在Sampler中定義,它被線程組包含。

3. 監(jiān)聽(tīng)器負(fù)責(zé)收集測(cè)試結(jié)果,同時(shí)也被告知了結(jié)果顯示的方式。

4. 邏輯控制器可以自定義JMeter發(fā)送請(qǐng)求的行為邏輯,它與Sampler結(jié)合使用可以模擬復(fù)雜的請(qǐng)求序列。

5. 斷言可以用來(lái)判斷請(qǐng)求響應(yīng)的結(jié)果是否如用戶所期望的。它可以用來(lái)隔離問(wèn)題域,即在確保功能正確的前提下執(zhí)行壓力測(cè)試。這個(gè)限制對(duì)于有效的測(cè)試是非常有用的。

6. 配置元件維護(hù)Sampler需要的配置信息,并根據(jù)實(shí)際的需要會(huì)修改請(qǐng)求的內(nèi)容。

7. 前置處理器和后置處理器負(fù)責(zé)在生成請(qǐng)求之前和之后完成工作。前置處理器常常用來(lái)修改請(qǐng)求的設(shè)置,后置處理器則常常用來(lái)處理響應(yīng)的數(shù)據(jù)。

8. 定時(shí)器負(fù)責(zé)定義請(qǐng)求之間的延遲間隔。

JMeter的使用非常的容易,在 ONJava.com 上的文章 Using JMeter 提供了一個(gè)非常好的入門。

常用測(cè)試

壓力測(cè)試不同于功能測(cè)試,軟件的正確性并不是它的測(cè)試重點(diǎn)。它所看重的是軟件的執(zhí)行效率,尤其是短時(shí)間內(nèi)訪問(wèn)用戶數(shù)爆炸性增長(zhǎng)時(shí)軟件的響應(yīng)速度,壓力測(cè)試往往是在功能測(cè)試之后進(jìn)行的。在實(shí)際的開(kāi)發(fā)過(guò)程中,軟件潛在的效率瓶頸一般都是那些可能有多個(gè)用戶同時(shí)訪問(wèn)的節(jié)點(diǎn)。

就目前 Java EE 的平臺(tái)下開(kāi)發(fā)的軟件來(lái)說(shuō),這種節(jié)點(diǎn)通常可能是:Web 服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器和 JMS 服務(wù)器。它們都是請(qǐng)求主要發(fā)生的地點(diǎn),請(qǐng)求頻率較其它的節(jié)點(diǎn)要高,而且處于請(qǐng)求序列的關(guān)鍵路徑之上。如果它們效率無(wú)法提高的話,對(duì)于整個(gè)軟件的效率有致命的影響。而且在這些節(jié)點(diǎn)上一般都會(huì)發(fā)生較大規(guī)模的數(shù)據(jù)交換,有時(shí)其中還包含有業(yè)務(wù)邏輯處理,它們正是在進(jìn)行壓力測(cè)試時(shí)首先需要考慮的。

本文以這三種節(jié)點(diǎn)為例,介紹如何使用 JMeter 來(lái)完成針對(duì)于它們的壓力測(cè)試。

Web 服務(wù)器

對(duì)于大多數(shù)的項(xiàng)目來(lái)說(shuō),并不會(huì)自行開(kāi)發(fā)一個(gè)Web服務(wù)器,因此Web服務(wù)器壓力測(cè)試的對(duì)象實(shí)際就是--發(fā)布到Web服務(wù)器中的軟件。最簡(jiǎn)單的Web測(cè)試計(jì)劃只需要三個(gè) JMeter 的測(cè)試元件,如下圖:

clip_image015

其中:

  • 在線程組中定義線程數(shù)、產(chǎn)生線程發(fā)生的時(shí)間和測(cè)試循環(huán)次數(shù)。
  • 在http請(qǐng)求中定義服務(wù)器、端口、協(xié)議和方法、請(qǐng)求路徑等。
  • 表格監(jiān)聽(tīng)器負(fù)責(zé)收集和顯示結(jié)果。

這種設(shè)置對(duì)于包含了安全機(jī)制的 web 應(yīng)用是不夠的,典型的 web 應(yīng)用一般都會(huì):

1. 有一個(gè)登錄頁(yè),它是整個(gè)應(yīng)用的入口。當(dāng)用戶登錄之后,應(yīng)用會(huì)將用戶相關(guān)的安全信息放到 session 中。

2. 有一個(gè) filter,它攔截請(qǐng)求,檢查每個(gè)請(qǐng)求相關(guān)的 session 中是否包含有用戶安全信息。如果沒(méi)有,那么請(qǐng)求被重定向到登錄頁(yè),要求用戶提供安全信息。

在這種配置下應(yīng)用上面的測(cè)試計(jì)劃,那么除了登錄頁(yè)之外的其它請(qǐng)求都將因?yàn)槿鄙儆脩舭踩畔ⅲ拐?qǐng)求實(shí)際定位到登錄頁(yè)。如果不加斷言,那么在監(jiān)聽(tīng)器看來(lái)所有的請(qǐng)求都是成功。而實(shí)際上,這些請(qǐng)求最終都沒(méi)有到達(dá)它們應(yīng)該去的地方。顯然,這種測(cè)試結(jié)果不是我們所期望的。

為了成功的測(cè)試,至少有2種方法:

  • 方法一,去掉程序的安全設(shè)置,如filter,使得不需要用戶安全信息也能訪問(wèn)受限內(nèi)容;
  • 方法二,不修改程序,使用JMeter提供的"Http URL重寫(xiě)修飾符"或"Http Cookie管理器"。

對(duì)于第一種方法,有其局限性:

  • 需要修改程序配置,如去掉web.xml中關(guān)于安全filter的設(shè)置。需要維護(hù)多個(gè)版本的web.xml,如壓力測(cè)試和功能測(cè)試分別各自的web.xml,增加了維護(hù)成本,而且有可能會(huì)在測(cè)試之后忘記將web.xml修改回來(lái)。
  • 對(duì)于一些需要用戶安全信息的頁(yè)面無(wú)能為力,如某些業(yè)務(wù)審計(jì)操作需要用戶安全信息來(lái)記錄。因?yàn)槿鄙龠@樣的信息,注定了測(cè)試的失敗。如果解決為了這個(gè)問(wèn)題進(jìn)一步的修改程序,那么因?yàn)榇嬖诙鄠€(gè)版本的程序,那么其維護(hù)難度將大大增加。

雖然,第二種方法配置難度增加了,但是它不用修改程序。而且還可將測(cè)試計(jì)劃保存成文件,以便重復(fù)使用。因此,選用第二種方法是較為理想的做法。下面以一個(gè)簡(jiǎn)化的例子說(shuō)明使用方法二的配置步驟。

1. 例子由以下幾個(gè)文件組成:

  • AuthorizenFilter.java,過(guò)濾器負(fù)責(zé)檢驗(yàn)session中是否存在用戶信息。如果沒(méi)有,那么就轉(zhuǎn)向到 login.jsp。它的主要方法 doFilter 內(nèi)容如下:

public void doFilter(ServletRequest request,

ServletResponse response,

FilterChain chain)

throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest)request;

HttpServletResponse res = (HttpServletResponse)response;

HttpSession session= req.getSession();

User user = (User)session.getAttribute("user");

if(null == user){

String uri= req.getRequestURI();

//如果請(qǐng)求頁(yè)是登錄頁(yè),不轉(zhuǎn)向

if( uri.equalsIgnoreCase("/gWeb/login.jsp")){

chain.doFilter(request, response);

} else{

res.sendRedirect("/gWeb/login.jsp");

}

}else{

chain.doFilter(request, response);

}

}

  • User.java,用戶類負(fù)責(zé)記錄用戶的信息。為了簡(jiǎn)化,這里的登錄操作只允許指定用戶名和密碼。主要內(nèi)容如下:

public class User {

private String user;

private String pwd;

public User(String user, String pwd) {

this.user = user;

this.pwd = pwd;

}

public boolean login(){

return user.equals("foxgem") && pwd.equals("12345678");

}

public String getUser() {

return user;

}

public void setUser(String user) {

this.user = user;

}

}

  • Login.jsp 和welcome.jsp。其中 login.jsp 負(fù)責(zé)生成 User 對(duì)象,并調(diào)用 User 的login。當(dāng) login 返回為 true 時(shí)轉(zhuǎn)向到 welcome.jsp。其驗(yàn)證部分的代碼:
  • web.xml,配置 filter 攔截所有訪問(wèn) JSP 頁(yè)面的請(qǐng)求:

authorizen

org.foxgem.jmeter.AuthorizenFilter

authorizen

*.jsp

2. 創(chuàng)建如下結(jié)構(gòu)的Web測(cè)試計(jì)劃:

clip_image016

其中主要測(cè)試元件說(shuō)明如下:

  • http請(qǐng)求默認(rèn)值負(fù)責(zé)記錄請(qǐng)求的默認(rèn)值,如服務(wù)器、協(xié)議、端口等。
  • 第一個(gè)http請(qǐng)求,請(qǐng)求login.jsp,并附加驗(yàn)證所需要的參數(shù)(user=foxgem,pwd=12345678,Submit=Submit);其包含的響應(yīng)斷言驗(yàn)證url中包含"welcome.jsp",這一點(diǎn)可以從程序中反應(yīng)。
  • 第二個(gè)http請(qǐng)求,請(qǐng)求是welcome.jsp;其包含的響應(yīng)斷言驗(yàn)證響應(yīng)文本中包含"foxgem",它是welcome.jsp頁(yè)面邏輯的一部分。
  • http cookie管理器負(fù)責(zé)管理整個(gè)測(cè)試過(guò)程中使用的cookie,它不需要設(shè)置任何屬性。
  • 循環(huán)控制器設(shè)置發(fā)送第二個(gè)請(qǐng)求的循環(huán)次數(shù),表格監(jiān)聽(tīng)器負(fù)責(zé)收集和顯示第二個(gè)請(qǐng)求的測(cè)試結(jié)果。

啟動(dòng)測(cè)試計(jì)劃之后,執(zhí)行的順序是:首先,第一個(gè)請(qǐng)求登錄頁(yè)進(jìn)行登錄;成功登錄之后,使用循環(huán)控制器執(zhí)行第二個(gè)請(qǐng)求。請(qǐng)求welcome.jsp時(shí),響應(yīng)斷言用來(lái)驗(yàn)證是否確實(shí)是welocme.jsp來(lái)處理請(qǐng)求,而不是因?yàn)槠渌?yè)。在這個(gè)測(cè)試計(jì)劃中需要注意的是http cookie管理器。正是由于它的作用,使得第二個(gè)請(qǐng)求能順利的發(fā)送到welcome.jsp進(jìn)行處理,而不是因?yàn)槿鄙儆脩舭踩畔⑥D(zhuǎn)發(fā)到login.jsp。

在這個(gè)例子中,我們并沒(méi)有在程序中使用cookie(使用的是session),那么http cookie管理器怎么會(huì)起作用呢?這是因?yàn)樵趕ervlet/jsp規(guī)范中對(duì)于session的狀態(tài)跟蹤有2種方式:

  • 使用cookie,保留和傳遞sessionid。它不要求程序?qū)τ趗rl有什么特殊的處理,但是要求瀏覽器允許cookie。在這個(gè)例子中,就是這種情形。
  • 使用url重寫(xiě),每次顯式的在瀏覽器和服務(wù)器之間傳遞sessionid。它要求程序?qū)rl進(jìn)行編碼,對(duì)瀏覽器沒(méi)有要求。

對(duì)于第二種情形,可以使用JMeter前置管理器中的http url重寫(xiě)修飾符來(lái)完成。對(duì)于Tomcat,Session參數(shù)是jsessionid,路徑擴(kuò)展使用";"。使用url編碼時(shí)需要注意,必須將瀏覽器的cookie功能關(guān)閉。因?yàn)閡rl編碼函數(shù),如encodeURL,會(huì)判斷是否需要將sessionid編碼到url中。當(dāng)瀏覽器允許cookie時(shí),就不會(huì)進(jìn)行編碼。

如果cookie而不是session來(lái)保存用戶安全信息,那么直接使用http cookie管理器就行了。此時(shí),需要將使用的cookie參數(shù)和值直接寫(xiě)到管理器中,由它負(fù)責(zé)管理。對(duì)于其它的cookie使用,也是如此操作。

登錄問(wèn)題解決之后,對(duì)于 Web 服務(wù)器的測(cè)試就沒(méi)什么難點(diǎn)了。剩下的就是根據(jù)實(shí)際需要,靈活運(yùn)用相關(guān)的測(cè)試組件搭建編寫(xiě)的測(cè)試計(jì)劃。(當(dāng)然,對(duì)于安全問(wèn)題還有其它的使用情景。在使用時(shí)需要明確:JMeter 是否支持,如果支持使用哪種測(cè)試組件解決。)

數(shù)據(jù)庫(kù)服務(wù)器

數(shù)據(jù)庫(kù)服務(wù)器在大多數(shù)企業(yè)項(xiàng)目中是不可缺少的,對(duì)于它進(jìn)行壓力測(cè)試是為了找出:數(shù)據(jù)庫(kù)對(duì)象是否可以有效地承受來(lái)自多個(gè)用戶的訪問(wèn)。這些對(duì)象主要是:索引、觸發(fā)器、存儲(chǔ)過(guò)程和鎖。通過(guò)對(duì)于SQL語(yǔ)句和存儲(chǔ)過(guò)程的測(cè)試,JMeter 可以間接的反應(yīng)數(shù)據(jù)庫(kù)對(duì)象是否需要優(yōu)化。

JMeter 使用 JDBC 發(fā)送請(qǐng)求,完成對(duì)于數(shù)據(jù)庫(kù)的測(cè)試。一個(gè)數(shù)據(jù)庫(kù)測(cè)試計(jì)劃,建立如下結(jié)構(gòu)即可:

clip_image017

其中:

  • JDBC連接配置,負(fù)責(zé)配置數(shù)據(jù)庫(kù)連接相關(guān)的信息。如:數(shù)據(jù)庫(kù)url、數(shù)據(jù)庫(kù)驅(qū)動(dòng)類名、用戶名和密碼等等。在這些配置中,"綁定到池的變量名"(Variable Name Bound to Pool)是一個(gè)非常重要的屬性,這個(gè)屬性會(huì)在JDBC請(qǐng)求中被引用。通過(guò)它, JDBC請(qǐng)求和JDBC連接配置建立關(guān)聯(lián)。(測(cè)試前,請(qǐng)將所需要的數(shù)據(jù)庫(kù)驅(qū)動(dòng)放到JMeter的classpath中)。
  • JDBC請(qǐng)求,負(fù)責(zé)發(fā)送請(qǐng)求進(jìn)行測(cè)試。
  • 圖形結(jié)果,收集顯示測(cè)試結(jié)果。

在實(shí)際的項(xiàng)目中,至少有2種類型的JDBC請(qǐng)求需要關(guān)注:select語(yǔ)句和存儲(chǔ)過(guò)程。前者反應(yīng)了select語(yǔ)句是否高效,以及表的索引等是否需要優(yōu)化;后者則是反應(yīng)存儲(chǔ)過(guò)程的算法是否高效。它們?nèi)绻实拖?,必然?huì)帶來(lái)響應(yīng)上的不盡如人意。對(duì)于這兩種請(qǐng)求,JDBC請(qǐng)求的配置略有區(qū)別:

  • Select語(yǔ)句

clip_image018

  • 存儲(chǔ)過(guò)程

clip_image019

如果對(duì)于Oracle,如果測(cè)試的是函數(shù),那么也可以使用select語(yǔ)句來(lái)進(jìn)行配置,此時(shí)可以使用:select 函數(shù)(入?yún)? from dual形式的語(yǔ)句來(lái)測(cè)試,其中dual是oracle的關(guān)鍵字,表示啞表。對(duì)于其它廠商的數(shù)據(jù)庫(kù)產(chǎn)品,請(qǐng)查找手冊(cè)。

JMS服務(wù)器

MOM 作為消息數(shù)據(jù)交換的平臺(tái),也是影響應(yīng)用執(zhí)行效率的潛在環(huán)節(jié)。在 Java 程序中,是通過(guò) JMS 與 MOM 進(jìn)行交互的。作為 Java 實(shí)現(xiàn)的壓力測(cè)試工具,JMeter 也能使用 JMS 對(duì)應(yīng)用的消息交換和相關(guān)的數(shù)據(jù)處理能力進(jìn)行測(cè)試。這一點(diǎn)應(yīng)該不難理解,因?yàn)樵谡麄€(gè)測(cè)試過(guò)程中,JMeter 測(cè)試的重點(diǎn)應(yīng)該是消息的產(chǎn)生者和消費(fèi)者的本身能力,而不是 MOM本身。

根據(jù) JMS 規(guī)范,消息交換有2種方式:發(fā)布/訂閱和點(diǎn)對(duì)點(diǎn)。JMeter針對(duì)這兩種情形,分別提供了不同的Sampler進(jìn)行支持。以下MOM我們使用ActiveMQ 3.2.1,分別描述這兩種消息交換方式是如何使用 JMeter 進(jìn)行測(cè)試。

1. 測(cè)試前的準(zhǔn)備(兩種情況都適用)

JMeter 雖然能使用 JMS 對(duì) MOM 進(jìn)行測(cè)試,但是它本身并沒(méi)有提供JMS需要使用的包。因此,在測(cè)試之前需要將這些包復(fù)制到 %JMETER_HOME%/lib 下。對(duì)于 ActiveMQ 來(lái)說(shuō),就是復(fù)制 %ACTIVEMQ_HOME%/lib。%ACTIVEMQ_HOME%/optional 是可選包,可根據(jù)實(shí)際情況來(lái)考慮是否復(fù)制。

JMeter 在測(cè)試時(shí)使用了 JNDI,為了提供 JNDI 提供者的信息,需要提供 jndi.properties。同時(shí)需要將 jndi.properties 放到 JMeter 的 classpath 中,建議將它與 bin下的 ApacheJMeter.jar 打包在一起。對(duì)于 ActiveMQ,jndi.properties 的示例內(nèi)容如下:

java.naming.factory.initial = org.activemq.jndi.ActiveMQInitialContextFactory

java.naming.provider.url = tcp://localhost:61616

#指定connectionFactory的jndi名字,多個(gè)名字之間可以逗號(hào)分隔。

#以下為例:

#對(duì)于topic,使用(TopicConnectionFactory)context.lookup("connectionFactry")

#對(duì)于queue,(QueueConnectionFactory)context.lookup("connectionFactory")

connectionFactoryNames = connectionFactory

#注冊(cè)queue,格式:

#queue.[jndiName] = [physicalName]

#使用時(shí):(Queue)context.lookup("jndiName"),此處是MyQueue

queue.MyQueue = example.MyQueue

#注冊(cè)topic,格式:

# topic.[jndiName] = [physicalName]

#使用時(shí):(Topic)context.lookup("jndiName"),此處是MyTopic

topic.MyTopic = example.MyTopic

2. 發(fā)布/訂閱

在實(shí)際測(cè)試時(shí),發(fā)布者和訂閱者并不是需要同時(shí)出現(xiàn)的。例如,有時(shí)我們可能想測(cè)試單位時(shí)間內(nèi)消息發(fā)布者的消息產(chǎn)生量,此時(shí)就不需要消息發(fā)布者,只需要訂閱者就可以了。本例為了說(shuō)明這兩種Sampler的使用,因此建立如下的測(cè)試計(jì)劃:

clip_image020

其中JMS Publisher和JMS Subscriber的屬性:選擇"使用jndi.properties",連接工廠是connectionFactory,主題是MyTopic,其它使用默認(rèn)配置。對(duì)于JMS Publisher,還需提供測(cè)試用的文本消息。

啟動(dòng)ActiveMQ,運(yùn)行測(cè)試計(jì)劃。如果配置正確,那么與ActiveMQ成功連接之后,在JMeter的后臺(tái)會(huì)打印出相關(guān)信息。在測(cè)試過(guò)程中,JMeter 后臺(tái)打印可能會(huì)出現(xiàn)java.lang.InterruptedException 信息,這個(gè)是正?,F(xiàn)象,不會(huì)影響測(cè)試過(guò)程和結(jié)果。這一點(diǎn)可以從 bin 下的 jmeter.log 看出。

3. 點(diǎn)對(duì)點(diǎn)

對(duì)于點(diǎn)對(duì)點(diǎn),JMeter只提供了一種Sampler:JMS Point-to-Point。在例子中,建立如下圖的測(cè)試計(jì)劃:

clip_image021

其中:Communication style是Request Only。對(duì)于另一種風(fēng)格:Request Response,會(huì)驗(yàn)證收到消息的JMS Header中的JMSCorrelationID,以判斷是否是對(duì)請(qǐng)求消息的響應(yīng)。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多