jmeter學習指南之管理Cookies

testingbang發表於2019-08-19

今日文章主要內容介紹

一、使用Jmeter cookie的業務背景

二、解讀Jmeter官方文件中的cookie管理器

三、執行緒組內部傳遞 cookies

四、跨執行緒組傳遞cookies


1 使用Jmeter cookie的業務背景

一、業務背景:

我們在工作中經常會遇到如下壓測場景:

登入後對查詢、充值、購買...等業務進行壓測;

這種場景很熟悉吧?很多業務操作是要依賴登入的,但是一個使用者在每次進行登入時通常會生成cookie,而且在接下來的操作中都必須攜帶上它的cookie,伺服器對後續的每次請求都會進行校驗。

首先想到的是從登入響應中用正規表示式提取出cookies,然後在其它操作中呼叫不就行了嗎?

不行!

因為cookies並不是在登入的響應結果中生成的,而是在response header中攜帶的,所以不能用正規表示式提取。

那用什麼來獲取呢?我們先來看一下jmeter官方文件中怎麼說的吧:


2 解讀Jmeter官方文件

Jmeter官方文件是這樣寫的:

下面我簡單翻譯一下:

cookie管理器元件有兩大功能:

  • 首先,它能夠像web瀏覽器一樣儲存和傳送cookies。

  • 如果你有一個HTTP請求和響應包含一個cookie,cookie管理器會自動儲存該cookie,並能夠在該特定網站上接下來的所有請求中使用該 cookie。

  • JMeter的每個執行緒都有自己的“cookie儲存區”。所以,如果你正在測試一個使用cookie來儲存會話資訊的網站,那麼每個JMeter執行緒都有自己的會話。請注意,這種cookies不會在cookie管理器中展示出來,但可以在“檢視結果樹”中看到它們。

  • JMeter會檢查收到的cookies是否對URL有效。 這意味著跨域的cookie不能被儲存 。如果你有竊聽行為,或者想要 儲存跨域cookies ,需要在jmeter.poperties中設定:“ CookieManager.check.cookies = false”。

  • 接收到的Cookies可以儲存為JMeter的執行緒變數。如果要把 cookies儲存為變數,需要設定:

 “ CookieManager.save.cookies =true”。

  • 此外,預設情況下jmeter中的cookies在儲存時名字字首為“ COOKIE_ ”,這是為了避免因區域性變數重名引起的異常情況。如果不想用這個字首,需要定義屬性“CookieManager.name.prefix = ”(一個或多個空格)。如果使用了字首,則一個名稱為TEST的cookie的值可以透過$ {COOKIE_TEST}獲取 。

  • 其次,你可以手動新增一個cookie到cookie管理器。但是,如果你這樣做,這個cookie將被所有JMeter的執行緒共享。 注意,這樣的cookies建立後生命週期會很長。

  • 空值的cookies預設被忽略掉。這可以透過設定JMeter的屬性進行更改:CookieManager.delete_null_cookies =false。請注意,這也適用手工定義的cookies-任何此類cookies在更新後會從cookie manager中移除。

  • 還需要注意的是cookie名稱必須是唯一的-如果一個cookie的名稱與已有cookie同名,它將取代原有的cookie。

  • 如果在一個sampler作用域中有多個cookie manager,目前沒有辦法去指定使用某一個。並且,一個cookie manager中儲存的cookie不能被其它的cookie manager使用,所以要慎用多個cookie manger。

有沒有覺得很難理解呢?

好訊息!諮詢QQ:2083503238,諮詢微信:qiangfans

小強效能測試班3月3號開課,錯過要再等一年, 課程大綱與介紹點選文末【閱讀原文】

所有學員享受免費、不限次數、無限重學的權利直到學會為止,拒絕限制次數、繳納重學費的噁心規矩。

公眾號內回覆6獲取詳情(不是本文回覆)

 沒關係, 下面我們來總結一下:

Cookie Manager主要有兩大作用:

