zoukankan      html  css  js  c++  java
  • 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了!
       
    这里有一个安全问题值得说明,随机种子最好只初始化一次,随机数的算法是和时间有一定关系的。若把随机种子放在子函数里,你会发现生成出来的随机数都是一样的。
       
    不要惊讶,为什么说是个安全问题,说严重一点,随机数是一种算法,有可能被别人劫获并计算出下一个随机值,故不安全!
     
  • 相关阅读:
    GFS文件系统和在RedHat Linux下的配置
    FastDFS connect timed out
    大型高并发高负载网站的系统架构
    FastDFS 上传文件
    FastDFS常见命令
    FastDFS安装、配置、部署
    分布式文件系统FastDFS原理介绍
    Jenkins+Maven+Svn搭建持续集成环境持续集成和自动部署
    Java中的向上转型和向下转型
    Java中的final修饰符
  • 原文地址:https://www.cnblogs.com/qmfsun/p/4561524.html
Copyright © 2011-2022 走看看