您好,登錄后才能下訂單哦!
今日文章主要內容介紹
一、使用Jmeter cookie的業務背景
二、解讀Jmeter官方文檔中的cookie管理器
三、線程組內部傳遞cookies
四、跨線程組傳遞cookies
jmeter視頻:https://edu.51cto.com/course/14305.html
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。
有沒有覺得很難理解呢?
沒關系,下面我們來總結一下:
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。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。