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,
基本能滿足測試需求了,有空的話希望能找到更好的方法。
方法二:
int itera_num,rand_num,i;
char StrTable[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
char i_name[24]="";
char i_data[50]="";
char i_data2[24]="";
itera_num=rand()%24;
for (i=0;i<=itera_num;i++){
rand_num=rand()%62;
strncat(i_name,StrTable+rand_num,1);}
itera_num=rand()%50;
for(i=0;i<=itera_num;i++){
rand_num=rand()%62;
strncat(i_data,StrTable+rand_num,1);}
i=rand()%strlen(i_data)+1;
strncat(i_data2,i_data,i);
lr_save_string(i_name,"i_name_value");
lr_save_string(i_data,"i_data_value");
lr_save_string(i_data2,"i_data2_value");
Loadrunner隨機生成15位數字串
今天看到一個網友的問題,是想生成一個15位的數字串來進行參數化輸入,要求如下:
1、前4位均是0436
2、其余的是11位的隨機數
原帖地址:http://bbs.51testing.com/viewthread.php?tid=89018&page=1&extra=page%3D1
拿到問題,我思考了一下,前4位使用固定值很好辦,唯一的問題就是生成隨機數了;
生成隨機數而且用lr實現,目前我知道2種方法:
1、使用c語言的rand()函數
2、使用lr的參數類型中的random number來生成
因為要生成固定的位數,所以我決定使用lr的random number方法;另外也是我想到rand()函數實現起來非常麻煩,~解決問題為主。
我的回復如下:
##############
1、在參數表(Parameter List)中新建一個參數(Parameter),命名為"num"
2、選擇參數類型(Parameter type)為隨機數(Random Number),
3、選擇參數范圍(Parameter range)為最小為1,最大為99999999
4、在隨機數格式(Number format)里選擇“%08lu”
然后引用類似為:
web_sumbit_data(
……
……
"card_id=0436000{num}";
LAST);
說明:隨機數按照位數在c語言里不好實現,所以我選擇了lr的參數化來生成。但是lr的參數化里最多只能生成8位數字(這個我還不知道能不能改),所以你要求有11位數字的時候,我就把你要求的固定的"0436"變成了"0436000",這樣參數化以后就可以生成類似"043600012345678"的15位數字了。
##############
回復完畢,又仔細想想發現自己很傻,既然lr支持字符串和參數在一起被引用,那么為什么只用一個參數才解決呢?而且解決的也不徹底,還有3位數是固定值。。發現自己還真的很笨~~~~
更好的實現方法是創建2個或者多個隨機數類型的參數(Random Number Parameter),這樣,就能把隨機數的參數化位數增加到11位甚至更多;~想參數多少位就多少位,嘿嘿
還是以15位的這個問題來說吧:
如圖再增加一個隨機數.
然后引用方法類似:
web_sumbit_data(
……
……
"card_id=0436{num1}{num}";
LAST);
搞定!!
-
loadrunner 生成隨機數的函數
使用C代碼生成隨機英文+數字
int itera_num,rand_num,i;
char StrTable[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
char i_name[24]="";
char i_data[50]="";
char i_data2[24]="";
itera_num=rand()%24;
for (i=0;i<=itera_num;i++){
rand_num=rand()%62;
strncat(i_name,StrTable+rand_num,1);}
itera_num=rand()%50;
for(i=0;i<=itera_num;i++){
rand_num=rand()%62;
strncat(i_data,StrTable+rand_num,1);}
i=rand()%strlen(i_data)+1;
strncat(i_data2,i_data,i);
lr_save_string(i_name,"i_name_value");
lr_save_string(i_data,"i_data_value");
lr_save_string(i_data2,"i_data2_value");參看:http://boyqqq.spaces.live.com/blog/cns!D6AA33352019FC3E!149.entry?wa=wsignin1.0&sa=314044507
使用loadrunner自帶的函數random number生成隨機數字
1、在參數表(Parameter List)中新建一個參數(Parameter),命名為"num"
2、選擇參數類型(Parameter type)為隨機數(Random Number),
3、選擇參數范圍(Parameter range)為最小為1,最大為99999999
4、在隨機數格式(Number format)里選擇“%08lu”
然后引用類似為:
web_sumbit_data(
……
……
"card_id=0436000{num}";
LAST);當然也可以多個隨機參數一並合成一個
這時候使用就變成了
web_sumbit_data(
……
……
"card_id=0436{num1}{num}";
LAST);更詳細的可以參看:
http://www.51testing.com/?uid-6343-action-viewspace-itemid-19789
選擇不同的 Update value on 對應的執行效果:
方法四:
由於今天測試的一個項目,賬號是已經生成--是手機號,但是密碼是手機的后6位,因為這是游客登錄,而且這些手機號數據庫又沒有,所以密碼不能在數據庫修改,只能自己從生成的手機號中取后六位了。
在網上找了找也沒找到現成的函數,於是決定自己寫一個來處理,一下就是我寫的代碼:
Action()
{
char *phonenum;
int k=1;
phonenum=lr_eval_string("{Phone}");//參數化獲取的手機號碼
for (k=1;k<6;k++){//k=1標示從phonenum的指針第一位開始 k<6表示phonenum的坐標移到第6位
phonenum++;
lr_save_string(phonenum,"Passwd");//將移位后的phonenum保存到新的參數中作為密碼來使用
lr_output_message("手機號的后6位是:%s",lr_eval_string("{Passwd}"));//驗證保存的參數是否正確
return 0;
}
其實這些都是由以前參考過的guid函數啟發所想:
void guid(char * messageId)
{
int itera_num,rand_num,i,j,k=k+1;
char StrTable[]="abcdefghijklmnopqrstuvwxyz1234567890";
char string1[24]="";
char string2[24]="";
char string3[24]="";
char string4[24]="";
char string5[24]="";
char string5_temp[24]="";
char messageId[126]="";
char * conn = "-";
for (i=0;i<=7;i++){
rand_num=rand()%36;
strncat(string1,StrTable+rand_num,1);} //前8位的獲取
for (i=0;i<=3;i++){
rand_num=rand()%36;
strncat(string2,StrTable+rand_num,1);} //中間4位的獲取
for (i=0;i<=3;i++){
rand_num=rand()%36;
strncat(string3,StrTable+rand_num,1);}
for (i=0;i<=3;i++){
rand_num=rand()%36;
strncat(string4,StrTable+rand_num,1);}
for (i=0;i<=11;i++){
rand_num=rand()%36;
strncat(string5,StrTable+rand_num,1);}
strcpy(messageId, string1);
strcat(messageId, conn);
strcat(messageId, string2);
strcat(messageId, conn);
strcat(messageId, string3);
strcat(messageId, conn);
strcat(messageId, string4);
strcat(messageId, conn);
strcat(messageId, string5);
}