JMeter-如何使用Jmeter方便的管理Cookies?

1、使用Jmeter cookie的業務背景

業務背景:

咱們在工做中常常會遇到以下壓測場景:java

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

這種場景很熟悉吧?不少業務操做是要依賴登陸的,可是一個用戶在每次進行登陸時一般會生成cookie,並且在接下來的操做中都必須攜帶上它的cookie,服務器對後續的每次請求都會進行校驗。正則表達式

首先想到的是從登陸響應中用正則表達式提取出cookies,而後在其它操做中調用不就好了嗎?shell

不行!apache

由於cookies並非在登陸的響應結果中生成的,而是在response header中攜帶的,因此不能用正則表達式提取。跨域

那用什麼來獲取呢?咱們先來看一下jmeter官方文檔中怎麼說的吧:瀏覽器

2、解讀Jmeter官方文檔

Jmeter官方文檔是這樣寫的:服務器

70

下面我簡單翻譯一下:cookie

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

首先,它可以像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。

有沒有以爲很難理解呢?

 不要緊,下面咱們來總結一下:

Cookie Manager主要有兩大做用:

一、自動管理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_的值。

二、手動管理Cookie:

手動添加Cookie到Cookie Manager,這些Cookie的值會被全部線程共享。 

比較簡單的作法是使用firefox的firebug導出cookies ,而後再導入到jmeter的cookie manager中,固然,這裏也能夠經過Add按鈕手動添加cookies。
70

Tips:

一、須要注意的是域、路徑必須填上,尤爲是域;由於Jmeter現版本默認不支持跨域的請求,不填的話設置的Cookie不會被帶上。

二、在須要取Cookie的線程裏添加一個Http Cookie管理器,能夠默認爲空,可是必定要添加,不然是不會存儲cookie變量的

三、這樣在同一個線程(組)內其它操做組件都是能夠直接經過${COOKIE_xxxx}來獲取

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

五、想要跨域存儲cookies,須要設置 CookieManager.check.cookies =false

3、線程組內部傳遞cookies

瞭解了cookie manager,如今咱們回到業務場景中來:

如何實現對查詢接口(必須先登陸,攜帶cookie)進行壓測?

70

這是一個很簡單的場景,可是若是直接按照上面這樣的方式去執行,你會發現結果會報錯,由於jmeter默認不會保存cookies,須要加上cookie manager,以下所示:

70

如上,加一個空的cookie manager便可以自動保存cookie,而且可以在同一個線程組之間傳遞cookie,此時再次運行腳本就經過了。

可是咱們並不須要同時對登陸操做進行壓測,也就是說,我只須要用一個用戶登陸一次,而後循環進行其它業務操做,這時候須要把登陸和查詢操做分別放在兩個線程組中,可是jmeter官方文檔中說cookies不能跨域傳遞的,也就是不能在線程組中共享,那要怎麼實現呢?

4、跨線程組傳遞cookies

官方文檔中說cookie變量是線程內有效,線程外無效,可是實際測試同一個線程組的其它線程是能夠直接訪問的。

若是是跨線程組的狀況,不能直接訪問,能夠用其它的方式來進行cookie變量的共享,試驗了幾種方式,下面這種方式最簡單:

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

一、在生成cookie的請求中添加beanshell postprocessor後置處理器,並添加以下腳本,把cookie保存在Jmeter屬性參數中:

import org.apache.jmeter.util.JMeterUtils; 
JMeterUtils.setProperty(「cookie_name」, 「cookie_value」); 

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

二、在須要使用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。

相關文章
相關標籤/搜索