您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源性能測(cè)試工具 > Jmeter
Jmeter使用指南
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/3/27 14:48:57 ] 推薦標(biāo)簽:

  本文重點(diǎn)介紹JMeter工具在測(cè)試中地位以及其中一些難以理解或者手冊(cè)中含糊不清的感念,讀者可以通過本文了解這些概念,然后再根據(jù)自己的需要查閱JMeter中各個(gè)組件的具體用法來完成測(cè)試工作。

  1. 簡(jiǎn)介

  JMeter是一個(gè)專門用于測(cè)試C/S應(yīng)用的桌面測(cè)試軟件(并不適合于B/S結(jié)構(gòu),因?yàn)樗茈y模擬用戶在browser上的動(dòng)作,如果需要測(cè)試B/S結(jié)構(gòu)的應(yīng)用,可以選擇Selenium這樣的工具),主要被用來完成功能測(cè)試,壓力測(cè)試 ,性能測(cè)試等工作。

  JMeter與其它測(cè)試軟件相比的優(yōu)勢(shì)如下:

    它可以幫助測(cè)試者很方便地模擬出多用戶同時(shí)訪問服務(wù)器的環(huán)境(通過Thread Group),這樣可以檢測(cè)出很多平時(shí)在單線程環(huán)境下無法暴露出來的問題。
    應(yīng)用范圍很廣,幾乎所有你能想到的C/S應(yīng)用它都能夠提供了相應(yīng)的支。JMeter中自己定制了一些特定應(yīng)用的測(cè)試方案,例如對(duì)HTTP Server的測(cè)試、對(duì)數(shù)據(jù)庫的測(cè)試、對(duì)Java程序的測(cè)試等。此外即使Jmeter沒有提供當(dāng)前應(yīng)用的測(cè)試環(huán)境,用戶也可以同昨BeanShell的方式自行定制。
    提供了豐富的邏輯控制器,可以允許測(cè)試人員很方便地寫出一些相對(duì)復(fù)雜的測(cè)試邏輯。
    提供完善的變量機(jī)制以及配置機(jī)制,幫助測(cè)試人員減輕編寫用例的負(fù)擔(dān),減少重復(fù)工作。
    提供了強(qiáng)大的監(jiān)控組建,幫助測(cè)試人員很方便地得到測(cè)試結(jié)果統(tǒng)計(jì)信息。

  JMeter的劣勢(shì):

    難以針對(duì)“正確性”進(jìn)行測(cè)試。雖然JMeter提供了斷言機(jī)制,但是通常我們的測(cè)試在模擬多用戶操作,因此某個(gè)用戶發(fā)出一個(gè)請(qǐng)求后得到的響應(yīng)是不可預(yù)測(cè)的(例如同時(shí)對(duì)一個(gè)數(shù)據(jù)庫表進(jìn)行讀寫,雖然我們可以讓每個(gè)模擬用戶將寫入的信息存儲(chǔ)在某個(gè)公共區(qū)域,但仍然可能會(huì)有問題,因?yàn)閿?shù)據(jù)庫寫入的時(shí)間和寫入公共區(qū)域的時(shí)間并不能保證同步),因此如果想通過JMeter驗(yàn)證應(yīng)用的正確性還是比較麻煩的。通常我們只是利用斷言來檢查一些較為簡(jiǎn)單而又重要的信息,例如返回碼。
    沒有很好的BeanShell測(cè)試機(jī)制。在JMeter中,BeanShell是非常重要的一部分,因?yàn)橥ǔMeter定制的測(cè)試方案多少與我們的應(yīng)用有些出入,這時(shí)需要使用BeanShell來完成一些JMeter無法完成的工作。然而BeanShell也是需要保證正確性的,而JMeter并沒有對(duì)BeanShell的測(cè)試提供很好的支持。
    通過以上的分析,可以發(fā)現(xiàn)JMeter更適合找出被測(cè)試系統(tǒng)在并發(fā)環(huán)境下存在的問題。

  2. JMeter測(cè)試用例的基本結(jié)構(gòu)

  JMeter測(cè)試用例的基本結(jié)構(gòu)是一個(gè)類似于Windows資源管理器的樹形結(jié)構(gòu),這個(gè)樹中的每一個(gè)節(jié)點(diǎn)都由一個(gè)元素來表示,因此一個(gè)完整的JMeter測(cè)試用例實(shí)際上是由一個(gè)個(gè)元素組成的,而測(cè)試的執(zhí)行過程實(shí)際上是這些元素的執(zhí)行過程。一般而言,JMeter會(huì)使用深度優(yōu)先的方式遍歷這些元素,而對(duì)于同一層的元素,JMeter會(huì)自上至下地執(zhí)行。

  在JMeter中有很多種元素,而每種元素在樹型結(jié)構(gòu)中都有特定的意義,為了方便理解,這里把這些元素從結(jié)構(gòu)性質(zhì)上分為三大類:

  第一類是控制型元素,這類元素通常出現(xiàn)在樹型結(jié)構(gòu)的枝節(jié)點(diǎn),它們被用來控制其下第一層元素(注意,不是其下所有元素)的執(zhí)行,例如控制他們的先后順序,或者執(zhí)行哪個(gè)或者不執(zhí)行哪個(gè)。通過這類元素我們可以很方便地動(dòng)態(tài)控制測(cè)試用例的執(zhí)行過程,這些元素類似于變成語言中的if-else、switch、while等邏輯控制語句。

  第二類是動(dòng)作型元素,這類元素是真正發(fā)起測(cè)試請(qǐng)求的元素,它們通常位于樹型結(jié)構(gòu)的底層,每一個(gè)動(dòng)作元素代表一次請(qǐng)求-響應(yīng)的過程,他們的執(zhí)行順序通常被控制型元素管理。

  第三類是配置型元素,它們只能作為樹型結(jié)構(gòu)中的葉子節(jié)點(diǎn),被用于對(duì)其作用范圍內(nèi)(作用范圍的規(guī)則如下:如果該配置元素在控制元素下,則其作用范圍為該控制元素下的所有子孫節(jié)點(diǎn);如果該配置元素在動(dòng)作元素下,則其作用范圍僅為這一個(gè)動(dòng)作元素)的所有動(dòng)作型元素產(chǎn)生一定的影響。這些影響根據(jù)具體元素種類而不同,例如改變?cè)氐膮?shù)、延遲請(qǐng)求時(shí)間、在請(qǐng)求前后加入一些動(dòng)作、監(jiān)聽請(qǐng)求及其相應(yīng)。此外,如果某個(gè)動(dòng)作型元素被多個(gè)相同的配置型元素影響后,這些配置型元素的效果會(huì)進(jìn)行Merge,Merge的規(guī)則依照元素的功能類型不同而不同(詳見第3節(jié))。

  3. JMeter中的元素

  從功能上講,JMeter的元素分為八大類以及兩個(gè)特殊元素。這里從使用場(chǎng)合上對(duì)這些元素進(jìn)行敘述,至于具體每個(gè)元素什么功能則需要查看JMeter的幫助(具體方法是點(diǎn)擊未知的元素,然后選擇Help菜單下的Help選項(xiàng))。

    Test Plan元素:控制型元素。只能存在于樹型結(jié)構(gòu)的根節(jié)點(diǎn)。它代表了整個(gè)測(cè)試方案,測(cè)試人員可以在這里設(shè)置一些全局性的內(nèi)容,例如全局變量(注意全局變量是Thread Local的,詳見第4節(jié))、ClassPath配置(如果希望在Jmeter中調(diào)用自己的Java類需要在這里設(shè)置了)等。
    Thread Group元素:控制型元素。只能存在于Test Plan元素之下。它代表了一組行為相似的用戶,通常我們把一類用戶的動(dòng)作放在同一個(gè)Thread Group下,這樣可以模擬多這這樣的用戶了。在這里可以配置模擬用戶的個(gè)數(shù)(線程的個(gè)數(shù))、循環(huán)次數(shù)、執(zhí)行時(shí)間等。
    Logic Controller:控制型元素。可以存在于Thread Group下任何位子。它用來完成控制其下元素的執(zhí)行,JMeter提供了很多Logic Controller類型的元素,方便我們?cè)跍y(cè)試中實(shí)現(xiàn)基本的邏輯。
    Config Element: 配置型元素。這些元素被用來改變其作用范圍內(nèi)所有動(dòng)作元素的配置,利用該類元素可以減少很多測(cè)試用例編寫中的重復(fù)工作,例如可以讓一個(gè)HTTP Request Defaults元素來配置所有用例中HTTP請(qǐng)求的主機(jī)地址以及端口號(hào),這樣無須在每個(gè)動(dòng)作元素中都做這樣的配置了。當(dāng)Merge發(fā)生時(shí),如果某個(gè)域只有一個(gè)Config Element元素有值,則使用該值;如果某個(gè)域有多個(gè)Config Element元素有值,則使用離動(dòng)作元素近的Config Element元素的值(在動(dòng)作元素節(jié)點(diǎn)下的配置元素近)。
    Timer: 配置型元素。如果希望控制請(qǐng)求發(fā)出的頻率,則應(yīng)該使用Timer延遲這些請(qǐng)求。當(dāng)Merge發(fā)生時(shí),所有Timer的時(shí)間會(huì)相加。
    Pre Processor: 配置型元素。用于根據(jù)一定條件修改所有被影響的動(dòng)作元素。當(dāng)Merge發(fā)生時(shí),這些Pre Processor將被依次執(zhí)行,離動(dòng)作元素遠(yuǎn)的先執(zhí)行。
    Post Processor: 同Pre Processor,只是發(fā)生在動(dòng)作元素之后,用于從響應(yīng)中提取需要的信息。
    Assertions: 配置型元素。用于對(duì)其影響范圍內(nèi)的動(dòng)作元素的結(jié)果進(jìn)行斷言,例如可以斷言一些HTTP請(qǐng)求的返回碼,如果不通過則系統(tǒng)會(huì)記錄本次錯(cuò)誤。Merge發(fā)生時(shí),所有的Assertion都會(huì)被判斷。
    Listener: 配置型元素。用于監(jiān)聽其影響范圍內(nèi)所有動(dòng)作元素,測(cè)試結(jié)果數(shù)據(jù)主要由該類元素產(chǎn)生,因此他們非常有用。Merge發(fā)生時(shí),所有的Listener監(jiān)控動(dòng)作都會(huì)被執(zhí)行。
    Sampler: 動(dòng)作型元素。代表一次請(qǐng)求-響應(yīng)的過程,他們是測(cè)試用例中動(dòng)作的發(fā)起者,是測(cè)試用例的主要元素。JMeter根據(jù)不同的應(yīng)用預(yù)制了很多種動(dòng)作元素,如果用戶覺得仍然不夠用甚至可以用BeanShell Sampler寫自己的動(dòng)作。

  4. JMeter中的變量

  有的時(shí)候我們希望發(fā)送成千上萬個(gè)隨機(jī)的請(qǐng)求,或者希望本次請(qǐng)求的內(nèi)容依賴于前幾次的請(qǐng)求,那么需要使用JMeter中的變量(注意,是Variable不是Property),這樣可以用變量來配置每一個(gè)請(qǐng)求,這樣可以讓同一個(gè)Sampler每次都能發(fā)出不同的請(qǐng)求。

  使用變量時(shí),首先必須注意的是,JMeter中的變量是線程獨(dú)立(Thread Local)的,也是說雖然我們定義了n個(gè)變量,但是在每個(gè)線程中都有這n個(gè)變量的鏡像,他們之間相互獨(dú)立,互不干擾。

  當(dāng)我們希使用變量的時(shí)候,首先需要?jiǎng)?chuàng)建所需的變量。在JMeter中創(chuàng)建變量的方式很多,一種途徑是通過Test Plan定義全局變量(用于所有的Thread Group,它也是線程獨(dú)立的),也可以通過Config Element中的User Defined Element來定義不同線程組的局部變量(注意,User Defined Element中定義的變量是用于整個(gè)線程組的,無論將這個(gè)元素放在哪里都會(huì)被應(yīng)用于整個(gè)線程組,這是一個(gè)比較特殊的配置型元素),此外當(dāng)我們?cè)趹?yīng)用中對(duì)某個(gè)沒有創(chuàng)建的變量賦值(后面會(huì)講到賦值)時(shí)也會(huì)創(chuàng)建該變量。實(shí)際上JMeter的源碼中是使用Map來實(shí)現(xiàn)變量的,因此這些性質(zhì)也不難理解。

  當(dāng)我們希望在某個(gè)地方引用一個(gè)變量的時(shí)候,可以通過${變量名}的語法來獲取變量的值。注意,如果這個(gè)變量沒有被定義,則這個(gè)式子會(huì)被當(dāng)作普通的字符串。

  修改某個(gè)變量值的方法有很多,可以通過BeanShell來修改,也可以通過JMeter中一些特定的元素來修改(例如CSV Date Config Element),還可以使用JMeter函數(shù)來定義修改某個(gè)變量(具體如何做,見后面的小節(jié))。

上一頁1234下一頁
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd