1、HTTP Cookie管理器介紹
在介面測試中,某些介面的呼叫,需要帶入已有Cookie,比如有些介面需要登陸後才能訪問。
JMeter介面請求中使用Cookie有如下兩種方式:
- 直接在HTTP資訊頭管理器元件中新增Cookie頭域資訊,適用於已經知道請求所用Cookie資料的情況。
- 使用JMeter的Cookie管理機制,既可以手動新增,同時JMeter也會將操作流程中獲取的引數自動儲存,因此可以通過呼叫前置介面來完成Cookie獲取。
官方提示:
If there is more than one Cookie Manager in the scope of a Sampler,
there is currently no way tospecify which one is to be used.
Also. a cookie stored in one cookie manager is not available to
any other manager so use multiple Cookie Managers with care.
如果一個取樣器範圍內不止一個Cookie管理器,則當前無法指定要使用哪個Cookie管理器。 另外儲存在一個Cookie管理器中的Cookie資訊,與其他任何Cookie管理器之間均不能相互引用,因此請謹慎使用多個Cookie管理器。
2、HTTP Cookie管理器介面詳解
新增HTTP Cookie管理器元件的操作:選中“執行緒組”右鍵 —> 新增 —> 配置元件 —> HTTP Cookie管理器
。
HTTP Cookie管理器介面如下:
介面詳細說明:
- 名稱:HTTP Cookie管理器自定義名稱,見名知意最好。
- 註釋:即新增一些備註資訊,對該HTTP Cookie管理器的簡短說明,以便後期回顧時檢視。
(1)Options選項:
Clear cookies each iteration
:如果勾選Clear cookies each iteration?
(每次反覆清除Cookies?)此項,意味著執行緒在每次請求結束後,都會將本次請求產生的Cookie進行清除,下次請求時重新獲取。Cookie Policy
:選擇Cookie的管理策略。建議選擇Standard
或Standard strict
。這兩種策略相容性設計要求是適應儘可能多的不同的伺服器,也就是相容性更好。
(2)儲存在Cookie管理器中的Cookie(User-Defined Cookies) :
Name
:Cookies包含對值的name。Value
:Cookies包含對值的value。Domain
:接收HTTP請求的伺服器的域名。Path
:路徑,地址URI,就相當於定義哪個路徑下,以及子路徑可以使用這個Cookie。Secure
:安全性,預設不勾選為false。Add
:新增一條Cookie。Delete
:刪除選中的Cookie。Load
:從本地目錄載入已有的Cookie。Save
:手動新增的Cookie儲存到本地目錄。
3、JMeter中對Cookie的管理
在使用Cookie管理器時,沒有選擇對應的策略 會導致Cookie傳遞不了
HTTP Cookie管理器的作用:用於管理測試計劃執行時的所有的Cookie。
(1)Cookie的儲存
JMeter中對Cookie的管理,可以自動儲存是,也可以手動儲存。
1)自動儲存:
- Cookie管理器會自動記錄每一個請求所產生的Cookie,在後邊對同源站點進行的請求中,都可以使用對應的Cookie進行傳送,每個Cookie都有自己的儲存區域。每一個cookie是完全獨立的,即當遇到非同源站點時請求所帶的cookie將不一樣。
- Cookie管理器的行為與瀏覽器中儲存和傳送Cookie的行為是一致的。
- 注意:JMeter中這種自動收集的Cookie不會在Cookie管理器中進行展示,但是執行後通過檢視結果樹可以檢視到Cookie資訊,接受到的Cookie會被自動儲存線上程變數中,在2.3.2版本之後不再儲存,如果你想要Cookie管理器自動儲存收集到 的cookie,你需要修改
JMeter.property
檔案。
儲存Cookie資料到執行緒變數中:
修改jmeter/bin/jmeter.properties
檔案。
CookieManager.save.cookies=true # 取消註釋,false修改成true
預設執行緒中變數名為COOKIE_ + Cookie名
。
JMeter.property
檔案中的CookieManager.name.prefix=
屬性,能夠用來修改預設的COOKIE_
開頭。
提示:預設情況下,空值的Cookie會被忽略。可以通過設定 JMeter 屬性來更改此設定
CookieManager.delete_null_cookies = false
。
2)手動儲存:
手動新增的Cookie具有全域性性,會在傳送請求時自動附加到所有的請求中,即被所有的請求所共享。
手動新增Cookie的方式有兩種:
- 在Cookie管理器元件介面中一個一個的新增;
- 直接利用瀏覽器的外掛(如火狐的
firebug
)匯出。然後通過load
按鈕將Cookie進行匯入。使用Firefox的firebug
外掛匯出的Cookie資訊,和JMeter中配置的Cookie樣式幾乎同樣。
提示:自定義 Cookie 的過期時間會很長。
手動儲存Cookies示例:
比較簡單的做法是使用Firefox
的firebug
外掛匯出Cookies資訊。
如下圖所示:
然後,在把Cookies資料檔案匯入到JMeter的HTTP Cookie管理器元件中。
如下圖所示:
(2)Cookie的管理策略
Standard
策略:預設使用,選擇Standard
或Standard strict
。這種策略相容性設計要求是適應儘可能多的不同的伺服器,也就是相容性更好。RFC2109
策略:RFC2109
是W3C組織第一次推出的官方Cookies標準。理論上,所有使用版本1-Cookies
的服務端都應該使用此標準。HttpClient已經將此標準設定為預設。遺憾的是,許多服務端不正確的實現了標準或者仍然使用Netscape
標準。所有有時感到此標準太多於嚴格。
RFC2109
是HttpClient使用的預設Cookies協議。
總結:RFC2109
為官方HTTP狀態管理規範,並被RFC 2965
取代的老版本,即過時的嚴格策略。RFC2965
策略:RFC2965
定義了版本2並且嘗試去彌補在版本1中Cookie的RFC2109
標準的缺點。RFC2965
是,並規定RFC2965
最終取代RFC2109
。
總結:RFC2965
為官方HTTP狀態管理規範。Netscape
策略:Netscape
是最原始的Cookies規範,同時也是RFC2109
的基礎。儘管如此,還是在很多重要的方面與RFC2109
不同,可能需要特定伺服器才可以相容。Browser Compatibility
策略:這種相容性設計要求是適應儘可能多的不同的伺服器,儘管不是完全按照標準來實現的。如果你遇到了解析Cookie的問題,你就可能要用到這一個規範。
有太多的web站點是用CGI指令碼去實現的,而導致只有將所有的Cookies都放入Request header
才可以正常的工作。這種情況下最好設定http.protocol.single-cookie-header
引數為true。
總結:這是一個瀏覽器相容性的策略。Ignore Cookies
策略:此規格忽略所有Cookie 。被用來防止HttpClient接受和傳送的Cookie。best-match
策略:最佳匹配Meta(元)策略。Meta(元)Cookie規範採用了一些基於又HTTP響應傳送的Cookie格式的Cookie策略。它基本上聚合了以上所有的實現到以一個類中。
概括總結:
Cookie Policy
:Cookie策略,從JMeter3.0開始預設是Standard
,具體是跟伺服器端的實現方式有關的,各公司可能不一樣,我試用了其它的幾個選項都獲取不到Cookie,只有Netscape
策略才能獲取到。所以當你獲取Cookie有問題時,也可以檢查一下這個選項。- 儲存在Cookie管理器中的Cookie:在這裡可以新增使用者自定義的Cookie,並且會被作用域內的所有執行緒共享。
4、補充:Cookie的屬性介紹
Cookie的主要屬性如下:
name
:唯一的Cookie名稱。通常來講Cookie的名稱是不區分大小寫的。value
:Cookie變數的值,最好為Cookie的name
和value
屬性進行URL編碼。Domain
:Domain
屬性指定瀏覽器發出 HTTP 請求時,哪些域名要附帶這個 Cookie,也就是Cookie的有效區域,該區域傳送的請求中都會包含這個Cookie資訊。
如果沒有指定該屬性,瀏覽器會預設將其設為當前 URL 的一級域名,比如www.example.com
會設為example.com
,而且以後如果訪問example.com
的任何子域名,HTTP 請求也會帶上這個 Cookie。如果伺服器在Set-Cookie
欄位指定的域名,不屬於當前域名,瀏覽器會拒絕這個 Cookie。Path
:Path
屬性指定瀏覽器發出 HTTP 請求時,哪些路徑要附帶這個 Cookie。只要瀏覽器發現,Path
屬性是 HTTP 請求路徑的開頭一部分,就會在頭資訊裡面帶上這個 Cookie。比如,PATH
屬性是/
,那麼請求/docs
路徑也會包含該 Cookie。當然,前提是域名必須一致。Expires
:Expires
屬性指定一個Cookie具體的到期時間,到了指定時間以後,瀏覽器就不再保留這個 Cookie。它的值是UTC
格式,可以使用Date.prototype.toUTCString()
進行格式轉換。
如果不設定該屬性,或者設為null
,Cookie 只在當前會話(Session)有效,瀏覽器視窗一旦關閉,當前 Session 結束,該 Cookie 就會被刪除。
另外,瀏覽器根據本地時間,決定 Cookie 是否過期,由於本地時間是不精確的,所以沒有辦法保證 Cookie 一定會在伺服器指定的時間過期(會存在偏差)。Max-Age
:Max-Age
屬性指定從現在開始 Cookie 存在的秒數,比如60 * 60 * 24 * 365
(即一年)。過了這個時間以後,瀏覽器就不再保留這個 Cookie。
如果同時指定了Expires
和Max-Age
,那麼Max-Age
的值將優先生效。
如果Set-Cookie
欄位沒有指定Expires
或Max-Age
屬性,那麼這個 Cookie 就是 Session Cookie,即它只在本次對話存在,一旦使用者關閉瀏覽器,瀏覽器就不會再保留這個 Cookie。secure
:安全標識。它是一個布林值,指定在網路上如何傳輸Cookie。
Cookie預設是不安全的,是通過一個普通的HTTP連線傳輸。
指定secure
標識為True後,只有在使用SSL連結時候才能傳送到伺服器,如果是HTTP連結則不會傳遞該資訊。就算設定了secure
屬性也並不代表他人不能看到你機器本地儲存的 Cookie 資訊,所以不要把重要資訊存放入Cookie 中就對了。HttpOnly
:告知瀏覽器不允許通過指令碼document.cookie
去更改這個值,同樣這個值在document.cookie
中也不可見。但在HTTP請求中仍然會攜帶這個cookie。注意這個值雖然在指令碼中不可獲取,但仍然在瀏覽器安裝目錄中以檔案形式存在。(這項設定通常在伺服器端設定)
提示:其中
name
和value
屬性是必選項,其它屬性都是可選項。
參考: