『動善時』JMeter基礎 — 20、JMeter配置元件【HTTP Cookie管理器】詳細介紹

繁華似錦Fighting發表於2021-05-25

1、HTTP Cookie管理器介紹

在介面測試中,某些介面的呼叫,需要帶入已有Cookie,比如有些介面需要登陸後才能訪問。

JMeter介面請求中使用Cookie有如下兩種方式:

  1. 直接在HTTP資訊頭管理器元件中新增Cookie頭域資訊,適用於已經知道請求所用Cookie資料的情況。
  2. 使用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管理器介面如下:

image

介面詳細說明

  • 名稱:HTTP Cookie管理器自定義名稱,見名知意最好。
  • 註釋:即新增一些備註資訊,對該HTTP Cookie管理器的簡短說明,以便後期回顧時檢視。

(1)Options選項

  1. Clear cookies each iteration:如果勾選Clear cookies each iteration?(每次反覆清除Cookies?)此項,意味著執行緒在每次請求結束後,都會將本次請求產生的Cookie進行清除,下次請求時重新獲取。
  2. Cookie Policy:選擇Cookie的管理策略。建議選擇StandardStandard strict。這兩種策略相容性設計要求是適應儘可能多的不同的伺服器,也就是相容性更好。

(2)儲存在Cookie管理器中的Cookie(User-Defined Cookies) :

  1. Name:Cookies包含對值的name。
  2. Value:Cookies包含對值的value。
  3. Domain:接收HTTP請求的伺服器的域名。
  4. Path:路徑,地址URI,就相當於定義哪個路徑下,以及子路徑可以使用這個Cookie。
  5. Secure:安全性,預設不勾選為false。
  6. Add:新增一條Cookie。
  7. Delete:刪除選中的Cookie。
  8. Load:從本地目錄載入已有的Cookie。
  9. 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的方式有兩種:

  1. 在Cookie管理器元件介面中一個一個的新增;
  2. 直接利用瀏覽器的外掛(如火狐的firebug)匯出。然後通過load按鈕將Cookie進行匯入。使用Firefox的firebug外掛匯出的Cookie資訊,和JMeter中配置的Cookie樣式幾乎同樣。

提示:自定義 Cookie 的過期時間會很長。

手動儲存Cookies示例

比較簡單的做法是使用Firefoxfirebug外掛匯出Cookies資訊。

如下圖所示:

image

然後,在把Cookies資料檔案匯入到JMeter的HTTP Cookie管理器元件中。

如下圖所示:

image

(2)Cookie的管理策略

  1. Standard策略:預設使用,選擇StandardStandard strict。這種策略相容性設計要求是適應儘可能多的不同的伺服器,也就是相容性更好。
  2. RFC2109策略:RFC2109是W3C組織第一次推出的官方Cookies標準。理論上,所有使用版本1-Cookies的服務端都應該使用此標準。HttpClient已經將此標準設定為預設。遺憾的是,許多服務端不正確的實現了標準或者仍然使用Netscape標準。所有有時感到此標準太多於嚴格。
    RFC2109是HttpClient使用的預設Cookies協議。
    總結:RFC2109為官方HTTP狀態管理規範,並被RFC 2965取代的老版本,即過時的嚴格策略。
  3. RFC2965策略:RFC2965定義了版本2並且嘗試去彌補在版本1中Cookie的RFC2109標準的缺點。RFC2965是,並規定RFC2965最終取代RFC2109
    總結:RFC2965為官方HTTP狀態管理規範。
  4. Netscape策略:Netscape是最原始的Cookies規範,同時也是RFC2109的基礎。儘管如此,還是在很多重要的方面與RFC2109不同,可能需要特定伺服器才可以相容。
  5. Browser Compatibility策略:這種相容性設計要求是適應儘可能多的不同的伺服器,儘管不是完全按照標準來實現的。如果你遇到了解析Cookie的問題,你就可能要用到這一個規範。
    有太多的web站點是用CGI指令碼去實現的,而導致只有將所有的Cookies都放入Request header才可以正常的工作。這種情況下最好設定http.protocol.single-cookie-header引數為true。
    總結:這是一個瀏覽器相容性的策略。
  6. Ignore Cookies策略:此規格忽略所有Cookie 。被用來防止HttpClient接受和傳送的Cookie。
  7. 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的namevalue屬性進行URL編碼。
  • DomainDomain屬性指定瀏覽器發出 HTTP 請求時,哪些域名要附帶這個 Cookie,也就是Cookie的有效區域,該區域傳送的請求中都會包含這個Cookie資訊。
    如果沒有指定該屬性,瀏覽器會預設將其設為當前 URL 的一級域名,比如www.example.com會設為example.com,而且以後如果訪問example.com的任何子域名,HTTP 請求也會帶上這個 Cookie。如果伺服器在Set-Cookie欄位指定的域名,不屬於當前域名,瀏覽器會拒絕這個 Cookie。
  • PathPath屬性指定瀏覽器發出 HTTP 請求時,哪些路徑要附帶這個 Cookie。只要瀏覽器發現,Path屬性是 HTTP 請求路徑的開頭一部分,就會在頭資訊裡面帶上這個 Cookie。比如,PATH屬性是/,那麼請求/docs路徑也會包含該 Cookie。當然,前提是域名必須一致。
  • ExpiresExpires屬性指定一個Cookie具體的到期時間,到了指定時間以後,瀏覽器就不再保留這個 Cookie。它的值是 UTC 格式,可以使用Date.prototype.toUTCString()進行格式轉換。
    如果不設定該屬性,或者設為null,Cookie 只在當前會話(Session)有效,瀏覽器視窗一旦關閉,當前 Session 結束,該 Cookie 就會被刪除。
    另外,瀏覽器根據本地時間,決定 Cookie 是否過期,由於本地時間是不精確的,所以沒有辦法保證 Cookie 一定會在伺服器指定的時間過期(會存在偏差)。
  • Max-AgeMax-Age屬性指定從現在開始 Cookie 存在的秒數,比如60 * 60 * 24 * 365(即一年)。過了這個時間以後,瀏覽器就不再保留這個 Cookie。
    如果同時指定了ExpiresMax-Age,那麼Max-Age的值將優先生效。
    如果Set-Cookie欄位沒有指定ExpiresMax-Age屬性,那麼這個 Cookie 就是 Session Cookie,即它只在本次對話存在,一旦使用者關閉瀏覽器,瀏覽器就不會再保留這個 Cookie。
  • secure:安全標識。它是一個布林值,指定在網路上如何傳輸Cookie。
    Cookie預設是不安全的,是通過一個普通的HTTP連線傳輸。
    指定secure標識為True後,只有在使用SSL連結時候才能傳送到伺服器,如果是HTTP連結則不會傳遞該資訊。就算設定了secure 屬性也並不代表他人不能看到你機器本地儲存的 Cookie 資訊,所以不要把重要資訊存放入Cookie 中就對了。
  • HttpOnly:告知瀏覽器不允許通過指令碼document.cookie去更改這個值,同樣這個值在document.cookie中也不可見。但在HTTP請求中仍然會攜帶這個cookie。注意這個值雖然在指令碼中不可獲取,但仍然在瀏覽器安裝目錄中以檔案形式存在。(這項設定通常在伺服器端設定)

提示:其中namevalue屬性是必選項,其它屬性都是可選項。

參考:

相關文章