1. 程式人生 > >jMeter3.3--基礎知識(測試計劃包含的元素)學習3

jMeter3.3--基礎知識(測試計劃包含的元素)學習3

3 測試計劃的組成:

    測試計劃至少要包含測試計劃,一個執行緒組和一個或多個例項

3.0 測試計劃

    在建立測試計劃時,可以在勾選複選框functional testing(用於記錄返回資料)。

    若勾選了該選項,則jMeter會記錄伺服器和各例項返回的資料。若你對例項的監聽物件選擇了指定檔案,那麼資料會寫入該檔案內。這個很有用,可以用來執行檢查你的jMeter配置是否正確,你的伺服器是否返回了指定的結果。當然,返回資料存在檔案裡面,肯定會讓檔案變的很大。這時,你可在配置中選擇對監聽物件指定寫入檔案的欄位。若你是不想要記錄返回的資料,那麼該選項對於你來說就是沒用的。

    當你要做壓力測試時,就不要勾選該選項了。

3.1 執行緒組

    所有的測試計劃,都是從執行緒組開始的。所有的控制器和例項都是基於執行緒的,所以控制器和例項必須放線上程中。其他的部分也可以直接放在測試計劃中,便於應用於所有的執行緒組中,例如,監聽物件。正如執行緒組這個名字一樣,它可以控制JMeter執行你的指令碼所需要的執行緒數量,你還可以控制上升時間段和執行測試的次數。

    每個執行緒都是獨立的,多執行緒在這裡用來模擬多個同時連線到伺服器的請求。

上升時間:在上升時間內,假如是120s,那在120s內,我有30個執行緒,則每個執行緒開啟的時間將會延遲4s。所以要把握好上升時間,不要過長也不要過短,除非你是故意設定的。

120s內30個執行緒會完全執行完。

    線上程組中設定了一個 scheduler 的複選框,你可以選擇上升時間段中開始的時間,和執行緒與執行緒之間的延遲時間。

3.2 控制器

    jMeter有兩種控制器:例項和邏輯控制器,用於驅動測試進行。

3.2.1 例項

    用於告訴jMeter,傳送請求給伺服器並等待響應。例如,你想要傳送一個http請求,你需要增加一個http請求例項。你也可以通過增加一個或多個配置元素,來自定義例項。這些請求都是按照他們在樹種出現的順序來處理的。

jMeter的例項包含了

    每一個例項都包含很多屬性,這些屬性你是可以自行設定的。你也可以在測試計劃中通過新增配置元素裡面,自定義一個例項。

    如果你想傳送多個相同型別的請求到同一個伺服器,你可以考慮使用一個預設的配置元素。每一個控制器都有一個或更多的預設元素。

    記得新增一個監聽器到你的測試計劃中,用於觀察或儲存寫到硬碟的請求結果。

    如果你想讓jMeter在效能測試中對你請求的結果進行一個確認,可以在例項中使用斷言。例如,在web應用的壓力測試中,伺服器返回一個成功的http請求程式碼,但是頁面中的相應部分卻是空白的,這樣你可以通過斷言去檢查頁面中特定的html標籤,錯誤的字串等等。jMeter可以使用正則表示式來斷言。

