1.4腳本增強技術之參數化
參數化是為了實作不同使用者的不同操作。邏輯相同、資料不同。同一個腳本運作,但是發送的資料不同。
為什麼要做參數化?在性能測試領域,腳本之是以要進行參數化操作,原因一般有兩種:
•功能角度:一般來說,如果業務功能中某些資料具有唯一性的訴求,則一般要進行參數化或者相關的處理。
•性能角度:一般來說,如果伺服器端有緩存操作(查詢類)的業務,則需要考慮參數化。
從悲觀的角度來說,可以考慮增加參數值的個數,使得每一次操作都不重複,即達到不走緩存的效果。
從真實模拟的角度來說,我們需要調研生産環境中,業務的緩存使用比例,然後設定合适的參數值,使得: 緩存使用率=(執行次數-參數值個數)/執行次數。
1.4.1 參數化的操作
在LR中,參數化的實作方式(操作)很多,但是從本質上來說,我們需要保證兩點:參數存在且有值,腳本中調用參數。
在action()函數中,對text右鍵選擇replace with a Parameter,将選中的text替換成參數。
在此彈窗中可以修改參數的名稱以及檔案類型,此處先選擇預設即可,單擊OK繼續。
這個時候就可以發現text已經變成{Newparam},說明我們已經把text參數化了,那麼怎麼設定他的值呢?點選參數清單。或者使用ctrl+L快捷鍵。
在參數清單界面,點選edit with NotePad,設定參數的值,這裡需要注意的是,我們發現參數會輸入空。這是因為在寫參數檔案的時候,輸入了空格,我們要保證光标在輸入參數的下一行。效果如下:
将run-time setting循環次數設定為4,打開log的擴充參數級别運作腳本。
這樣就完成了參數化,我們也可以先在參數清單中右鍵NewParameter然後create table給參數指派,最後在腳本中使用{參數名}進行參數化處理。函數的方式意義不大這裡就不介紹了。
1.4.2Parameter List界面介紹
•Parameter type :其他類型放到後面,現在主要說file類型
•File選項當類型為file類型則會出現該選項,便于選擇和填寫參數存放的檔案名。
中間的是參數區,主要是用來維護參數表,添加、删除行或者列。
•Edit with Notepad:使用記事本打開參數檔案,從編輯友善的角度來說,一般都會使用這個按鈕來修改參數值。
•Data Wizard 通過資料向導ODBC導入資料
•File format:檔案格式,這裡包括以下兩種:
•Column:列的格式包括Comma(逗号分割符)、Tab(制表位分割分)、Space(空格分割符),用來幫助我們分隔列。預設選擇Comma,該格式也是行業規範的CSV檔案格式。
•First data:行的記錄是從第幾行開始,設定幾就是從第幾行開始。
•Select column :設定參數取第幾列的值,有兩種方法
•by number:通過數字選擇列數,參數取該列數的值
•by name : 通過列名選擇列數,參數取該列數的值
在LR中,參數的取值方式一般收到以下兩個選項的影響
•Select next now:該選項是用來設定參數擷取、更新參數值參數值得方式。可選的選項有4個
•Sequential:順序取值
•Random:随機取值
•Unique:唯一取值。在LR中,對于唯一的實作,是采用配置設定的方式。
所謂的唯一,實際效果是先配置設定再順序。即先将所有的參數值按照順序、按塊(塊大小)的方式依次配置設定給每一個虛拟使用者,然後虛拟使用者在執行腳本的過程中隻會使用各自所配置設定的值。
•Same line as X:該選項要求參數清單中至少存在兩個及以上的檔案類型的參數時才會出現。該選項相當于将兩個參數建立起了一一對應的關系。該選項不參與和Update選項的組合。
•Update value on:該選項是用來設定LR更新參數值的時機
•Each iteration:每一次疊代。是指每一次疊代開始的時候,參數就會去擷取或者更新參數值,在下一次疊代之前,無論腳本中對于該參數是否調用、調用一次還是多次,參數的值都不會改變。
該模式下,參數值的變更隻和疊代有關,和調用無關,參數值的變更次數等于疊代次數。
•Each occurrence:每一次出現。所謂出現就是指腳本中出現了參數的調用,是指每一次調用之前,參數都會去擷取或更新參數值。
該模式下,參數值的變更就和調用有關和疊代無關。參數值的變更次數等于調用次數。
•Once:僅一次。是指參數參數第一次被調用的時候會擷取一個參數值,然後在虛拟使用者的生命周期中,該參數的值不會再發生改變
參數值的變更次數等于1。
1.4.3Vugen中的參數
我們的腳本是:
Action()
{
lr_output_message(“the value of param is :%s”,
lr_eval_string("{param}"))
lr_output_message(“the value of param is :%s”,
lr_eval_string("{param}"))
return 0;
}
參數取值為:ABCDEFG
疊代次數為:2
1.4.3.1Sequential取值方式
1.Sequential+Each iteration
順序取值,每次疊代時擷取新的參數值
第一次疊代:取A 輸出2次AA
第二次疊代:取B 輸出2次BB
結果為:AABB
2.Sequential+Each occurrence
順序取值,每次出現時擷取新的參數值
第一次疊代:
第一次出現:取A
第二次出現:取B
第二次疊代:
第三次出現:取C
第四次出現:取D
結果為:ABCD
3.Sequential+Once
順序取值,僅一次
第一次疊代:param取A,在這個虛拟使用者生命周期内均為A,是以結果是:AAAA
如果疊代次數很多,參數值不夠,在預設情況下,LR是順序取值的。
1.4.3.2Random取值方式
1.Random + Each iteration
随機取值在每次疊代效果為: XX|YY ,其中|為疊代分割
-
Random + Each occurrence
随機取值在每次出現效果為: X1X2|Y1Y2 ,其中|為疊代分割。
-
Random + Once
随機取值在僅一次效果為: XX|XX,其中|為疊代分割。
1.4.3.3Unique取值
順序取值和随機取值,從本質上是沒有差別的,一旦牽涉到值得配置設定或者唯一性訴求,則順序取值和随機取值是無法滿足要求的。此時必須選擇unique方式
當select next now 選擇unique的時,且update value on不為once的時,我們看到Parameter List下面的選項可選,我們看一下這些選項的含義
•When out of value:out of value是指虛拟使用者變更參數值得次數大于所配置設定的值得個數時。
•About Vuser:中止虛拟使用者,該選項可以保證每一次的資料都是唯一的
•Continue in a cyclic manner :繼續執行,并循環使用參數值
•Continue with last value :繼續執行,并且使用最後一次的值
•Allocate:指定塊大小的方式,有兩種
•Auto:自動方式,隻有選擇每次疊代才可用。此時的塊大小會自動等于運作時設定中—Run logic 中所設定的疊代次數
•Allocate 手動設定塊大小
-
Unique + Each iteration
當設定了Run上的疊代次數之後,按照記錄順序讀取,當記錄超出清單後,執行when out of value 政策
-
Unique + Each occurrence
每當參數被取值一次,按照記錄順序讀取,當記錄超出清單後,執行when out of value 政策
-
Unique +Once
第一次取值後一次不變
2.4.4Controller的參數
場景是生成負載的關鍵部分,那麼當一個腳本在場景中被多個使用者執行時,參數會如何變化?
首先介紹一下場景設定的入門知識。
打開Tools菜單下的Create Controller Scenario選項,會彈出:
在這裡選擇Manual Scenario(手工場景),虛拟使用者數為5個,其他選項使用預設值,确定後進入場景設計首頁。
按照疊代次數循環
點選運作腳本
點選run完後的使用者,在右鍵虛拟使用者,選擇show vuser log,即可檢視參數日志。
1.4.4.1Sequential取值方式
1.Sequential+Each iteration
每個使用者都是第一次疊代都是AA第二次疊代都是BB
2.Sequential+Each occurrence
每個使用者都是第一次疊代都是AB第二次疊代都是CD
3.Sequential+Once
每次疊代都是AAAA,從參數化的角度來說選擇 Once選項沒有實際意義。
1.4.4.2Random取值方式
1.Random + Each iteration
每個使用者都是随機取值
2.Random + Each occurrence
每個使用者都是參數每次出現,随機取值
3.Random +Once
每個使用者第一次随機取值,之後參數值不變
1.4.4.3Unique取值
1.Unique + Each iteration
按照設定的塊大小配置設定參數,使用者順序取塊,順序取塊中的值,并按照Each iteration更新值,當值不夠時,執行when out of value 政策,來看一下
效果:
2.Unique + Each occurrence
按照設定的塊大小配置設定參數,使用者順序取塊,順序取塊中的值,并按照Each occurrence更新值,當值不夠時,執行when out of value 政策
-
Unique +Once
按照設定的塊大小配置設定參數,按照once更新值,當值不夠時,執行when out of value 政策
這地方應該能看懂吧,我不知道怎麼描述了,不懂請找我
1.4.5 同行取值
接着來看最後一種Select next row 記錄選擇方式Same line as ,這個參數隻有當參數多于一個時才會出現,起作用是根據某一個參數的行号取同一行。場景:城市名和轄區名,城市名是:北京、北京、北京 天津、天津、天津 轄區名:大興、豐台、海澱、北辰、甯河、西青。 讓城市名跟随轄區名,達到我選了轄區、選擇對應的城市,達到一一對應的效果。如下圖:
1.4.6參數類型
雖然常用的參數類型是檔案類型,它可以友善地自定義任意資料組合,但Vugen也提供了許多很多實用的參數類型。我們簡單的了解各種類型的參數特點
1.4.6.1 BPT
該參數類型是與QC或ALM産品中的BPT子產品對應,一般用不上。
1.4.6.2 Custom
這裡提供了一個自定義的參數類型,隻需要填寫參數值即可使用,為了閱讀友善也可以寫上對應的Description。
1.4.6.3 Date/Time
該參數類型提供了擷取時間的參數化做法,在參數化時選擇Date/Time選擇時間格式即可。
1.4.6.4 Group name
通過這個參數可以在腳本中擷取目前腳本所在的GroupName,用于某些處理。
1.4.6.5 Iteration Number
該參數使用者擷取目前所在的疊代編号
1.4.6.6 Load Generator Name
當負載生成時,腳本是放在 Load Generator 上執行,通過這個參數可以獲得腳本運作時所在伺服器的名稱
1.4.6.7 Random Number
有些時候需要使用随機的内容,參數化也考慮到了這一點,可以通過設定最大值,最小值,來實作範圍内随機數的生成
1.4.6.8 Table
Table參數類型是一個File類型的增強版,他提供了一些獨特的功能,不做詳細介紹有需求可自行百度。
1.4.6.9 Unique Number
擷取一個唯一的資料,在做某些主鍵的屬性時會比較友善。
當需要大量使用者名時,我們可以參數化使用者名後面的編号,比如 admin_{userid}
1.4.6.10 User Defined Function
這是VuGen提供的擴充功能。當需要通過外部程式生成某些資料的時候,可以通過dll的方式完成輸入
1.4.6.11 Vuser ID
通過這個參類型可以虛拟使用者的編号。在場景中,每個使用者都有唯一的使用者名,差別這個使用者名時通過使用者ID來說明的。例如Vuser1,這裡說明使用者名為Vuser(一般為腳本名)而使用者編号是1.如果需要擷取使用者的編号可以使用這個參數來實作。
1.4.6.12 XML
作為一種流行的資料格式,XML在業界得到了大量的應用,而XML參數類型提供了對XML格式的支援
1.4.7參數和變量
在Vugen中,預設使用{}的字元串稱之為參數,參數最大的優點就是在LoadRunner中可以直接應用,但是參數并不是能寫在LoadRunner函數中的任意位置,如果想要實作對無法直接參數化的部分進行參數化,可以使用lr_eval_string(“{param}”),例如:
變量和參數的不同:
•變量預設是局部變量,隻在目前action中有效。參數是全局的。變量實作全局變量的方式有兩種,第一種将變量定義放在init的最前面,第二種将變量定義在globals.h中。
•變量的定義必須在函數的最開始的位置進行(C)。
•變量是不能直接使用在雙引号中,要使用的話,則需要使用占位符(絕大多數的LR的函數不支援占位符)。
•參數是必須有調用格式的,且參數的調用必須發生在雙引号之内。
需要掌握的函數:
sprintf:指派字元串給字元串數組變量的。
lr_save_string:是将變量的值指派給一個參數。
lr_eval_string:強制解析(疊代遞歸)為字元串。作用是将參數轉為變量。