loadrunner生成隨機數


loadrunner生成隨機數

 
對網站注冊進行壓力測試時,需要對注冊的用戶名進行參數化,因為可以會用到大量的測試數據,所以選擇通過生成隨機數來進行參數化。最開始用loadrunner自帶的參數隨機功能,代碼如下:
 
"Name=RegForm[name]", "Value={NewParam}", ENDITEM,
 
參數化選擇為:random number 
loadrunner生成隨機數
 
因系統對用戶名的位數做了限制,同時為了方便統計,將代碼修改為:
 
"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生成唯一數
2009年02月17日 星期二 22:57
void Main()
{
    int
i;
    char uStr[64];
    srand( (unsigned)time( NULL ) );//
最好放在vuser_init里
    for (i=0;i<10;i++) {
       
GetUniqueString(i,uStr);
        lr_output_message(uStr);
   
}
}
void GetUniqueString(int inValue,char *outStr)
{
    int id,
scid;
    char *vuser_group;   
   
    lr_whoami(&id,
&vuser_group, &scid);
    web_save_timestamp_param("tStamp",
LAST);
   
sprintf(outStr,"%s%05d%010d%04d",lr_eval_string("{tStamp}"),id,rand(),inValue);
   
free(vuser_group);
}
    建議把隨機種子(srand( (unsigned)time( NULL )
);)放在腳本初始化函數里,只需要初始化一次。若放在子函數里,每次調用都初始化一下的話,產生的隨機數可能是一樣的。是不安全的代碼!這個唯一數,有四關:毫秒級的時間+虛擬用戶ID+隨機數+傳入的參數;基本上在同一個Controller里不會出現重復了!再稍微處理一下就可以得到想法的東西了,譬如:LoadRunner實現:計算字符串Md5
加密成md5串,再改裝一下就成GUID了!
   
這里有一個安全問題值得說明,隨機種子最好只初始化一次,隨機數的算法是和時間有一定關系的。若把隨機種子放在子函數里,你會發現生成出來的隨機數都是一樣的。
   
不要驚訝,為什么說是個安全問題,說嚴重一點,隨機數是一種算法,有可能被別人劫獲並計算出下一個隨機值,故不安全!
 


免責聲明!

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



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