3.2.2 邏輯控制器

    可以讓你自定義jMeter什麼時候傳送請求的邏輯。例如,你可以使用一個邏輯控制器,交替控制http請求的例項。邏輯控制器可以改變來自子元素的請求順序。也可以修改請求本身,重複請求等。

    為了理解一個測試計劃中的邏輯控制器,我們下面的測試樹。

    關於這個測試的第一件事是,登入請求只用請求一次,子迭代器將會跳過它,這是 once only controller 這個控制器的作用。登入之後,下一個例項將載入搜尋頁面(這個再web應用中很常見,例如,使用者登入後,跳轉到搜尋頁面進行搜尋)這只是一個簡單的請求,並不會通過任何邏輯方面的控制器過濾。

    在載入完搜尋頁面後,我們想進行搜尋。實際上,我們想要做兩種不同的搜尋。然而,我們想要讓每個搜尋頁面自動的進行重新載入。我們可以這樣做建立4個簡單的http請求元素(載入搜尋,搜尋“A”,載入搜尋,搜尋“B”)。實際上,我們是使用的記憶體交錯控制器,它是每次通過傳遞一個子請求來實現的。它維持各個子請求的順序(不會隨機的傳遞一個子請求,而會記錄他的順序)。交錯控制兩個子請求有點大材小用了,最好是用於控制8或20個子請求。

    注意,Http Request Default 是屬於交錯控制器型別的。想象一下,搜尋“A”和搜尋“B”共享同一個路徑資訊(一個http請求格式包括域名,埠號,方法,協議,路徑和查詢引數等其他可選項)。這是很有意思的,兩個搜尋請求都是訪問的相同的後端搜尋引擎(servlet 或者 cgi-script)。我們並不會配置兩個相同的http例項(這兩個http請求的路徑欄位是一樣的),我們會提取出這個相同的資訊配置成一個單獨的配置元素。當交錯控制器切換搜尋頁面的時候,它將會自動的從http預設請求配置元素中去填充這個空白值。因此,我們要讓PATH欄位對這一類請求為空,然後從配置元素中去填充這個資訊。雖然這個例子不是很好,但是它很好的展示了這個特性。

    在這個大的測試樹中的下一個元素是另一個http預設請求,這個是是加線上程組中的。這個執行緒組有一個內建的邏輯控制器,它就是用的這個配置元素。http預設請求 可以填充任何由這個配置的空白欄位。在web測試中,這一點非常好用,它可以讓所有的http例項元素中的域名欄位留空,並將那些域名資訊放進http預設請求元素中,加入到執行緒組。通過這樣做,你只用修改一個欄位就可以在不同的伺服器上測試你的應用程式,否則你就只有去依次修改每一個例項。

    最後一個元素是http cookie manager,一個cookie manager 應該加入到所有web測試當中,否則jMeter將會忽略這些cookie。通過線上程組增加cookie,我們可以在所有的http請求中共享相同的cookie。

    邏輯控制器可以和其他的元素結合來實現各種效果,可參考 內建邏輯控制器。

3.2.3 測試片段

    測試是一種特殊型別的控制器,它存在於測試計劃樹中,與執行緒組同級。但是它和執行緒組最大的區別是它不會執行,除非該測試片段被一個模組控制器(module Controller)或一個包含控制器(include_Controller)指定了要執行。

    這個元素完全就是為了能在測試計劃中進行程式碼重用。

3.3 監聽器

    監聽器可以在jMeter執行測試用例時獲取資料資訊。圖示結果監聽器(Graph Results)可以在圖表中繪製相應時間。檢視結果樹(View Results Tree)監聽器能顯示實力請求和響應的各種詳細資訊,並呈現基本的HTML和XML格式得響應。其他的監聽者提供了總結資訊。

    除此之外,監聽者可以讓資料寫入一個檔案中,為之後的使用做準備。jMeter中的每個監聽者都有一個欄位去表示這個監聽者指定寫入資料的檔案。通過配置按鈕去選擇哪個欄位用來儲存,是否適應CSV或XML格式。

    注意:所有的監聽者都儲存相同的資料,不同的是它們呈現資料的方式不同。

    監聽者可以在測試的任何位置去加入,直接在測試計劃中去加入監聽也可以。它們只會從同級或下級的元素中收集資料。

jMeter中有很多監聽者,可參考官方文件

3.4 定時器

    預設情況下,一個jMeter執行緒會不停歇的執行在佇列中的例項。所以,推薦線上程組中增加一個定時器去明確的延時。如果你不加延時,jMeter會將你的伺服器淹沒的 - . -|||,因為它會在很短時間向伺服器做許多請求。

    一個定時器會讓在每個例項在它自己的作用域中延遲一定的時間。

    如果你選擇線上程組中增加一個或多個定時器,jMeter將會計算每個定時器設定的時間之和,並在執行每個例項前等待這段時間。定時器可以增加在例項和控制器的下一個層級中,去限制這些例項。

    為了在一個測試計劃中的一個位置去暫停,你可以使用Test Action例項。

3.5 斷言

    斷言允許你斷定測試過程中從伺服器返回的響應。使用一個斷言,你可以簡單判斷你的應用程式是否返回了你期望的結果。

    例如,你可以判斷一個查詢的響應是否包含某些特殊的字串。你可以寫一個Perl-style的正則表示式,並且用它去判斷響應中是否包含或匹配含這個正則表示式所表達的文字內容。

    你可以增加一個斷言到任何例項中。例如,你可以增加一個斷言到http請求中,去檢查文字</html>標籤.然後,jMeter將會去檢查響應中是否有這個文字內容,如果沒有,jMeter將會把這個請求標記為失敗請求。

    注意:斷言是應用在所有例項的各自作用域中的。為了限制單個的例項,可以增加斷言為例項的一個孩子。

    為了觀察斷言的結果,增加一個斷言監聽器到一個執行緒組中。失敗的斷言將會出現在在Tree View和Table listener中,並且在總的報告中顯示百分比。

