LoadRunner腳本編寫之三(事務函數)


 

  關於腳本的這塊,前兩篇都在講C語言,其實,要整理點實用的東西挺難,在應用中多對錄制的腳本分析,但對於新手學腳本確實無從下手。

先貼一個腳本:

完整代碼:

View Code

重點代碼部分:

Action()
{


    web_url("webhp", 
        "URL=http://www.google.com.hk/webhp?hl=zh-CN&sourceid=cnhp", 
        "Resource=0", 
      .....
    lr_start_transaction("登陸");    //設置事務開始

    web_submit_data("ServiceLoginAuth", 
        "Action=https://accounts.google.com/ServiceLoginAuth", 
        "Method=POST",       
   ........
web_file("web_find","defnngj@gmail.com",LAST); //設置檢查點 lr_end_transaction("登陸",LR_AUTO); //設置事務結束 return 0; }

 

上面的一段代碼是我錄制的一個google登錄的過程,詳細過程描述:

1、進入google首頁

2、點擊右上角的登錄鏈接,跳轉到登錄頁面

3、設置登錄事務開始,輸入用戶名密碼,點擊登錄

4、登錄成功后跳轉后google 首頁,右上角出現登錄的用戶名,設置事務結束。

 

檢查點

  在上面的操作中,我設置了一個檢查點,web_fiind  ,判斷后我是否登錄成功一個重點的標志是在google首頁右上角是否出現我的用戶名。所以,我根據這個特點設置檢查點,來檢查登錄是否成功。設置檢查點的函數有三個,

web_find()函數: 在頁面中查找相應內容

web_reg_find()函數: 在緩存中查打相應的內容

web_image_check()函數:在頁面中查找具體圖片。

  他們的具體用法,你們可以在腳本的編寫中,光標定位在函數中,按F1 查看幫助文檔或參考其它文檔。

 

關於腳本中的事務

 

  我們在一個腳本中可能要做很多操作,我們為了分清腳本中某一段代碼具體是做什么,所以,在執行某個操作的前后需要添加事務,用來標志事務的開始與結束,這樣可以使腳本更清晰。當然,對於不同的事務需要分開錄制。比如,某電子商務網站的瀏覽商品與交易。他們的比例是不同的,對於比較復雜的場景,是多個事務按不同的比例並行的。設置80%的用戶瀏覽商品,20%的用戶進行交易。

  當然,事務與事務之間是會有依賴關系的。如果我們把訪問首頁定為一個事務,登錄定為一個事務,瀏覽商品定為一個事務,交易定為一個事務。那么我們要想錄制(編寫)交易的事務,那么前面三個事務是先覺條件。所以,我們知道錄制一個腳本的目的是哪個操作,然后在其前后添加事務標識。

      對80%的用戶瀏覽商品,20%用戶交易,交易的前提是先瀏覽一個商品,也就是所有用戶(100%)都瀏覽了商品,只有20%的用戶去交易。這樣是合乎邏輯的。

 

事務函數                                                                         

 

  在上面的腳本中我們用到了lr_start_transaction()函數和 lr_end_transaction()函數來標識一個事務的開始與結束,除些之外,loadrunner還提供了許多與事務相關的函數,這里介紹幾個常用的。

 

1lr_set_transaction_instance_status 用於設置事務的狀態,事務的狀態包括:LR_PASS、 LR_FAIL 、  LR_AUTO 、  LR_STOP  。可以在腳本中根據條件設置事務的狀態,例如,根據檢查點返回的結果來設置事務為通過還是失敗。

if(event == GENERAL_ERROR)
        lr_set_transaction_instance_status(LR_FAIL);
    lr_end_transaction("登陸",LR_AUTO);

 

2、 lr_fail_trans_with_errorlr_set_transaction_instance_status 類似,都可以用於設置事務的狀態,區別在於lr_fail_trans_with_error除了可以設置的狀態,還可以輸出錯誤日志信息。

if(status != SUCCESS)
        lr_fail_trans_with_error("an error has occurred:%s",my_get_error_string(status));
    lr_end_transaction("登陸成功",LR_AUTO); 

 

3lr_get_transaction_status前兩個函數的作用相反,用於獲取事務的狀態。

if (lr_get_transaction_status() == LR_FAIL)
    {
        //由於web_url請求失敗了,所以沒有必要繼續執行下去,因些設置事務狀態為FAIL
        lr_end_transaction("登陸失敗",LR_FAIL);
        return;
    }

 

4、lr_get_transaction_duration 用於獲取事務所消耗的時間。這個就比較有意思了。

  我們登錄百度首頁,插入一個事務,然后訪問百度注冊頁面。下面計算訪問注冊頁面的時間。

完整腳本:

View Code
Action()
{
    double trans_time;  //定義變量

    web_url("www.baidu.com", 
        "URL=http://www.baidu.com/", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=", 
        "Snapshot=t14.inf", 
        "Mode=HTML", 
        EXTRARES, 
        "Url=http://s1.bdstatic.com/r/www/cache/aoyun/img/i-1.0.1.png", ENDITEM, 
        "Url=/favicon.ico", "Referer=", ENDITEM, 
        "Url=http://s1.bdstatic.com/r/www/img/bg-1.0.0.gif", ENDITEM, 
        "Url=http://nsclick.baidu.com/v.gif?pid=201&pj=www&rsv_sid=1289_1328_1262_1228_1344_1342_1186_1281_1178_1287_1320_1294_1330&fm=behs&tab=tj_reg&un=&path=http%3A%2F%2Fwww.baidu.com%2F&t=1343538345708", ENDITEM, 
        "Url=https://passport.baidu.com/favicon.ico", "Referer=", ENDITEM, 
        LAST);

    lr_start_transaction("訪問注冊頁");  //定義事務開始

    web_link("???", 
        "Text=???", 
        "Ordinal=2", 
        "Snapshot=t15.inf", 
        EXTRARES, 
        "Url=../img/breadbg.gif", "Referer=https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM, 
        "Url=../js/pass_api_reg.js?v=20120711", "Referer=https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM, 
        "Url=../img/v2/regbtn-split.gif", "Referer=https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM, 
        "Url=../cgi-bin/genimage?0013435383780156BF1F30CF18D2332EA927154DCDAB3B6B40F9E25197273F556454857E2FADF7BA23531BE59EEDE0EF92F2F006F8D595B88A907E318D2A249CBAB109FCDB3AB38ED4453F3BC149C6A5FD6240B97D598BA84EE3CEEE3F4359D3469309D88EE55C19B04251D2212171720B476D0A0D6277787DD43D9BA29E426A82BFD90E248FA15A32F1838B3E15D63B8CFE4E3DC6EAD4F23FE0DB457E5AE6B82DACCB79EE9EF289", "Referer=https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM, 
        "Url=../img/v2/reg_input_bg.gif", "Referer=https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F", ENDITEM, 
        LAST);

    trans_time=lr_get_transaction_wasted_time("訪問注冊頁");  //獲得消耗時間

    if (trans_time) {
        lr_output_message("The duration up to the submit is %f seconds",trans_time);  //打印數輸出消耗實時間
    }else{
        lr_output_message("the duration cannot be determined. ");
    }

    lr_end_transaction("訪問注冊頁",LR_AUTO);  //事務結束

    return 0;
}

重點代碼部分:

Action()
{
    double trans_time;  //定義變量

    web_url("www.baidu.com", 
        "URL=http://www.baidu.com/", 
       .....

    lr_start_transaction("訪問注冊頁");  //定義事務開始

    web_link("???", 
        "Text=???", 
        "Ordinal=2", 
        "Snapshot=t15.inf", 
     ......

    trans_time=lr_get_transaction_wasted_time("訪問注冊頁");  //獲得消耗時間 if (trans_time) {
        lr_output_message("The duration up to the submit is %f seconds",trans_time);  //打印數輸出消耗實時間
    }else{
        lr_output_message("the duration cannot be determined. ");
    }

    lr_end_transaction("訪問注冊頁",LR_AUTO);  //事務結束 return 0;
}

運行結果:

.......
Action.c(39): The duration up to the submit is 0.029588 seconds
Action.c(45): Notify: Transaction "訪問注冊頁" ended with "Pass" status (Duration: 5.0300 Wasted Time: 0.0296).
Ending action Action.
Ending iteration 1.

39:持續時間長達0.029588秒的提交

45:通知:交易”訪問注冊頁”結束,“通過”狀態(持續時間:5.0300 浪費時間:0.0296)。

 

  從上面的結果中發現,我們設置lr_get_transaction_wasted_time函數的時間0.029588 與事務結束浪費的時間 0.0296 非常接近。 這是因為我把 lr_get_transaction_wasted_time函數插入在了事務結果的前面,其實,我們可以將lr_get_transaction_wasted_time插入在事務執行過程的任意位置來計算消耗時間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM