標籤:
loadrunner產生隨機數 對網站註冊進行壓力測試時,需要對註冊的使用者名稱進行參數化,因為可以會用到大量的測試資料,所以選擇通過產生隨機數來進行參數化。最開始用loadrunner內建的參數隨機功能,代碼如下: "Name=RegForm[name]", "Value={NewParam}", ENDITEM, 參數化選擇為:random number 因系統對使用者名稱的位元做了限制,同時為了方便統計,將代碼修改為: "Name=RegForm[name]", "Value=lr{NewParam}{NewParam1}{NewParam2}", ENDITEM, 注意參數化之後的值的最大位元不能超過系統限制,否則可能會提交錯誤的參數。參數化完成後載入情境運行測試,基本可以滿足壓力測試需求。 測試過程中發現仍會有部分失敗的交易,檢查日誌後發現因使用者名稱重複導致註冊失敗,為減少這種情況,嘗試了使用另外一種隨機數方法。代碼如下: int name_num,rand_num,i; char StrTable[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; char i_name[20]=""; srand((unsigned)time(NULL)); lr_log_message("srand is %d",srand((unsigned)time(NULL))); name_num=rand()% 20 ; lr_log_message("rand number is %d",name_num);for (i=0;i<=name_num;i++){rand_num=rand()% 62;strncat(i_name,StrTable+rand_num,1);} lr_log_message("the string is %s",i_name); lr_save_string(i_name,"i_name_value"); //儲存隨機數 ... "Name=RegForm[name]", "Value=lr{i_name_value}", ENDITEM, 修改完指令碼後,壓力測試時發現有大量的失敗,調試指令碼後發現會出現產生同個參數多次的情況,考慮是否是因為種子每次沒有初始化的緣故,將srand((unsigned)time(NULL));放在vuser_init()裡後,迴圈時就不會出現重複情況。後來一想乾脆就將這兩種方法結合起來: vuser_init(){srand((unsigned)time(NULL));return 0;} Action(){int name_num,rand_num,i; char StrTable[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; char i_name[20]=""; name_num=rand()% 20 ; lr_log_message("rand number is %d",name_num);for (i=0;i<=name_num;i++){rand_num=rand()% 62;strncat(i_name,StrTable+rand_num,1);} lr_log_message("the string is %s",i_name); lr_save_string(i_name,"i_name_value"); //儲存隨機數 ...... "Name=RegForm[name]", "Value=lr{NewParam}{i_name_value}", ENDITEM, 基本能滿足測試需求了,有空的話希望能找到更好的方法。 隨機函數的在Loadrunner中的一些的用法
有時我在這指令碼中需要隨機的取下拉式功能表或列表(list)中的值,那麼我們就要用到隨機數。下面就隨機數的用法舉例說明下.
執行個體一:
str=rand(); //產生任意隨機數 str=rand()%200 //產生最大值為200的隨機數 str=rand()%100+200 //產生200-300之間的隨機數
舉例:
int iRand;
Action()
{ srand(time(NULL)); //特別注意:加上這句,每次取不同的隨機值
iRand = rand()%100; if( 30>=iRand ) { lr_output_message("The value of iRand is:%d,iRand < 30",iRand); }
else { lr_output_message("The value of iRand is:%d,iRand > 30",iRand); }
return 0; }
執行個體二:
在關聯中的一點應用:(確定一個關聯中count的值)
web_reg_save_param("search_param", "LB=<p><A HREF=", "RB=>", "ORD=All"); ... search rand_selection = ( rand() % atoi(lr_eval_string("{search_param_count}")) + 1);
執行個體三:
產生一個新值(randselection)作為尾碼去(隨機)獲得尋找後的值
sprintf(my_new_parameter, "{search_param_%d}", rand_selection); 張卓然
一個Loadrunner 產生隨機字母的方法
char *randstring(int slen)
{
int i,randid;
char temp[100]="";
char character_set[52] = {‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘I‘, ‘J‘, ‘K‘, ‘L‘, ‘M‘, ‘N‘,‘O‘, ‘P‘,‘Q‘, ‘R‘, ‘S‘, ‘T‘,‘U‘, ‘V‘, ‘W‘, ‘X‘,‘Y‘, ‘Z‘,‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘, ‘i‘, ‘j‘, ‘k‘, ‘l‘,‘m‘, ‘n‘, ‘o‘, ‘p‘, ‘q‘, ‘r‘,‘s‘, ‘t‘, ‘u‘, ‘v‘, ‘w‘, ‘x‘,‘y‘,‘z‘};
for(i=1;i<=slen;i++)
{
randid=rand()%52;
sprintf(temp,"%s%c",temp,character_set[randid]);
}
return(temp);
}
如何調用該函數:
lr_save_string(randstring(5),"searching");
//調用randstring函數,產生5位長度的隨機字串
很簡單的一個方法,可以聯合一個loadrunner的方法來用 產生唯一隨機數。
如何想產生一個0到99的隨機數,可以使用:
int which; which=rand()%100;
這樣which的數字就是一個0到99的隨機數了
例如: 聯合lr_whoami 或者使用一個web_save_timestamp_param 獲得當前的時間戳記,這樣就可以做出一個唯一的參數值。
盡量不要使用lr內建參數化隨機取值,會大幅度降低負載發生器的效能。
lr如何擷取當前系統時間戳
一般使用time函數,擷取當前unix時間戳記
lr程式如下:
int t1;
char a[20];
t1=time();//擷取當前系統時間
//根據不同情況,將時間儲存成不同的參數類型
lr_save_int(t1,"time1");//將t1存成整形參數time1
sprintf(a,"%d",t1);//將t1存進數組a
lr_save_string(a,"time2");//將數組a存成字串參數time2
lr_output_message("目前時間是%s",lr_eval_string("{time1}"));
lr_output_message("目前時間是%s",lr_eval_string("{time2}"));
//後面的程式,可以將time1和time2代入不同的表單項中
LR中使用隨機數的三種方法
LR中獲得隨機數,大概有以下三種方法: 一、將變數參數化,使用LR內建的隨機參數模式,隨機匹配指定長度的數 二、定義變數,使用rand()函數 比如,int Num; Num=rand();//這樣就擷取了一個隨機數,但這個隨機數每次都不一樣 //如果需要擷取指定長度內的一個隨機數,比如從X到Y之間的隨機數,可以使用一下演算法 Num=rand()%(Y-X+1)+X //這樣就能得到包含X到Y之家的任何數 三、定義變數,使用srand函數 函數原型為:srand((unsighed) time(null)) 比如,int Num; Num=srand(time(null))
loadrunner產生隨機數