3.6 配置元素

    配置元素和例項之間聯絡很大。雖然它不會發送請求(除了,http/https test recorder),它可以增加請求次數或修改請求。

    一個配置元素是隻能寫在測試樹的一個分支裡面。例如,下圖中

    配置元素HTTP cookie manager只能作用於web page1 和 web page2 ,不能作用於web page3 , 即它的同級,下一級和同級的下一級。

    位於分支中的配置元素優先順序高於位於它的父級配置元素。例如我們定義了兩個HTTP請求預設元素,web default 1和web default 2 。因為我們將web  default 1放在了一個 Loop Controller中,所以web defaults 1裡對web page2的配置高於web defaults 2.

    注意:使用者定義變數配置元素是不一樣的。不管它放置在哪個位置,都會被優先處理。建議這種元素最好放線上程組的開頭。

3.7 預處理元素

它是在例項請求發生之前執行的一些動作。例如說,一個預處理元素加在一個例項元素上,那麼在這個例項執行之前會先執行這個預處理程式。預處理元素通常用於改變例項執行的一些設定或者更新一些變數(不是從響應中抽出來的)。詳情可參考作用域

3.8 後處理元素

參考預處理元素,不過它是在例項元素執行之後執行。它多用於處理響應資料。

3.9 執行順序

    請注意,定時器,斷言,預處理和後處理器的執行必須要應用在一個例項中。控制器和例項的執行順序是按照他們出現在測試樹中的順序執行的。其它的一些測試元素的處理順序是根據他們在它們各自的作用域以及測試元素的型別(相同型別下,處理順序按照它們在樹中出現的順序處理)。

例如:

3.10 作用域規則

    jMeter測試樹包含的元素既是分層次的又是有順序的。在測試樹中的一些元素是非常嚴格分層的(監聽物件,配置元素,後處理元素,預處理元素,斷言,定時器),一些元素也是按照基本順序來執行的(控制器和例項)。當你建立一個測試計劃時,你將通過建立一些例項來建立一個有序的例項請求列表,來呈現一個執行步驟的集合。這些請求通常都是用控制器來組織的,並且這些請求也是有順序的。如下是兩個例子:

    配置元素:header manager,cookie manager 和 authorization manager  不同於 預設的配置元素(configuration default elements) 。一般的預設配置元素會和例項的值的集合合併。然而,上述三類管理配置元素不會合並。如果一個例項的作用域內有多個這種管理配置元素,那麼只會有一個管理元素會被使用,但是當前是沒辦法知道使用的是哪一個。

3.11 屬性和變數

    jMeter的屬性在jMeter.properties中定義。這些屬性是全域性有效的,通常情況下,我們只會定義一些預設的屬性來用。例如,屬性remote_hosts定義了jmeter將要遠端執行的伺服器是哪一個。屬性可以在測試計劃中指定,但是不能在特殊執行緒值中使用,參考functions-read a property。

    jMeter的變數對每一個執行緒都是區域性有效。這個變數值可能可能一樣也可能不同。如果一個變數值由一個執行緒來更新,那麼只有這個變數的thread copy改變。例如說後處理程式將會根據例項執行緒讀取到的變數來設定正則表示式提取器的變數值,再應用到隨後的相同執行緒裡。更多詳細的請參考原文。

    注意,測試計劃和使用者定義變數(UDV)配置元素定義的值在整個測試計劃開始時是有效的。如果相同的變數由多個UDV元素定義,那麼只有最後一個有效。一旦一個執行緒開始,每個執行緒的相關變數將會初始化。其他元素例如User Parameters Pre-Processor 或者 Regular Expression Extractor Post-Processor可能被用來重定義這個相同的變數,或者建立一個新的變數。這些重定義的變數只對當前的執行緒有效。

    setProperty函式被用來定義一個jMeter的屬性。這些屬性是對測試計劃全域性有效的,所以在必要時 能夠用來線上程之間傳遞資訊。

    變數和屬性都是大小寫敏感的。

3.12 使用變數引數化測試

    使用變數當引數。當你決定怎樣構建測試計劃時,可以寫下什麼是執行緒執行不變數,什麼是執行緒執行之間要變化的。變數名的命名約定,比如用C_或K_作為字首,或者用大寫來區分變數和測試期間需要改變的變數。 還要考慮哪些變數是對執行緒區域性有效的 - 例如計數器或使用正則表示式後處理器提取的值。 

例如:

關於servlet的文章: http://blog.csdn.net/honghailiang888/article/details/50585475

原文:http://jmeter.apache.org/usermanual/test_plan.html