1. 程式人生 > >loadrunner提高篇-場景設計實踐

loadrunner提高篇-場景設計實踐

start ref 由於 www 對話 彈出 場景 功能 fff

集合點設置

一、為什麽要進行集合點設置?

  因為在測試過程中,並不能保證所有的Vuser都在同一時刻進行操作,這樣就達不到並發測試的目的,故需要用到集合點技術,集合點的意思是如果在一個操作之前設置了一個集合點,LR會等待所有的Vuser都準備好要執行該功能時才開始執行,其強調的是所有的Vuser都已準備好了,如果只是部分vuser準備好了,該功能還是不會被執行。

二、如何進行集合點設置?

  1、scenario->rendezvous,如圖1所示(例子用的是手工測試場景模式)

註:在場景設置集合之前(即在錄制腳本過程中或錄制完後),腳本一定要插入集合點;否則會發現scenario菜單中rendezvous項是不可選的。

技術分享

圖1(設置集合點)

  2、點擊rendezvous按鈕後,會彈出rendezvous information窗體,設置集合點信息,如圖2所示

    1)rendezvous:顯示腳本中包含的所有集合點。默認情況下這些集合點處於啟用狀態(可用disable rendezvous按鈕禁用);

    2)scripts:顯示了場景運行的所有腳本;

    3)vusers:場景運行設置虛擬用戶情況。默認情況下所有的vuser都會參與到集合點的策略中來(可用disable vuser按鈕將vuser設置為不參與);

技術分享

圖2(集合點設置對話框)

  3、點擊policy按鈕,在彈出窗體中設定集合點執行的策略,如圖3所示

    1)表示當所有用戶數的x%到達集合點時,開始釋放等待的用戶並繼續執行場景。

    2)表示當前正在運行用戶數的x%到達集合點時,開始釋放等待的用戶並繼續執行場景。

    3)表示當x個用戶到達集合點時,開始釋放等待的用戶並繼續執行場景。

    4)timeout between vusers:當第一個用戶到達集合點後,再等待30s,如果30s內到達的用戶數達到指定的數量,就開始繼續執行場景;如果在30s內還沒有達到指定的用戶數量,就不再等待,開始釋放等待的用戶並繼續執行場景。詳細原理,如圖4所示

技術分享

圖3(集合點策略設置)

技術分享

圖4(集合點超時原理)

  分析:當前面3個虛擬用戶到達集合點後,第四個虛擬用戶在30s內並未到達集合點,這樣已經到達的虛擬用戶不會再等後面的虛擬用戶,而是直接釋放虛擬用戶,運行後面的腳本。

  4、手動釋放vuser技術

   上面講的都是自動控制vuser釋放的情況,但在實際使用過程中,也可以手動對vuser進行釋放,這涉及手動釋放vuser技術。

   手動釋放vuser的步驟:開始執行場景->選擇scenario->rendezvous->在場景運行過程中,release按鈕會變成可用狀態,這時可進行手動釋放,如圖5所示:

技術分享

圖5(手動釋放vuser)

三、 集合點與事務的關系

  在進行並發測試時需要設置集合點,同時為了獲得事務的響應時間必須添加開始和結束事務,一般呢是將集合點設置在開始事務代碼之前。原因如下:

1、集合點設置在開始事務代碼後面:當虛擬用戶運行到開始事務起點時,事務就開始統計時間,但是當第一個虛擬用戶到達集合點時,後面的虛擬用戶還沒有達到集合點,這樣第一個虛擬用戶就不得不等其他的虛擬用戶到達集合點後才能接著運行,但是虛擬用戶到達集合點之前事務一直在統計時間,並沒有暫停,那麽這個等待的時間還是事務的真實時間,真實的事務響應時間應該除去虛擬用戶之間的等待時間。

2、集合點設置在開始事務代碼前面:雖然需要待所有的虛擬用戶都到達集合點後才開始釋放虛擬用戶,但是此時事務並沒有開始計時,只有運行到開始事務代碼時才開始計時,這樣統計出來的時間值就不包含虛擬用戶,因為集合點的原因所浪費的等待時間。

四、附上為了設置集合點而錄制的腳本

