6.1 檢查點(diǎn)
6.1.1 插入檢查點(diǎn)的原因
以登錄場景為例挚冤,當(dāng)?shù)卿浭r,接口其實(shí)已經(jīng)返回了相應(yīng)的error code赞庶,可是因?yàn)槲覀冊?Vuser -> Run-Time Settings里的 Error Handling 里選中了 Continue on error训挡,所以雖然出錯了,但是登錄事務(wù)卻仍然執(zhí)行完成了歧强,再加上我們的事務(wù)結(jié)束函數(shù)里一般設(shè)置的是AUTO澜薄,如下:
lr_end_transaction("用戶登錄", LR_AUTO),因此系統(tǒng)仍然判定該事務(wù) PASS摊册。
所以我們需要手工增加返回值檢查肤京,否則場景運(yùn)行時的統(tǒng)計(jì)分析結(jié)果就完全錯了。
6.1.2 插入檢查點(diǎn)
我們可以把腳本視圖切為“Tree View”模式茅特,然后右鍵單擊需要插入檢查點(diǎn)的位置忘分,在右鍵菜單里選擇 Insert After... 或者 Insert Before...,但是我們在實(shí)際應(yīng)用中白修,都不是錄制腳本妒峦,而是直接寫,所以參見下節(jié)兵睛;
6.1.3 檢查點(diǎn)函數(shù)
web_find() 和 web_reg_find():
(1)前者是普通函數(shù)肯骇,后者是注冊函數(shù)窥浪;
(2)前者需要在 Run-Time Settings -> Internet Protocol -> Peferences 窗口勾選上 Enable image and text check 才可用,后者沒有這個限制笛丙;
(3)前者錄制時只能基于 HTML 模式錄制的腳本中漾脂,而后者沒有這個限制;
(4)前者是在返回頁面內(nèi)容顯示出來以后才能查找胚鸯,后者在緩存中查找骨稿;
(5)后者執(zhí)行效率比前者高;
6.1.4 通過檢查點(diǎn)判斷事務(wù)結(jié)束狀態(tài)
web_reg_find("Text=LR_Test", //設(shè)置需要查找的 String
? ?"SaveCount=apptype_count", ? //將查找到的次數(shù)存入該變量
LAST)
//lr_eval_string 函數(shù)讀取 apptype_count 的值是字符型姜钳,通過 atoi 轉(zhuǎn)換為整型啊终,才能跟 1 比較
if (atoi(lr_eval_string("{apptype_count}")) >= 1) {
? ? ? ?lr_end_transaction("myMerchantList",LR_PASS);
? ?}
else{
? ? ? ?lr_end_transaction("myMerchantList",LR_FAIL);
? ?}
6.2 Block(塊)技術(shù)
LoadRunner 如何在一個腳本中實(shí)現(xiàn)不同事務(wù)、不同次數(shù)的循環(huán)或不同百分比的循環(huán)呢傲须?
在某些復(fù)雜場景里蓝牲,你也許需要用到這樣的設(shè)置√┓恚可以在上面的對話框里設(shè)置例衍。你也能選中 Block,點(diǎn)擊 Properties 對話框已卸,去設(shè)置 Sequential 的次數(shù)或者 Random 的百分比佛玄。
目前,我在實(shí)際應(yīng)用中還未應(yīng)用到累澡。
6.3 參數(shù)化技術(shù)
腳本參數(shù)化梦抢,就是用參數(shù)去取代腳本里的常量。參數(shù)的來源可以是文本文件愧哟,也可以是數(shù)據(jù)庫奥吩。參數(shù)化的過程體現(xiàn)了數(shù)據(jù)驅(qū)動的思想,即將測試腳本與測試數(shù)據(jù)剝離開蕊梧。
6.3.1 參數(shù)化的原因及條件
原因:
(1)減小腳本的數(shù)量霞赫,如果寫死常量的話,那必須得復(fù)制并修改大量的腳本肥矢;
(2)模擬真實(shí)場景端衰,每個 Vuser 使用不同的參數(shù)值來模擬;
需要進(jìn)行參數(shù)化的一些情況:
(1)日期時間類的常量甘改;
(2)唯一性約束旅东。比如 User ID,Order ID 等在數(shù)據(jù)庫里被作為主鍵的十艾;
(3)數(shù)據(jù)約束抵代。指在測試過程中要求提交的業(yè)務(wù)數(shù)據(jù)必須是每次都不同,比如動態(tài) token疟羹;
(4)緩存數(shù)據(jù)約束主守。如果不參數(shù)化,每次查詢條件都用一樣的榄融,從數(shù)據(jù)庫里查詢到的結(jié)果也就是一致的参淫,所以系統(tǒng)就直接從緩存讀取了,而不需要從硬盤將數(shù)據(jù)讀到緩存愧杯。導(dǎo)致這樣測出來的時間不是真實(shí)的響應(yīng)時間涎才。
6.3.2 創(chuàng)建參數(shù)
選中需要被參數(shù)化的常量并右鍵單擊,選擇“Replace with a parameter”力九,打開“Select or Create Parameter”對話框
在上述對話框里設(shè)置成功一個參數(shù)后耍铜,會在腳本保存的根目錄下自動生成一個參數(shù)化文件(.dat)
這里需要注意兩點(diǎn):
(1)參數(shù)化文件可以與腳本分離,單獨(dú)保存在一個參數(shù)文件夾跌前,同一套腳本可以共用棕兼;
(2)如果多個參數(shù)是成組使用的話,可以合并成一個參數(shù)化文件抵乓;
6.3.3 參數(shù)類型屬性
常用的:
Date/Time / Random Number / File
注意:隨機(jī)數(shù)設(shè)置項(xiàng)里伴挚,顯示的格式也可以自定義,比如設(shè)成:%03lu灾炭,則表示不管隨機(jī)數(shù)為多少茎芋,都用3位來表示,如隨機(jī)數(shù)為3蜈出,那么顯示的結(jié)果為003田弥。
不常用的:
Group Name /?Iteration Number /?Load Generator Name / Unique Number / Vuser ID
6.3.4 數(shù)據(jù)文件
? ? 1. File path:Browser 設(shè)置
? ? 用來選擇參數(shù)文件的路徑,需要注意的是铡原,默認(rèn)參數(shù)化時文件是保存在腳本根目錄下的偷厦,但如果單獨(dú)放到參數(shù)化文件夾下了,就需要選擇參數(shù)的路徑燕刻。不過在實(shí)際應(yīng)用中沪哺,建議將 File path 設(shè)置為相對路徑,將腳本的根目錄用“.”來代替酌儒。
? ? 2. Edit with Notepad 設(shè)置
? ? 記事本打開后辜妓,內(nèi)容中第一行是參數(shù)名稱,第二行是參數(shù)的初始值忌怎。參數(shù)之間用逗號隔開籍滴。你也可以直接用 UltraEdit 或 Notepad++ 打開.dat文件編輯。
? ? 3. Select column 設(shè)置
? ? 指明參數(shù)選擇的列榴啸,實(shí)際應(yīng)用中建議用 By name孽惰,直觀不易選錯。
? ? 4.File Format - Column 設(shè)置
? ? 參數(shù)列一般用默認(rèn)的逗號作為分隔符鸥印,也可以選擇 Tab 或 空格分隔勋功。
? ? 5.File Format - First data 設(shè)置
? ? 設(shè)置成N坦报,就從列標(biāo)題后的第 N 行開始執(zhí)行。
? ? 6. Select next row 設(shè)置
? ? 針對 Controller 運(yùn)行時的 Vuser狂鞋,決定 Vuser 選擇參數(shù)的過程片择。
? ? ? ? (1)順序 Sequential。如果參數(shù)化文件中的數(shù)據(jù)都執(zhí)行了一遍骚揍,則返回到第一行繼續(xù)執(zhí)行字管。
? ? ? ? (2)隨機(jī) Random。隨機(jī)讀取參數(shù)數(shù)據(jù)信不。
? ? ? ? (3)唯一 Unique嘲叔。分配一個唯一的有順序的值給每個 Vuser 作為參數(shù)。
? ? ? ? ? ? 當(dāng)選中了 Unique 時抽活,下面兩個選項(xiàng)變?yōu)榭捎脿顟B(tài):
? ? ? ? ? ? ? ?3.1 ?When out of values:表示當(dāng)參數(shù)不夠時的3種處理方式:
? ? ? ? ? ? ? ? ? ?3.1.1 Abort Vuser:忽略剩下的所有 Vuser 不再運(yùn)行
? ? ? ? ? ? ? ? ? ?3.1.2 Continue in a cyclic manner:將參數(shù)繼續(xù)循環(huán)一次硫戈,Vuser 按順序參數(shù)進(jìn)行迭代
? ? ? ? ? ? ? ? ? ?3.1.3 Continue with last value:一直使用最后一個數(shù)據(jù)進(jìn)行后面的迭代
? ? ? ? ? ? ? ? 3.2 Allocate Vuser values in the Controller:指在 Controller 運(yùn)行時,2種分配參數(shù)的方式:
? ? ? ? ? ? ? ? ? ? 3.2.1 Automatically allocate block size:由 LoadRunner 自動分配每個 Vuser 使用的參數(shù)情況
? ? ? ? ? ? ? ? ? ? 3.2.2 Allocate XXX values for each Vuser:為每個 Vuser 分析所設(shè)置的虛擬用戶下硕。
? ? ? ? (4)Same link as ***:與某個已定義好的參數(shù)取同一行值掏愁。要求至少其中的一個參數(shù)必須是 Sequential、Random 或 Unique卵牍。
? ? ? ? (5)Update value on 設(shè)置:設(shè)置腳本迭代過程中取值的策略果港,可以在調(diào)試腳本的日志中查看表現(xiàn)。
? ? ? ? ? ? ? 5.1 Each iteration:在同一個迭代過程中糊昙,不管同一個參數(shù)出現(xiàn)多少次辛掠,都只使用同一個值。實(shí)際應(yīng)用中要注意释牺,經(jīng)常會沒選這個值萝衩,導(dǎo)致同一個 Action 里上下午接口出錯;
? ? ? ? ? ? ? 5.2 Each occurrence:每次迭代的過程中没咙,參數(shù)的值都會更新猩谊;
? ? ? ? ? ? ? 5.3 Once:同一個 Vuser 中一直取同一個值,表中其他的數(shù)據(jù)不參與迭代過程祭刚。
6.3.5 導(dǎo)入數(shù)據(jù)
LoadRunner 允許利用參數(shù)化從數(shù)據(jù)庫里導(dǎo)入數(shù)據(jù)牌捷,提供了兩種方式:Microsoft Query 和 指定數(shù)據(jù)庫連接字符串和 SQL 語句,后者在我的實(shí)際應(yīng)用中較多涡驮。
(1)在 Parameter Properties 對話框點(diǎn)擊 Data Wizard 按鈕暗甥,則會打開下面的對話框;
(2)打開創(chuàng)建新數(shù)據(jù)源對話框:
(3)現(xiàn)在本機(jī)安裝 mysql-connector-odbc-3.51.20-win32捉捅,在下面的驅(qū)動程序列表里就能看到對應(yīng)的 MySQL ODBC 3.51 Driver撤防。
(4)輸入相應(yīng)的 DB server IP,正確的用戶名和密碼棒口,就能在 Database 下拉列表里看到相應(yīng)的數(shù)據(jù)庫寄月。
(5)數(shù)據(jù)源建立成功后辜膝,可以在選擇數(shù)據(jù)源對話框選擇你創(chuàng)建的數(shù)據(jù)源,然后在下面對話框里的“SQL statement” 編輯框里輸入你要查詢數(shù)據(jù)的 SQL漾肮,點(diǎn)擊 Finish厂抖。再稍等片刻(取決于你查詢數(shù)據(jù)量的大小)初橘,就能在參數(shù)化文件里看到相應(yīng)的數(shù)據(jù)了。
6.4 關(guān)聯(lián)技術(shù)
LoadRunner 中的關(guān)聯(lián)技術(shù)一直以來是我不太理解充岛,為什么要跟參數(shù)化分開來看保檐。按我個人的理解:“關(guān)聯(lián)”其實(shí)可以看做參數(shù)化的動態(tài)賦值方法。上一節(jié)中說的是在腳本執(zhí)行前給某個參數(shù)預(yù)先賦值崔梗,而“關(guān)聯(lián)”可以說就是在腳本執(zhí)行時夜只,動態(tài)從服務(wù)端獲取到值,再賦予某個參數(shù)蒜魄。
好了扔亥,以上是我個人的疑惑和不解。我們還是先回到書上吧谈为。
6.4.1 關(guān)聯(lián)的原理
關(guān)聯(lián)(Correlation)是把腳本中某些寫死的數(shù)據(jù)(hard-coded)轉(zhuǎn)變成取自服務(wù)器返回的旅挤、動態(tài)的、每次都不一樣的數(shù)據(jù)伞鲫。常用關(guān)聯(lián)技術(shù):錄制中關(guān)聯(lián)粘茄、錄制后關(guān)聯(lián)和手動關(guān)聯(lián)。
LoadRunner 關(guān)聯(lián)是通過左右邊界值來查找服務(wù)器返回給客戶端的值秕脓。
6.4.2 手動關(guān)聯(lián)
我在應(yīng)用中只使用手動關(guān)聯(lián)柒瓣,因?yàn)楸容^靈活快捷。常用的關(guān)聯(lián)函數(shù):
? ? web_reg_save_param("userid",? //創(chuàng)建變量名稱吠架。將
? ? ? ? "LB=\"userId\":\"",? //需要獲取到的動態(tài)值的左邊界值
? ? ? ? "RB=\",", //需要獲取到的動態(tài)值的右邊界值
? ? ? ? "Search=Body", //指定在Body 緩沖區(qū)中查找
? ? ? ? "ORD=ALL", //不填及默認(rèn)值為1芙贫,指查找待匹配的內(nèi)容第一次出現(xiàn)時,就保存到變量里傍药。設(shè)為All 時磺平,是將所有符合條件的值保存在一個數(shù)組里。
? ? LAST); //結(jié)束參數(shù)的標(biāo)志
理論上關(guān)聯(lián)與參數(shù)化的區(qū)別:
(1)數(shù)據(jù)處理方式不同拐辽,參數(shù)化的數(shù)據(jù)是由客戶端向服務(wù)器提交的褪秀,而關(guān)聯(lián)是需要獲取服務(wù)器返回客戶端的數(shù)據(jù)。
(2)處理的數(shù)據(jù)是否確定薛训,參數(shù)化數(shù)據(jù)是測試工程師知道的媒吗,而關(guān)聯(lián)數(shù)據(jù)的內(nèi)容是不清楚的。