天天看點

LoadRunner中的一個關聯技巧 ZT

    衆所周知,在LoadRunner中,關聯是一個很重要的動作,大多數的腳本在錄制完成後并不能直接回放,需要通過一定的關聯才能成功回放。關聯的技巧有很多,這裡介紹的就是其中之一,以下用一個實際的例子來說明。

    腳本的背景如下:

    web_submit_data("classiLoanMaterial.jsf_2")(web_submit_data函數的其它部分省略,下同。)傳回的頁面上可能存在多條記錄,可能一條,可能兩條,也可能三條,等等。我們需要将這些記錄逐個選中進行操作。注意:不是全部選中,而是要逐條記錄進行操作。同時,每一條記錄各有一個編号,這是需要進行關聯的值。在下面的操作中web_url("directAdjust.jsf",

        "URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/

classiadjuststepbystep/directAdjust.jsf?approveFormNum=123456")需要使用到該編号,即黑體字部分的值。面對這樣的目的,很自然地,我們會想到用一個循環語句來實作。首先,在classiLoanMaterial.jsf頁面之前加一個關聯如下:

    web_reg_save_param("sor","LB=sor\" value=\"","RB=\"","Ord=ALL",LAST);将Ord參數值設定為ALL,則關聯函數将自動把符合條件的關聯值儲存到參數數組裡。在本例中,假設關聯值傳回三條記錄,則LR分别将值儲存到sor_1,sor_2,sor_3中,同時,LR還将自動建立一個sor_count變量來儲存總的記錄數,在這裡sor_count值等于3。利用這些資訊,我們就可以很友善地在循環語句中實作我們的目的了。步驟如下:

1、聲明各變量:

    int count;

    int i;

    char sor[50];

    char sorvalue[50];

2、将傳回的記錄數儲存到count變量裡:

count=atoi(lr_eval_string("{sor_count}"));

3、使用for循環:

for(i=1;i<=count;i++)

{

    sprintf(sor,"{sor_%d}",i); //分别将各個sor值儲存到sor字元串中

    sprintf(sorvalue,"%s",lr_eval_string(sor));//通過lr_eval_string函數将字元串賦給sorvalue變量

}

4、在循環體中使用關聯值替換相關值:

web_url("directAdjust.jsf",

classiadjuststepbystep/directAdjust.jsf?approveFormNum={sorvalue}")

    一切看起來似乎順理成章,然而如果按照以上的步驟做下來,将會很遺憾地發現:我們定義的{sorvalue}值根本就不被LR認可并接受,于是它将無情地給我們抛出一個錯誤,說該值是非法的。怎麼辦?難道我們前面做的一切都白費了嗎?

    有句老話說得好:天無絕人之路。聰明而又善良的LR開發團隊已經為我們考慮到了這個問題,給我們預備了一個很有用的函數:lr_save_string,它可以幫助我們解決這個問題。于是我們祭出lr_save_string這道最後的殺手锏:

5、在使用關聯值之前進行字元串格式轉換:

    lr_save_string(sorvalue,"sorvalue1");

classiadjuststepbystep/directAdjust.jsf?approveFormNum={sorvalue1}")

需要特别注意lr_save_string的用法,它是參數值在前(sorvalue),參數名在後("sorvalue1"),這和一般的習慣用法正好反過來(真是好奇怪!)。而且"sorvalue1"這個參數名稱不需要事先聲明,它隻是一個字元串而已(這也比較奇怪!^_^)。

到此,我們總算大功告成!腳本回放成功,并且正确達到了預期的效果!打完收工!

總結:C的變量不能直接在LR的API裡調用,是以必須用lr_save_string進行轉換。

最後順便說一下,lr_save_string這個函數真的很好用,這個例子中提到的方法也适用于另外一些情況,比如說有時候,通過關聯函數出來的值我們不能直接使用,還需要做一些特殊的處理時,那麼我們可以把關聯得到的值取出來,賦給一個字元串,對其進行一番修剪加工後,再用lr_save_string,就可以使用它來替代需要關聯的值了。

後記:我的這篇文章釋出在網上以後,在廣大的測試同行中間引起了強烈的反響,他們紛紛發來賀電和表揚信,對我這種勇于探索、樂于分享的精神給予了充分的肯定。^_^當然,這中間也難免存在極個别的不和諧聲音,例如Zee同學就對我的這篇文章提出了不同看法,他覺得我的做法是把簡單的問題複雜化了,理由是可以隻做一次關聯,每次隻取第一筆記錄即可,當循環進行操作時,第一筆做完以後,第二筆記錄自然會上升到第一筆記錄的位置,是以沒有必要使用關聯數組。我認為他的疑問并非沒有道理,而且是比較有代表性的,是以我在這裡做一個補充說明。在我接觸過的大多數應用系統中,确實都是按照Zee所說的方式進行處理,在這種情況下,腳本的處理的确沒有必要像我以上所述的那樣複雜。不過我在本例中談到的例子比較特殊,在操作完成後,它隻是把每筆記錄的狀态位由“未完成”修改為“已完成”,而原有的記錄并沒有消失,而是仍然停留在原有的位置,此時如果按照Zee所說的方法,那麼在執行第二次循環時,LR将取到操作狀态為“已完成”的第一筆記錄,而不會取到下一筆未完成的記錄,顯然這是不符合我們的要求的,是以在這裡我需要做以上這樣複雜的一個處理。