技術分享
Action()
{
    //該腳本用於集合點設置的驗證
    web_url("WebTours", 
        "URL=http://127.0.0.1:1080/WebTours", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=", 
        "Snapshot=t2.inf", 
        "Mode=HTTP", 
        LAST);

    web_concurrent_start(NULL);

    web_url("header.html", 
        "URL=http://127.0.0.1:1080/WebTours/header.html", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=http://127.0.0.1:1080/WebTours/", 
        "Snapshot=t3.inf", 
        "Mode=HTTP", 
        LAST);

    web_url("welcome.pl", 
        "URL=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=http://127.0.0.1:1080/WebTours/", 
        "Snapshot=t5.inf", 
        "Mode=HTTP", 
        LAST);

    web_concurrent_end(NULL);

    web_concurrent_start(NULL);

    web_url("hp_logo.png", 
        "URL=http://127.0.0.1:1080/WebTours/images/hp_logo.png", 
        "Resource=1", 
        "RecContentType=image/png", 
        "Referer=http://127.0.0.1:1080/WebTours/header.html", 
        "Snapshot=t4.inf", 
        LAST);

    web_url("webtours.png", 
        "URL=http://127.0.0.1:1080/WebTours/images/webtours.png", 
        "Resource=1", 
        "RecContentType=image/png", 
        "Referer=http://127.0.0.1:1080/WebTours/header.html", 
        "Snapshot=t6.inf", 
        LAST);

    web_concurrent_end(NULL);

    web_concurrent_start(NULL);

    web_url("home.html", 
        "URL=http://127.0.0.1:1080/WebTours/home.html", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true", 
        "Snapshot=t7.inf", 
        "Mode=HTTP", 
        LAST);

    web_url("nav.pl", 
        "URL=http://127.0.0.1:1080/WebTours/nav.pl?in=home", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=http://127.0.0.1:1080/WebTours/welcome.pl?signOff=true", 
        "Snapshot=t8.inf", 
        "Mode=HTTP", 
        LAST);

    web_concurrent_end(NULL);

    web_url("mer_login.gif", 
        "URL=http://127.0.0.1:1080/WebTours/images/mer_login.gif", 
        "Resource=1", 
        "RecContentType=image/gif", 
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home", 
        "Snapshot=t9.inf", 
        LAST);

    web_concurrent_start(NULL);

    web_url("8afc2fe48db9060fe1bdda2089e1d950.png", 
        "URL=http://act.cmcmcdn.com/upload/201507/8afc2fe48db9060fe1bdda2089e1d950.png", 
        "Resource=1", 
        "RecContentType=image/png", 
        "Referer=http://127.0.0.1:1080/WebTours/", 
        "Snapshot=t10.inf", 
        LAST);

    web_url("3b491068507d8f85ea7b35d756da7215.png", 
        "URL=http://act.cmcmcdn.com/upload/201507/3b491068507d8f85ea7b35d756da7215.png", 
        "Resource=1", 
        "RecContentType=image/png", 
        "Referer=http://127.0.0.1:1080/WebTours/", 
        "Snapshot=t11.inf", 
        LAST);

    web_concurrent_end(NULL);

    lr_rendezvous("集合點");//集合點設置在開始事務代碼之前

    lr_start_transaction("login");

    lr_think_time(59);

    web_submit_data("login.pl", 
        "Action=http://127.0.0.1:1080/WebTours/login.pl", 
        "Method=POST", 
        "RecContentType=text/html", 
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?in=home", 
        "Snapshot=t12.inf", 
        "Mode=HTTP", 
        ITEMDATA, 
        "Name=userSession", "Value=121041.120453625zcczAfcpzDDDDDDDDHDfzpDVfi", ENDITEM, 
        "Name=username", "Value=test1", ENDITEM, 
        "Name=password", "Value=test1", ENDITEM, 
        "Name=JSFormSubmit", "Value=off", ENDITEM, 
        "Name=login.x", "Value=57", ENDITEM, 
        "Name=login.y", "Value=5", ENDITEM, 
        LAST);

    web_concurrent_start(NULL);

    web_url("nav.pl_2", 
        "URL=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=http://127.0.0.1:1080/WebTours/login.pl", 
        "Snapshot=t13.inf", 
        "Mode=HTTP", 
        LAST);

    web_url("login.pl_2", 
        "URL=http://127.0.0.1:1080/WebTours/login.pl?intro=true", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=http://127.0.0.1:1080/WebTours/login.pl", 
        "Snapshot=t18.inf", 
        "Mode=HTTP", 
        LAST);

    web_concurrent_end(NULL);

    web_concurrent_start(NULL);

    web_url("flights.gif", 
        "URL=http://127.0.0.1:1080/WebTours/images/flights.gif", 
        "Resource=1", 
        "RecContentType=image/gif", 
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home", 
        "Snapshot=t14.inf", 
        LAST);

    web_url("itinerary.gif", 
        "URL=http://127.0.0.1:1080/WebTours/images/itinerary.gif", 
        "Resource=1", 
        "RecContentType=image/gif", 
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home", 
        "Snapshot=t15.inf", 
        LAST);

    web_url("in_home.gif", 
        "URL=http://127.0.0.1:1080/WebTours/images/in_home.gif", 
        "Resource=1", 
        "RecContentType=image/gif", 
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home", 
        "Snapshot=t16.inf", 
        LAST);

    web_url("signoff.gif", 
        "URL=http://127.0.0.1:1080/WebTours/images/signoff.gif", 
        "Resource=1", 
        "RecContentType=image/gif", 
        "Referer=http://127.0.0.1:1080/WebTours/nav.pl?page=menu&in=home", 
        "Snapshot=t17.inf", 
        LAST);

    web_concurrent_end(NULL);

    lr_end_transaction("login",LR_AUTO);

    return 0;
}
集合點設置