1、自動管理cookie:

  • 就像瀏覽器一樣能夠自動儲存和傳送Cookie,如果一個http請求的響應中包含Cookie,那麼Cookie Manager就會自動地儲存這些Cookie並在所有後來傳送到該站點的請求中使用這些Cookie的值。每個執行緒都自己儲存cookie的區域。

  • 在cookie manager中看不到自動儲存的cookie,我們 可以在察看結果樹View Results Tree中看到被髮送請求的Cookie Data

  • 要把Cookies儲存到執行緒變數中,要定義屬性"CookieManager.save.cookies=true"。執行緒變數名為COOKIE_ + Cookie名。屬性CookieManager.name.prefix= 可以用來修改預設的COOKIE_的值。


2、手動管理Cookie:

  • 手動新增Cookie到Cookie Manager,這些Cookie的值會被所有執行緒共享。 

  • 比較簡單的做法是使用firefox的firebug匯出cookies ,然後再匯入到jmeter的cookie manager中,當然,這裡也可以透過Add按鈕手動新增cookies。

Tips:

1、需要注意的是 域、路徑必須填上,尤其是域 ;因為Jmeter現版本預設不支援跨域的請求,不填的話設定的Cookie不會被帶上。

2、在需要取Cookie的執行緒裡新增一個Http Cookie管理器, 可以預設為空,但是一定要新增,否則是不會儲存cookie變數的

3、這樣在同一個執行緒(組)內其它操作元件都是可以直接透過${COOKIE_xxxx}來獲取

4、目前jmeter在一個sampler中不能同時有多個cookie manager

5、想要跨域儲存cookies,需要設定 CookieManager.check.cookies =false


3 執行緒組內部傳遞 cookies

瞭解了cookie manager,現在我們回到業務場景中來:

如何實現對查詢介面(必須先登入,攜帶cookie)進行壓測?

這是一個很簡單的場景,但是如果直接按照上面這樣的方式去執行,你會發現結果會報錯,因為jmeter預設不會儲存cookies,需要加上cookie manager,如下所示:


如上, 加一個空的cookie manager即可以自動儲存cookie,並且能夠在同一個執行緒組之間傳遞cookie ,此時再次執行指令碼就透過了。


但是我們並不需要同時對登入操作進行壓測,也就是說,我只需要用一個使用者登入一次,然後迴圈進行其它業務操作,這時候需要把登入和查詢操作分別放在兩個執行緒組中,但是jmeter官方文件中說cookies不能跨域傳遞的,也就是不能線上程組中 共享,那要怎麼實現呢?


 4  跨執行緒組傳遞 cookies

官方文件中說cookie變數是執行緒內有效,執行緒外無效,但是實際測試 同一個執行緒組的其它執行緒是可以直接訪問的

如果是跨執行緒組的情況,不能直接訪問,可以用其它的方式來進行cookie變數的共享,試驗了幾種方式,下面這種方式最簡單:

透過JMeterUtils.setProperty和JMeterUtils.getPropDefault方法實現

1、 在生成cookie的請求中新增beanshell postprocessor 後置處理器 ,並新增如下指令碼,把cookie儲存在Jmeter屬性引數中:

import org.apache.jmeter.util.JMeterUtils; 
JMeterUtils.setProperty(“cookie_name”, “cookie_value”); 

其中cookie_name和cookie_value分別換成你對應的cookie名稱(不帶COOKIE_字首)和cookie值


2、在需要使用cookie的另一個執行緒組的請求中新增beanshell preprocessor前置處理器 ,並新增如下指令碼,取出cookie的值,並存入執行緒變數中:
import org.apache.jmeter.util.JMeterUtils; 
String value = JMeterUtils.getPropDefault(“cookie_name”);

Vars.put(“cookie_name”,value);

這裡的cookie_name和前面設定的名稱一樣。

然後在該執行緒組中就可以使用${cookie_name}來獲取cookie的值,也就是實現了跨執行緒組傳遞cookie。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942496/viewspace-2654075/,如需轉載,請註明出處,否則將追究法律責任。

相關文章