前2個月使用LoadRunner對公司的一個項目新開發的功能進行了壓力測試,因為之后要使用Jmeter在其他項目中進行壓測,最近又有點空余的時間^_^,
就拿之前做過的項目玩一下,並將遇到的問題記錄下來。
jmeter需要登陸的請求如何保持登陸:
1.同一線程組下請求,解決方法:添加登錄請求、HTTP Cookie 管理器即可,可自動獲取登錄(缺點:只能使同一線程組下請求保持登錄,不可跨線程組)
還有一種:添加正則表達式,將cookie值傳遞給HTTP信息頭管理器(只能同一線程組下引用)
2.解決跨線程組登錄並自動獲取sessionid的問題:需要設置jmeter全局變量並調用。使用正則表達式獲取sessionid,BeanShell PostProcessor設置全局變量,HTTP信息頭管理器引用全局變量(跨線程組傳遞cookies值)
因為我們不對登錄接口進行壓測,所以需要采取跨線程組的辦法:
一、添加初始化線程組獲取SESSION並設為變量
1)setup thread group ,一種特殊類型的ThreadGroup的,可用於執行預測試操作。
這里設置初始化線程組的原因是:因為我們對壓測接口的前提是要先從登陸接口獲取SESSION的值,
所以添加一個setup Thread Group,用作於初始化的操作
2)添加HTTP請求
填寫登陸接口的請求地址和報文
3)添加正則表達式
登錄成功后,那么我們需要獲取服務端返回的Cookie值,這里我們使用了后置處理器下面的Regular Expression Extrator組件來處理。
引用名稱:其他地方引用時的變量名稱,名稱只能是一個,引用方法:${cookie}
正則表達式:數據提取器,一般簡單的通用語法就是:左邊界(.*?)右邊界,左右邊界就是為了能准確定位到想匹配的內容,如最上面圖的"Set-Cookie: SESSION=(.*?);, 其中Set-Cookie: SESSION=和;就是左右邊界,(.*?) 是替換了想要提取的內容,里面的'?'為非貪婪匹配,(非貪婪模式就是說在遇到第一個右邊界后就停止匹配,這樣就可以精確拿到想要的內容)。建議均使用非貪婪匹配,除非特殊情況。
模板:對應正則表達式提取器類型,樣式為:$n$。若模板為:$0$,則為整個表達式匹配到的內容,就是包括小括號內跟小括號外的內容;若模板為:$1$,則對應正則表達式中的第一個(.*?)所匹配的內容;若模板為:$2$,則對應正則表達式中的第二個(.*?)所匹配的內容
匹配數字:正則表達式匹配數據的最終結果可以看做一個數組,匹配數字即可看做是數組的第幾個元素。當為 0 時,隨機返回匹配的數據。當為 1 時,表示返回匹配結果數組的第一個元素。當為負數(-1,-2,-100都可以)時,表示返回全部元素,並且同時會返回一個元素總數的變量token_matchNr,在引用時:通過${token_1}的方式來取第1個匹配的內容,${token_2}來取第2個匹配的內容。
缺省值:匹配失敗時的默認值。通常用於后續的邏輯判斷,建議使用一些特殊含義的,比如0,NULL,ERROR等。
如圖設置引用名稱:cookie、正則表達式:Set-Cookie: SESSION=(.*?);、模板:$1$、匹配數字:1
提取如下Response Headers里的SESSION:
4)添加BeanShell PostProcessor
BeanShell PostProcessor設置全局變量,${__setProperty(newcookie,${oldcookie},)}; 設置全局變量newcookie
如圖${__setProperty(releasecookie,${cookie},)}; 設置全局變量releasecookie
二、添加正常線程組並引用全局變量
1)添加HTTP Cookie 管理器
HTTP信息頭管理器引用全局變量,${__P(newcookie,)}引用全局變量newcookie
如圖使用${__P(releasecookie,)}引用全局變量releasecookie
2)添加需要壓測的HTTP請求
3)添加監聽器-查看結果數、響應時間和TPS