IP欺騙技術

  因為筆者的電腦是自動獲取IP的,所以做不了IP欺騙,具體的設置IP欺騙步驟可以參考蟲師的博客:http://www.cnblogs.com/fnng/archive/2013/03/02/2940284.html

負載均衡技術

  為什麽測試機即負載發生器可能會成為瓶頸?這是由於負載 不均勻造成的。例如,在測試過程中使用4臺測試機作為負載發生器,虛擬用戶為500個,這時如果負載分配不均勻,可能出現這種現象,就是500個虛擬用戶從4臺中的兩臺測試機中產生,這樣就導致有兩臺機器特別忙,而另外兩臺機器就特別閑,這樣這兩臺特別忙的機器,其本身就可能成為瓶頸了。

  在默認的模式下,controller中添加多臺load generators機器時,不管如何添加,最終只能選中一臺機器,如圖6所示

技術分享

圖6(load generators機器設置,註:筆者的負載發生器只有本機)

  這樣的負載分配是不均勻的,為了解決這個問題,首先要更換場景模式,選擇scenario->convert scenario to the percentage mode命令,將場景模式由組模式更換為百分比模式,如圖7所示

技術分享

圖7(選擇多個負載發生器)

RTS設置

  關於多腳本RTS的設置方式有兩種:shared RTS和individual RTS。前者是表示所有運行的腳本都使用相同的RTS設置項,後者是指每個腳本單獨地設置其RTS內容。如圖8所示

技術分享

圖8(多腳本RTS設置)

  單擊shared rts或individual rts按鈕會彈出run-time settings對話框,主要關註pacing,log,think time,miscellaneous這4個選項的設置內容。如圖9所示

1)pacing:主要設置每次叠代之間的時間間隔,根據不同的測試目的,可以設置不同的時間策略;

2)log:主要設置回放腳本時收集的日誌方式,一般使用擴展日誌中的參數提交的方式;

3)think time:主要設置思考時間,關於思考時間也需要根據測試目的來確定;

4)miscellaneous:需要設置出錯時處理以及虛擬用戶是按進程還是線程運行。

技術分享

圖9(以shared rts為例的run-time setting窗體)

  後面還有兩個內容:執行路徑轉換與在loadrunner中使用功能測試腳本,個人覺得這兩個知識點暫時用不上,故不提及了,以後如果有必要再進行補充。

loadrunner提高篇-場景設計實踐