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
屬性是必選項,其它屬性都是可選項。
參考: