天天看點

lr參數化

一、參數替代

我們以tk系統(http://topka.cn/)的前台注冊功能為例,來說明“參數化”的基本操作,如下圖,為送出注冊資訊的部分腳本:

lr參數化
lr參數化

注:在參數化前一定要更改一下參數營運腳本進行測試,看腳本是否正常注冊。舉例把email:[email protected]  改為[email protected]

在這裡,我們根據實際業務情況,分析得出,如果讓腳本注冊另外一個新的使用者資訊,需要替換“郵箱”、“昵稱”(密碼和确認密碼可以不用替換,因為他們不是唯一的值)兩個數值,這就需要對兩個數值進行“參數化”操作,在腳本執行時,讓參數按照我們設定的規則,從資料源中擷取不同的數值。

提到“資料源”,我們來掌握一種在實際工作中相對簡便又适用的一種“資料源”——“txt記事本檔案”。

實際的性能測試過程中,大量的測試資料來源或從資料庫中導出,或由測試人員自行建立。我們使用excel表格進行資料的整理或者建立。在excel表格中,每一列代表一個參數,列頭為參數名稱,自行建立。建議使用具備表達含義的字母組合。excel 表格中的資料完備後,直接複制到記事本中。然後将記事本檔案放入“資料”目錄下,以友善調用。如下圖:

lr參數化

現在開始對腳本中相關數值,用參數進行替換。在腳本中,選中數值,點選右鍵,選擇“replace with a parameter”。如圖:

lr參數化

進行參數屬性設定:

lr參數化

parameter name: 填寫參數名稱,注意:這裡名稱與txt文本中相關參數列名相同;

parameter type: 參數類型保持預設“file”;

我們将腳本中需要進行“參數替換”的數值,處理完畢後,見下圖:

lr參數化

 這裡提及一個技巧:我們注意到,關于“郵箱資訊”的參數設定。無論在“txt資料源”中,還是在腳本的參數替代中,我們都沒有設定專門的“郵箱參數”。在實際性能測試中,當某些測試資料存在一定的規律性,例如:郵箱資訊@前的内容等于使用者名,我們完全可以進行參數複用,對郵箱資訊進行“部分參數化”;

二、參數設定:

 完成腳本中的“參數替換”,接下來我們要進行重要的“參數設定”。

 點選工具欄上的“參數設定按鈕”,如圖:

lr參數化

 在參數設定的窗體中,左側列出所有參數名稱。我們需要對每個參數進行分别設定。我們以“email”為例來說明,選擇“email”。

2.1 連接配接資料源

lr參數化

由于預設的資料源是lr預設指定的email.dat檔案,其資料量隻有一條錄制腳本時使用的參數原始值email,可以通過編輯該.dat檔案來豐富資料源。

為了使性能測試工作更加規範化,友善統一維護,我們采取調用事先準備好的txt檔案來作為資料源。

txt和dat檔案都可以作為資料源供參數化使用。為了獲得更好的參數讀取性能,建議将.txt檔案更改為.dat檔案使用。.dat檔案同樣可以使用記事本編輯。

點選“browse”,在項目目錄下的“資料”目錄中,選擇相關dat資料檔案:

lr參數化

 把email和name都分别選擇一下。

2.2  select column設定區域

lr參數化

 該區域設定參數所對應的資料列。設定方式分為兩種:

 “by number”,即按照列序号來指定,工具預設方式;

 “by name”,即按照列名稱來指定;

  為了增強腳本可讀性,我們統一使用“by name”方式來指定參數資料列。在下拉清單中選擇與參數名一緻的“email”。

2.3  file format 設定區域

lr參數化

“column” ,對文本檔案進行“列識别”的方式,保持預設的“tab”;

 “first data”,設定參數第一次取值時,從清單中第幾行資料開始擷取,預設為1,此處設定在實際工作中經常用到,某些情景下是需要随時改變設定的。例如,某系統注冊子產品,要求使用者名不能重複。我們每次注冊100個新使用者,當第一次場景執行完畢,清單中前100個使用者資料已經錄入系統。第二次場景執行時,重新利用這些使用者資料進行注冊,顯然是失敗的。再次執行場景之前,需要在腳本中,修改此處設定為從101開始。下一次修改為從201開始……以此類推,當然前提是,要保證資料源中的資料量是完全充足的。

2.4 參數化取值規則

lr參數化

select next row 與 update value on

這兩個選項的設定,直接決定性能測試場景運作的成敗,重要程度不言而喻。

通過靈活的組合配置,可以實作多種複雜業務場景的正确參數供應,想要熟練使用loadrunner測試工具,本知識點的掌握為重要的必備技能。

為了更好地掌握了解,我們詳細解釋各選項的含義 :

select next row  取值規則

設定參數如何取值,也就是該參數對記事本中的那列資料,按照什麼規則進行取值。其中三種選項分别為:sequential 按順序取值、random 按随機取值、unique 按全新理念取值。下面章節,我們詳細研讨三種取值規則。

 update value on 換值時機

當參數具備了自己的取值規則,也隻能決定了自己可以成功擷取第一個值,那麼自己什麼時候再去記事本裡擷取下一個值,來換掉目前的取值呢,update value on正是為此設立。其中三種選項分别為:each iteration 每次疊代時換值、each occurrence 該參數每次出現即換值、once 按照取值規則取得第一個值後,一直不再換值了。

在進一步細化學習設定“取值規則”、“換值時機”之前,我們需要先理清一下雜亂的思緒:這兩項設定,永遠是針對單虛拟使用者的個體行為而言。并非對場景中宏觀的使用者群的行為秩序進行限制。

2.4.1 sequential

按順序取值。這個“順序”,顧名思義,從資料列中第一條資料開始,逐一向下取值,即為按順序取值。那麼,是誰按順序呢?

lr參數化

我們先來一起思考一個例子:假設我們模拟5個虛拟使用者(virtual user簡稱vu)進行登入操作,記事本裡提供name1到name5五條資料供取值,是否可以了解為:在場景執行時,sequential設定,限制5個虛拟使用者按照順序進行取值,即:第一個vu取值name1,第二個vu取值name2,第三個取值name3,以此類推。是事實否?

2.4.2  random

随機取值。這是一種沒有規則的規則。即為随意取值。我們實際工作中貌似運用不多。

2.4.3 unique

按全新理念取值。“unique”,字面了解為“唯一的,獨一無二的”。參數化中,選擇該種取值方式,即注定了這個vu非常有個性的性格,此個性可概括為“順序+挑剔(全新)”。

有序,某種程度上等同于“sequential”。挑剔,特指具備該設定的vu在一個場景運作周期内,去資料源中取值時,凡是遇到非全新的,即被用過的資料均不采用,繼續按照有序狀态尋找全新資料。注意:這個“被用過的資料”不僅包括其他vu采用過的,也包括它自己采用過的,多麼有個性的一面!

可以說unique的出現,開創了并發場景運作中,龐大的vu隊伍,各有所執的逼真風景。

那麼,unique的選擇,是否就是針對對整個vu使用者群的行為限制呢?非也,“隻用全新”就是單個vu的取值理念。

2.4.4 “行看齊”取值規則

新版lr,增加了“行看齊”的取值規則。如果具備“行對應關系”的多個參數,儲存在同一個txt文本中。如下圖所示的“email”與“name”:

lr參數化
lr參數化

如何保證email取值“xiaoqiang02”時,name取同行的值“xiaoqiang02”,email換值“xiaoqiang03”時,name換同行的對應值“xiaoqiang03”? 

我們可能會挺直腰闆、昂首挺胸地回答,将兩個參數的“取值規則”設定相同即可,例如:都設定為“unique”,每個參數都按照從頭到尾的順序、逐一采用全新的資料換值,就保證對應了……

可以說,對于單vu來執行腳本,參數的取值方式都設定為“unique”,可以完全保證參數之間的“資料行對應”。但對于多vu來同時執行這個腳本,隻能說大部分情況下可以保證參數之間的“資料行對應“。科學是嚴謹的,哪怕有一絲漏洞的誤差,都會有出現故障的幾率,我們不妨來認識一下,多vu下如何産生這個幾率極小的故障: 

極端假設:2個vu同時執行腳本,vu1執行到email時,txt清單中都是新值,vu1非常坦然的為自己的email取得xiaoqiang02 ,于是繼續向下執行腳本,待執行name參數 時,再去txt中為name取新值……

再說vu2,按理說vu1、vu2被我們的controller設定為同時出發的,唉但畢竟由于各種因素還是有很微妙的先後,讓vu1腳本率先執行到了參數email,搶到了xiaoqiang02,刹那間,說時遲,那時快!随後vu2也執行到了email,趕着去txt裡為自己的 email取值,發現晚了0.000001秒,剛被vu1搶走了頭彩xiaoqiang02,vu2惱恨啊,但自己天生被設定了unique屬性,注定了自身必須取全新的個性,是以取了xiaoqiang03,繼續回去向下執行腳本,心想,待執行到name參數時,老夫再來“搶值“! 

ok!時間暫停!! 

我們來裁判下,從腳本開始運作,一直執行到出現第一個參數email,這段路程,vu1顯然以0.000001秒的微弱差距領先,是以搶到了name1。那麼,下一段賽程:從email參數位置,執行到出現第二個參數name,這段路程中可能有很多其它腳本、其他風景……那麼,vu1、vu2在這段賽程中,誰會領先到達name參數位置呢? 

你還能斬釘截鐵保證,vu1還會以領先0.0000001秒的差距再次險勝嗎?可能是,也可能不是。 

如果不是,那麼vu2先執行到name,立刻去txt中的“name資料列”中搶到頭彩“xiaoqiang02”,或許刹那間的0.0000000000001秒之後,vu1瘋了似的沖進txt中,但一切晚矣……

事實表明,在這次極端并發中,vu1執行腳本分别為參數取值:xiaoqiang02 , xiaoqiang03 ;vu2執行一次腳本分别為參數取值:xiaoqiang03,xiaoqiang02; 

想要解決此不和諧境況嗎?請使用“same line as……”。 

還以上邊的例子說明,如果腳本中第二個參數name的取值方式設定為“same line as email”,那麼就注定了name與email每次取值,都在同一行。那麼vu1在第一次以0.000001秒領先搶到xiaoqiang02時,也注定了同行的資料“xiaoqiang02”也被自己為自己腳本中的第二個參數name預定了。vu2失守了第一輪賽跑,取得了資料name2,在接下來的第二輪奔向name的賽程中,即使超光速執行,也早已注定,自己的name參數早被“same line as……” 預定了xiaoqiang03的同行“xiaoqiang03”。 

為保證我們的性能測試在大量vu、業務場景相對複雜的情況下,所有參數化取值嚴密有序。統一遵照如下規範:在同一“txt”文本中的所有參數,當需要設定unique取值方式,隻設定第一個參數為unique,其他參數的取值設定,都通過“same line as 第一個參數”來實作。 

lr參數化
lr參數化
lr參數化

2.5 參數化換值時機

lr參數化

2.5.1 each iteration

每次疊代時換值。“疊代”,我們前面有所學習,即腳本中有關“action”的部分重複執行。某參數選擇此項換值時機,腳本每重複執行一次action裡的内容,action中的該參數就去資料源中換取一個新值。該參數在action中無論出現幾次,都處于本次疊代的執行中,是以隻取一次值。

思考一下:如果某腳本action中有兩處出現參數logname,資料源如上圖記事本内容,參數取值邏輯中取值方式為sequential,換值時機為each iteration。該腳本中對action設定了疊代規則,疊代次數為2次。那麼,腳本執行結束後,logname分别取了哪些值呢?

2.5.2 each occurrence

每次出現即換值。我們打開腳本,如果參數“logname”在腳本中多個位置出現,那麼設定該選項,當腳本執行時,每遇到“logname”出現,就去資料源中換一個值。

思考一下:如果某腳本action中有兩處出現參數logname,資料源如上圖記事本内容,參數取值邏輯中取值方式為sequential,換值時機為each occurrence。該腳本中對action設定了疊代規則,疊代次數為2次。那麼,腳本執行結束後,logname分别取了哪些值呢?

2.5.3 once

一直不再換值。腳本執行從開始到執行結束,無論疊代多少次,無論某參數出現多少次,始終保持第一次的取值,不再換值,直到腳本執行完成。即,某vu測試跑完。在場景中,每個vu都遵守這個同樣的“專一規則”。

思考一下:如果某腳本action中有兩處出現參數logname,資料源如上圖記事本内容,參數取值邏輯中取值方式為sequential,換值時機為once。該腳本中對action設定了疊代規則,疊代次數為2次。那麼,腳本執行結束後,logname分别取了哪些值呢?

繼續閱讀