发布新日志

  • jmeter beashell调用java文件/class文件/jar包方法

    2022-04-16 11:55:53

    前提:
    elipse中的java建立一个项目,项目结构包括: 包名:com.test, 其中有一个java文件 beanShellPractice.java,  java文件中有一个方法:calSquare

    代码如下:
    package com.test;
    public class beanShellPractice {
    public  int calSquare(int i) {
    int b;
    b = i * i;
    return b;
    }
    public static void main(String[] args) {
    beanShellPractice beanShellPractice = new beanShellPractice();
             System.out.println(beanShellPractice.calSquare(20));
           }
    }


    1. jmeter中如何调用jar包
       1)elipse中打包,下一步,下一步即可。
       2)jmeter test plan首页,指定此jar的位置
       3)beanshell中的代码如下:
        import com.test.*;--- 引包,下面操作和java中调用某个方法完全一致

    int x;
    String y;
    beanShellPractice beanShellPractice = new beanShellPractice();
    x = beanShellPractice.calSquare(12);
    y = String.valueOf(x);
    System.out.println(y);
    log.info("y="+y);

    2. jmeter中如何调用java文件
        只需要将调用jar包中的第一行,import com.test.* 替换为   source("C:/Mywork/100_ScrpitDev/EclipseWorkSpace/beanShell/src/com/test/beanShellPractice.java");  用于指定java文件的位置

       其他后续代码, 和调用jar包的完全相同

    3. jmeter中如何调用class文件
       在调用jar包方法中的第一行前面,再添加一行,addClassPath("C:/Mywork/100_ScrpitDev/EclipseWorkSpace/beanShell/bin/com/test/beanShellPractice.class");  用于指定class文件的位置,

       其他后续代码, 和调用jar包的完全相同
     


  • Jmeter post请求将整个请求报文,以文件的方式传入

    2020-02-07 20:52:42

    背景,
    在Jmeter的post请求,一般是放在jmeter的body data中的。 jmeter提供了,可以将整个body中的内容,作为一个文件传给http request。

    代码如下:
    ${__FileToString(${path}\data/${fileName})}

    其中:
    ${path}变量是获取系统的当前工作目录,利用如下的函数可以获得系统的当前工作目录
    ${__BeanShell(import org.apache.jmeter.services.FileServer;FileServer.getFileServer().getBaseDir();)}

    实际Jmeter中的截图如下:
  • Jmeter beanshell追加写文件和覆盖写文件方法

    2020-02-07 20:48:25

    追加写文件代码:
    import org.apache.jmeter.services.FileServer;

    // Get the variable(s) from the JMeter script
    caseid =vars.get("caseid");


    // Open File(s)
    f = new FileOutputStream(FileServer.getFileServer().getBaseDir()+"\\output\\output.csv", true); 
    p = new PrintStream(f); 

    // Write data to file 
    p.println(caseid);

    // Close File(s)
    p.close();
    f.close();

    覆盖写文件代码:
    import org.apache.jmeter.services.FileServer;

    // Get the variable(s) from the JMeter script
    caseid =vars.get("caseid");


    // Open File(s)
    f = new FileWriter(FileServer.getFileServer().getBaseDir()+"\\output\\output.csv", true); 

    // Write data to file 
    f.write(caseid);

    // Close File(s)
    f.close();

  • Jmeter-Http request中发送大量参数的方法

    2020-02-07 19:19:21

    背景:
    我们在使用Jmeter发送HTTP请求时,有时候需要在“参数”tab中传入多个变量以及值。如下图是真实的项目案例,参数达到220多个,一个一个复制粘贴,非常的费时费力。



    那如何解决这个问题呢?

    强大的Jmeter在上面截图的下方,有个“add from clipboard”按钮,点击这个按钮可以帮忙一次性将220个变量以及对应的值添加进入参数列表。
    操作步骤如下:
    1)将需要填入的变量以及变量值,修改为如下的形式:
    username=baokey
    password=pwd@123
    userage=12
    usersalary=23

    备注:变量与变量值之间用“=“连接。
    2)拷贝步骤1)中的变量以及变量值
    3)点击jmeter中的“add from clipboard”按钮,步骤1)中准备的变量以及变量值,就会被自动拷贝进入jmeter的参数列表。


  • Jenkins安装please wait while jenkins is restarting- 问题解决

    2019-09-13 11:37:47

    安装Jenkins过程中,显示:please wait while jenkins is restarting....
    解决方案如下:
    进入jenkins的工作目录,默认是:C:\Program Files (x86)\Jenkins

    打开 hudson.model.UpdateCenter.xml 
    把 http://updates.jenkins-ci.org/update-center.json 
    改成 http://mirror.xmission.com/jenkins/updates/update-center.json

    然后重启jenkins服务后,问题解决
  • Jmeter调用web service接口

    2018-09-30 10:36:48


    有两种方式:

    第一种: SOAP/XML-RPC Request
    Jmeter中的设置如附件1所示
    附件1中的Soap Action从哪里来的,见附件2。 即:将链接打在浏览中按回车后,在浏览器中查找Soap Action后所得。

    第二种:Http Request
    见附件3的详细描述
  • LOADRUNNER11如何调用Jar包进行压力测试

    2017-02-28 15:46:45

    LOADRUNNER11如何调用Jar包进行压力测试

    自己根据其他网友的帖子,结合自己的项目,实践后写的攻略,分享给大家。
  • LOADRUNNER11如何调用Jar包进行压力测试

    2017-02-28 15:43:22

    LOADRUNNER11如何调用Jar包进行压力测试

    1. 删除电脑原有的JDK的其他版本,只安装JDK1.6 u30, 配置path如下:

      右键我的电脑àpropertiesàadvanced system settingsàenvironment variables, 加入

      如:C:\Program Files (x86)\Java\jdk1.6.0_30\bin

    2. LoadRunner11选择Java Vuser协议,如下图

    3. 打开LoadRunner 11run time setting界面, F4即可打开此界面。

      1)设置ClassPath

      点红色框的按钮,添加红色的三个JAR包,其中第三个jar包即被测试(调用)的JAR

      点兰色框的按钮,添加蓝色的一个路径

       

     

     

     

     

     

    2)设置Java VM

           查看(3508) 评论(0) 收藏 分享 管理

  • Selenium-Webdriver 自动截图的方法

    2013-12-16 15:51:11

    如下是Webdriver 自动截图的方法, 然后再主程序中或者需要用到截屏的地方调用如下方法(takeScreenShot)即可。

     

        import java.io.File;   

        import java.io.IOException;   

        import java.util.Calendar;   

        import org.openqa.selenium.OutputType;   

        import org.openqa.selenium.TakesScreenshot;   

        import org.openqa.selenium.WebDriver;   

        import com.google.common.io.Files;   

          

        public class ScreenShot {   

               static Calendar ca = Calendar.getInstance();

               static int day=ca.get(Calendar.DATE);//获取日   

               static int minute=ca.get(Calendar.MINUTE);//   

               static int hour=ca.get(Calendar.HOUR);//小时   

               

               public static void takeScreenShot(String name,WebDriver driver) {   

                      String data=day+"_"+hour+"_"+minute;   

                      File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

              

               try {   

                      Files.copy(scrFile, new File("d:\\webdriver\\" +data+name+".jpeg"));

                      System.out.println("截图成功!");     

               }

               

               

                catch (IOException e) {   

                      e.printStackTrace(); 

                   }

              

                }   

        }

  • Selenium-启动Firefox代理的代码

    2013-12-16 14:43:07

    有时候需要设置Firefox的代理,才能访问被测试的网站。
     
     
      String proxyIp = "10.158.140.94";
      int proxyPort = 80;
      FirefoxProfile profile = new FirefoxProfile();
      // 使用代理
      profile.setPreference("network.proxy.type", 1);
      // http协议代理配置
      profile.setPreference("network.proxy.http", proxyIp);  
      profile.setPreference("network.proxy.http_port", proxyPort);
      
      profile.setPreference("network.proxy.ssl", proxyIp);  
      profile.setPreference("network.proxy.ssl_port", proxyPort);
        
      // 所有协议公用一种代理配置,如果单独配置,这项设置为false
      profile.setPreference("network.proxy.share_proxy_settings", true);
        
      // 对于localhost的不用代理,这里必须要配置,否则无法和webdriver通讯
      profile.setPreference("network.proxy.no_proxies_on", "localhost");
        
      // 以代理方式启动firefox
      FirefoxDriver driver  = new FirefoxDriver(profile);
  • 中层管理人员应具备的素质

    2008-12-21 20:06:04

    麦肯锡公司的一项调查表明:有的公司能保持持续发展和改革,达到更高的业绩,关键的因素不在于高级管理者,而在于一批具有改革才能的中层管理者和专业人才。 可见中层管理人员在企业中起中流砥柱的作用,他们不同于一般员工,他们的素质高低,在很大程度上影响一般员工的职业行为。甚至关系企业发展的成败,因此对中层管理者的素质,要有更高层次的特殊的要求。

    虽然不同规模的企业在不同的发展阶段,中层管理者所需要的的素质也不尽相同,但有一些素质是每一位中层管理者所必须的:如主动性、执行力、关注细节、影响力、培养他人的能力、带领团队的能力以及专业知识与技能。

    一、主动性

    主动性是指管理者在工作中不惜投入较多的精力,善于发现和创造新的机会,提前预计到事情发生的可能性,并有计划地采取行动提高工作绩效、避免问题的发生、或创造新的机遇。

    不能积极主动地前进,不敢为人先,集体的成绩就会受到限制。如果中层管理者不能对企业的总体绩效产生积极的推动作用,就是在为自己的事业自掘坟墓。衡量中层管理者工作成效的标准之一就是要看其个人主动发起的行动数量。在这一点上,中层管理者与冲浪运动员颇为相似。冲浪者只有赶在浪潮前面,才能够精彩地冲向岸边。而如果每次都慢半拍,就只能在海里起起落落,等待下一波浪涛的到来。走在时代前列需要真正的努力与积极性。

    吴兵是一家大型家用电器公司新上任客服经理,他们的产品虽然是家庭必需品,但销售量不温不火,增长平缓。除了促销、降价和折扣,公司对如何刺激销售几乎无计可施。

    吴兵不安于现状,他仔细调研企业内部的问题并不断考察和分析竞争者的现状,认定如果改善员工在服务质量上、专卖店在销售业绩上的差距,找一种方法使两方面的强项相结合,就有可能增加销售量。

    他把一流的客服代表集合在一起进行产品和物流方面的培训,然后建立了一个电话营销中心,来为他们的专卖店服务。顶级的专卖店超过销售指标26%,每年比没有加入专卖店电话计划的一般专卖店多销售100万美元的产品。

    二、执行力

    曾任宝洁(中国)有限公司广州人力资源部经理的许锋认为,执行力是最容易出问题的地方,也是中层管理者必须具有的能力。高层很多时候考核他们的时候都是衡量自己的决策能否被中层管理者很好地贯彻到基层。

    从《执行力》一书卖的火暴异常的情况来,很多的企业都面临着执行不到位的问题。好的产品要好的策划,好的策划要好的执行,好的执行要好的团队,好的团队要好的中层管理者。执行力的强弱,是衡量一个团队战斗力强弱的重要依据,也是中层管理者胜出的一个要素。个人执行力是团队执行力的基础,而基础的关键是中层管理者的执行力。中层管理者作为地方区域的决策者、领导者,承上启下,非常的重要。作为总部、你的上级,他们的决策、行销推广方案下来了,都希望得到100%的执行,如果你及你的团队在执行的过程中,常是打折,他们是怎样想的?还会提拔重用你吗?怕更多的是怀疑你的能力,更换你吧。

    上海某影视文化广告公司的中层经理吴先生曾经在工作中遇到这样一件事:有一段时间,公司的大型项目比较集中,为数不多的制片忙得不亦乐乎,于是吴经理启用了后备人员担任制片的角色,但因为后备人员没有经验,导致很多环节都出了纰漏,而且由于年纪轻,他也未能重视和导演之间沟通的重要性。

    在此情况下,吴经理开始进行类似于信息管理的工作,将大型项目制片的工作流程、职责以及与相关人员必要的协调工作整理下来,固化成表格;同时安排“老”制片对新人传、帮、带,以使其尽快领会制片工作的要义。最后,项目圆满完成。

    吴经理在此过程中,起到了使责权清晰,明确每个人自己应该做什么的作用。实际上,领导的执行力就在于使员工们做得更出色。

    三、关注细节

    任何事情从量变到质变都不是一个短暂的过程,如果中层管理者没有持之以恒的“举轻若重”,做好每一个细节的务实精神,就达不到“举重若轻”的境界。

      有一家著名出版社的中层主管,希望该出版社在出版界的某一特定领域占据支配地位,经过上级领导的同意,他决定以相当可观的价格购买一家比较小的出版社。该主管急于推行这一购买活动以确保出版社在市场中的重要地位,因此给手下施加压力,让他们在没有做好细致的准备之前就仓促上阵,他说道:"我们以后能清除那些细节。"

    然而,他手下的快速行动忽略了一个不能被忽略的细节。数以千计的顾客订购了这家出版社的产品,出版社订单在握,这很好;帐单及时开出,这也很好。但是只有20%的客户支付了货款,不知是什么原因,有人忘记了检查货款回收率。这件事情不是被有意隐瞒的,而是被淹没在其它大量琐碎的财务细节中,这样,非但不能使整个战略产生预期效果,而且其造成的损失妨碍了出版社几年内的其它投资。

    如果管理者认为宏图大略才是当务之急,那么此想法将会诱使他相信所有的细节不值得关注。但与此同时,也将有一大堆“小事”带来一连串麻烦,导致他的重大机会被破坏,直至化成泡影。

    四、影响力 

    如果说传统意义的领导主要依靠权力,那么现代观点的领导则更多是靠其内在的影响力。一个成功的领导者不是指身居何等高位,而是指能够凭借自身的威望、才智, 把其他成员吸引到自己的周围, 取得别人的信任, 引导和影响别人来完成组织目标的人。并且使组织群体取得了良好绩效。领导者的影响力日渐成为衡量成功领导的重要标识。

    一个拥有充分的影响力的中层领导者, 可以在领导岗位上指挥自如、得心应手, 带领队伍取得良好的成绩;相反, 一个影响力很弱的领导者, 过多地依靠命令和权力的领导者, 是不可能在分队中树立真正的威信和取得满意的领导效能的。

    张瑞敏曾被入选大陆唯一的“最具影响力的商界领袖”,他的影响在于让员工形成不断变革的意识。海尔集团的员工都有这样一种感觉,刚跑完 100 米,一口气没歇又要继续往前跑,永远不会有“日出而作,日落而息”的安逸感觉。

    五、培养他人的能力

    美国GE公司总裁韦尔奇认为,企业领导必须“忙碌”一些有意义的工作。韦尔奇说:“有人告诉我,他一周工作90小时以上。我对他说:‘你完全错了!请写下20件每周让你忙碌90小时的工作,进行仔细的审视。你将会发现,其中至少有10项工作是没有意义或可以请人代劳的’。开诚布公地说,我就特别反感形式主义。有的企业领导赞美‘勤奋’而漠视‘效率’、追求‘数量’而不问‘收益’。‘勤奋’对于成功是必要的,但它只有在‘做正确的事’与‘必须亲自操作’时才有正面意义。我们不妨在‘勤奋’之前先问问自己:这件事是必须要做的吗?是必须由我来做的吗?”韦尔奇认为,企业的领导应当抽出一定的时间与精力去寻找合适的经理人员并激发他们的工作动机。他强调,有想法的人就是英雄。他的主要工作就是去发掘出一些“很棒的想法”,然后“完善它们”,并且“以光速将它们扩展到企业的每个角落”。他坚信,自己的工作就是:一手拿着水罐,一手拿着化学肥料,让所有的事情都变得枝繁叶茂。

    优秀的中层管理者更多的关注员工的潜能的开发,鼓励和帮助下属取得成功。安排各种经历以提高他的能力,帮助他成长。

    松下公司的领导者认为,如果指示太过详尽,就可能使部属养成不动脑筋的依赖心理。一个命令一个动作地机械工作,不但谈不上提升效率,更谈不上培养人才。在训练人才方面,最重要的是引导被训练者反复思考、亲自制定计划策略并付诸实行。只有独立自主,才能独当一面。对中层管理者而言,最重要的工作就是启发部属的自主能力,使每一个人都能独立作业,而不是成为惟命是从的傀儡。

    某公司的中层经理说:“我经常将一些非常重要的会议交给我的高级助理去主持,这样在我到会或者不到会的时候,会议都可以正常地进行,其他部门地经理都能将他们地问题反映给我地助理,他也能够基本按照我地意思现场处理某些急需决策地事务,我认为这对于我地助理来说就是最好地培训。

    六、带领团队的能力

    管理从来不是一个人的事情,富有发展潜质的中层管理者表现出团队取向的工作风格,他们乐于协同作战,在实际管理工作中,他们是“领头雁”,是足球场上的“灵魂人物”;他们善于营造一种团队协作、平等沟通的文化氛围;他们坚信1+l不等于2,善于运用头脑风暴放大集体的智慧;他们以开放的心态欢迎批评、面对冲突,从来不放弃寻找最好的问题解决办法;他们彼此欣赏,鼓舞士气,关注团队成员的共同发展。

    团队合作对中层管理者的最终成功起着举足轻重的作用。据统计,管理失败最主要的原因是中层管理者和同事、下级处不好关系。

    某公司有两位刚从技术工作提升到技术管理职位的年轻管理者:A经理和B经理。

    A经理觉得责任重大,技术进步日新月异,部门中又有许多技术问题没有解决,很有紧迫感,每天刻苦学习相关知识,钻研技术文件,加班加点解决技术问题。他认为,问题的关键在于他是否能向下属证明自己在技术方面是如何的出色。

    B经理也认识技术的重要性和自己部门的不足,因此他花很多的时间向下属介绍自己的经验和知识;当他们遇到问题,他也帮忙一起解决,并积极地和相关部门联系和协调。

    三个月后,A经理和B经理都非常好地解决了部门的技术问题,而且A经理似乎更突出。但半年后,A经理发现问题越来越多,自己越来越忙,但下属似乎并不满意,觉得很委屈。B经理却得到了下属的拥戴,部门士气高昂,以前的问题都解决了,还搞了一些新的发明。

    对管理者而言,真正意义上的成功必然是团队的成功。脱离团队,去追求个人的成功,这样的成功即使得到了,往往也是变味的和苦涩的,长期是对公司有害的。因此,一个优秀的中层管理者决不是个人的勇猛直前、孤军深入,而是带领下属共同前进。

    以上所提到的有关中层管理者的素质模型是适用于任何性质和规模的企业的,而最基础的,也是每个中层管理者必须拥有的素质——专业知识与技能则每个企业有不同的标准和要求。

    掌握所需的专业知识与技能是从事管理类工作的基本要求。它是发挥管理者的素质作用的基础,包括在对未来的发现进行预测的基础上制定有挑战性的目标;有效地培养人才;在下属和团队中树立影响与权威等。每个中层管理者可以根据不同的行业性质、自身需求进行有针对性的专业知识与技能的学习与积累。包括财务知识、行业知识;专业知识、产品知识、商务经营管理知识和一些行业的相关法律、规定和规则方面的知识。

  • 动态数组定义

    2007-08-12 13:35:15

    我们将一个字符串"abcdefghi"的值每两位截取后,放入动态数组中str1,截取到最后若只剩余一个字符,也将其放入数组str1中。

    如:"ab" 放入str1[0]; "cd"放入str1[1];"ef"放入str1[2]......到了最后剩余一个"i",也放入数组str1[4]中。 

    具体的代码如下:

       int i,j,len_rest;           //len_rest定义要被截取的字符串在每次截取后的剩余长度
       char temp[30],*str1[30],str1_temp[30];

       strcpy(temp,"abcdefghi");

        //动态定义数组str1之前分配空间
     for (i=0; i<10; i++)
     str1[i]=(char *)malloc(sizeof(char)*100);
     
        len_rest=strlen(temp);
        for (i=0;i<7;i++) {
           if (len_rest<1)     //若被截取的字符串的剩余长度小于1,就推出循环;
       i=100;
           else{
        j=2*i;
           strncpy(str1[i],&temp[2*i],2); //将截取的两位字符串动态赋值给数组str1;
           lr_output_message("在数组str1中的元素是:%s",str1[i]);
           len_rest=strlen(temp)-2*(i+1); //每成功放入两个字符之后,将len_rest的值减去2;
        }
        }

  • 回答网友提问:参数化编程

    2007-08-12 10:35:12

    问题:
    我需要做参数化输入
    假设有2个字段: customid和planid,一个customid下有多个planid,
    我需要对customid和planid都做参数化输入,即顺序取一个customid,再随机在这个customid里取一个planid
    但是planid要跟着customid变化
    这是否是关联的问题?
    怎么解决? 思路即可.

    解决的代码:
    Action()
    {
       int i,j,k,rnum;
       char costomid[30];
       char combin_planid[30],planid_temp[30],planid[30];


       //先从costomid_single中顺序取一个costomid;
       strcpy(costomid,lr_eval_string("{costomid_single}"));
       lr_output_message("costomid=%s",&costomid);

       //在combinid.dat中寻找相同costomid的个数;
       j=0;
       strcpy(combin_planid,"#");
       for (i=1;i<10;i++) {
             if (strcmp("end",lr_eval_string("{costomid}"))==0)
               i=1000;
             else
          if (strcmp(costomid,lr_eval_string("{costomid}"))==0){
                     j=j+1;
             strcat(combin_planid,lr_eval_string("{planid}"));
             strcat(combin_planid,"#");
               }
         lr_advance_param("costomid");
       }
       lr_output_message("和%s相同的costomid的个数是=%d",&costomid,j);

       //处理字符串,找出随机的那个planid
       rnum = rand() % j;
       lr_output_message("随机数是:%d",rnum);
       k=0;
       strcpy(planid_temp,"");
       strcpy(planid,"");
       for (i=0;i<50;i++) {
         strncpy(planid_temp, &combin_planid, 1);
             if (strcmp("#",planid_temp)==0)
                k=k+1;
             if (k-rnum-1==0)
                    strcat(planid,planid_temp);
       }
       strncpy(planid,&planid[1],10);

       lr_output_message("你要用的参数costomid=%s,planid=%s",costomid,&planid);


            return 0;
    }
  • [论坛] 参数表中select next row和update value on的设置

    2007-08-06 17:43:46

    LR的参数的取值,和select next row和update value on的设置都有密不可分的关系。 下表给出了select next row和update value on不同的设置,对于LR的参数取值的结果将不同,给出了详细的描述。

    Select next row Update Value on 实际运行结果
    sequential each iteration 在某次循环中所有用户取值相同。
    所有用户第一次循环取第一行值,第二次循环取第二行值
      each occurrence 在某次循环中或者脚本中使用参数的地方,所有用户取值相同。
    脚本中出现要使用参数的话,参数值就更新一次,循环一次值再更新一次。
      once 在所有的循环中所有用户取值相同。
    所有的用户所有的循环中,只用一个值(即参数中的第一行值)
         
    random each iteration 不同的用户,在不同的循环次数中,随机取值
      each occurrence 不同的用户,脚本中出现要使用参数的话,随机取值一次,循环一次再随机取值一次
      once 不同的用户,不管循环多少次,只随机取值一次。
         
    unique each iteration 若选择手工自配参数,那LR按照每用户几个参数先分配参数,然后进行循环。
    若选择自动分配参数:
    Controller中edit schedule中run until comletion:按照循环次数先分配第一个VU(例如设置的循环次数为3,那分配给第一个VU 3个参数值),然后接下来的3个参数值分配给第二个VU,依次类推…...
    Controller中edit schedule中run for:若选择自动分配,LR将按照用户数均分参数,剩余的参数不使用。
      each occurrence 只能手工分配用户,给每个用户分配好X个参数后,在脚本中有参数的地方,就使用已经分配好的X个参数。
      once 按照用户数分配给每个用户分配一个参数而已。以后的循环这个用户就使用这一个参数

  • 参数表中when out of values的意义

    2007-08-06 17:41:26

    WHEN OUT OF VALUES是指在每个用户分配到一定数量的参数后,在LR循环运行的时候, 当某个用户的参数不够的时候,LR将按照设置的WHEN OUT OF VALUES的值进行处理。


    举个例子:
    现有一参数,名为:emp_no, 有四个值: E01,E02,E03,E04
    现有一场景,三个虚拟用户,分别为:U1,U2,U3
    LR参数列表设置:unique + each iteration+ allocate 2 values for each vuser

    在场景运行的时候,
    1. LR会先做一件事情-参数分配,假设参数分配的方式是手工分配,allocate 2 values for each vuser.
        分配的结果是: U1-E01,E02;     U2-E03,E04;     U3-无参数;

    [备注:若选择了自动分配参数。那将遵循以下的原则:
    Controller中edit schedule中选择了run until comletion:按照循环次数先分配第一个VU(例如设置的循环次数为3,那分配给第一个VU 3个参数值),然后接下来的3个参数值分配给第二个VU,依次类推…...
    Controller中edit schedule中选择了run for:若选择自动分配,LR将按照用户数均分参数,剩余的参数不使用。]

    2. 在运行开始后,U3将会FAILED. 因为没有参数分配给他。其他的两个虚拟用户正常运行,但是其他的两个用户,每个用户只有两个参数,只能保证他们循环两次而已。
    当他们运行到第三个循环的时候,他们已经没有参数可以用了。 怎么办呢? 这个时候,LR将按照设置的WHEN OUT OF VALUES的值进行处理。我们拿虚拟用户U1来举例说明。

    如果when out of values=abort vuser, U1在第三次循环的时候将会退出执行。

    循环次数  虚拟用户   使用参数值 运行状态
    1 U1 E01  正常运行
    2 U1 E01  正常运行
    3 U1 / 退出运行


    如果when out of values=continue in a cyclic manner, U1在第三次循环的时候将会开始循环利用他的参数值E01, 第四次循环使用E02…….

    循环次数  虚拟用户   使用参数值 运行状态
    1 U1 E01  正常运行
    2 U1 E02 正常运行
    3 U1 E01  正常运行
    4 U1 E02 正常运行
    5 U1 ….. …..


    如果when out of values=continue with last value, U1在第三次循环的时候使用最后的一个参数即E02, 第四次继续使用E02…….

    循环次数  虚拟用户   使用参数值 运行状态
    1 U1 E01  正常运行
    2 U1 E02 正常运行
    3 U1 E02 正常运行
    4 U1 E02 正常运行
    5 U1 ….. …..

  • 利用数组处理字符串

    2007-08-04 09:12:24

    直接用LR的函数+数组的方式完成字符串中某几位的截取。
    现有一个字符串:"ABCDEFG", 现要从第三位开始,连续取两位字符,即"DE"! 取值代码如下
      char array1[20];
      char array2[20];

      strcpy(array1,"ABCDEFG");
      strncpy(array2,&array1[3],2);      //&array1[3]表示的值是:"CDEFG"
      lr_output_message("Value is:%s", array2);
  • 利用指针处理字符串

    2007-08-04 09:07:57

    我将字符型变量赋值给指针,数组赋值给指针,同样数据类型的指针相互赋值,常量字符串赋值给指针都罗列了一下。

    point_01()
    {
              int k;
                     char *point1, *point2;
                     char str1;
                     char  array1[300];
                     char  result1[300],result2[300],result3[300],result4[300];

    /* 相同类型的指针之间的赋值,将指针point1已经有的值赋给指针point2; */
                       point1="ABCDEFGH";
                       point2=point1;
                       for (k=1;k<3;k++)
                              {
                              point2++;
                              }
                     strncpy(result1,point2,3);
                     lr_output_message( "指针相互赋值的结果result1=%s",result1);
                   
                   
    /*变量的值赋给相同数据类型的指针*/
                 str1='S';//注意:使用char型变量,只能定义一个字符。
                      point2=&str1;
                       for (k=1;k<1;k++)
                              {
                              point2++;
                              }
                     strncpy(result2,point2,3);
                     lr_output_message( "变量赋值给指针的结果result2=%s",result2);

    /* 把数组的值赋予指向数组的指针变量,array1 为数组,将其值赋予指针point1; */
            strcpy(array1,"helloloadrunner");
                    point1=array1;
                     for (k=1;k<3;k++)
                      {
                      point1++;
                      }
                    strncpy(result3,point1,3);
                    lr_output_message( "数组赋值给指针的结果result3=%s",result3);

    /*把字符串赋予指向字符类型的指针变量, 将字符串"youareboy"赋值给指针point1;*/
                       point1="youareboy";
                       for (k=1;k<3;k++)
                              {
                              point1++;
                              }
                     strncpy(result4,point1,3);
                     lr_output_message( "字符串赋值给指针的结果result4=%s",result4);

            return 0;
    }
  • 参数设置unique+each iteration中自动分配、手工分配block的区别

    2007-08-03 21:55:54

     

    第一种方法:

      假如你有两个用户分别为用户A,用户B。假如你的参数为emp_name有20行数据("1","2',"3","4".........."20")
    那么按照这种设置以后,在Loadrunner的controller运行的时候,LR会分配给用户A,用户B如下的参数。
    用户A:emp_name参数列表中的第一行:即例子中的"1";
    用户B:emp_name参数列表中的第二行;即例子中的"2"

    不管controller中运行多少个iteration,或者持续运行多长时间。 用户A始终使用参数"1",用户B始终使用参数"2".


    第二种方法:

      假如你有两个用户分别为用户A,用户B。假如你的参数为emp_name有20行数据("1","2',"3","4".........."20")
    那么按照这种设置以后,你设置了给每个用户分配2个参数值。那么在Loadrunner的controller运行的时候,LR会分配给用
    户A,用户B如下的参数。
    用户A:emp_name参数列表中的第一,二行:即例子中的"1",“2”。
    用户B:emp_name参数列表中的第三,四行;即例子中的"3",“4”。
    不管controller中运行多少个iteration,或者持续运行多长时间。 用户A始终使用参数"1""2", 用户B始终使用参数"3""4"。 

    当然,假如你有5个虚拟用户的话,每个用户分配的参数如下:
    用户A:"1","2"
    用户B:"3","4"
    用户C:"5","6"
    用户D:"7","8"
    用户E:"9,"10"

  • 参数列表update value on=each occurrence/each iteration/once的区别

    2007-08-03 21:42:56

    假如你的代码是这样的:
       
              web_submit_form("reservations.pl",
                    "Name=depart", "Value=
    {depart_city}", ENDITEM,
                    "Name=departDate", "Value=06/20/2007", ENDITEM,
                    LAST);

            web_submit_form("reservations.pl_2",
                   
          "Name=depart", "Value={depart_city}", ENDITEM,
                    "Name=reserveFlights.x", "Value=81", ENDITEM,
                    LAST);
    再假设参数列表中这个参数depart_city的值是:上海
                                                                   
    北京
                                                                   
    重庆
                          西安
                          合肥

    这段代码中两个地方都用到了{depart_city}, 关于这个参数的调用是如何的呢?关键取决于你自己在参数列表中对于这个参数的设置。
    假如你的设置是:
      A. update value ōn=each occurrence
          
    在第一个循环中,第一段代码web_submit_form("reservations.pl"....... depart_city="上海"
              第二段代码web_submit_form("reservations.pl_2".....depart_city="北京"

          
    在第二个循环中,第一段代码web_submit_form("reservations.pl"....... depart_city="重庆"
              第二段代码web_submit_form("reservations.pl_2".....depart_city="西安"
         
          
    在第三个循环中,第一段代码web_submit_form("reservations.pl"....... depart_city="合肥"
          ........................................................................
          
    如果参数不够用的时候,怎么办呢?那就看你参数列表中另外一个设置when out of value怎么设置呢? 这里先不谈。

      B. update value ōn=each iteration
          
    在第一个循环中,第一段代码web_submit_form("reservations.pl"....... depart_city="上海"
              第二段代码web_submit_form("reservations.pl_2".....depart_city="上海"

          
    在第二个循环中,第一段代码web_submit_form("reservations.pl"....... depart_city="北京"
              第二段代码web_submit_form("reservations.pl_2".....depart_city="北京"
         
          
    在第三个循环中,第一段代码web_submit_form("reservations.pl"....... depart_city="重庆"
          ..............................................................................

      C. update value ōn=once
          
    在第一个循环中,第一段代码web_submit_form("reservations.pl"....... depart_city="上海"
              第二段代码web_submit_form("reservations.pl_2".....depart_city="上海"

          
    在第二个循环中,第一段代码web_submit_form("reservations.pl"....... depart_city="上海"
              第二段代码web_submit_form("reservations.pl_2".....depart_city="上海"
         
          
    在第三个循环中,第一段代码web_submit_form("reservations.pl"....... depart_city="上海"
          ..............................................................................

  • 三种常用的文本检查web_reg_find的方法

    2007-08-03 21:38:50

    1.       将脚本切换到树结构,在page view页面上找到你要check的文本内容, 并执行鼠标邮件,选择copy selection.

    2.       将脚本切换回代码界面, 在光标闪烁的上行,添加如下的代码:

    备注:光标闪烁的上行: 若光标闪烁行为第10行,那光标闪烁的上行为第9行。

    添加的代码根据你检查的方式不同而不同, 你可以选择其中之一即可。

    代码一:

    web_reg_find("Text=Payment Details",LAST); 

    代码思路:

    1.“Payment Details” 为你要检查的文本;

    2. 脚本执行到此处,若在页面上找到了这几个字符串,那脚本继续执行下去;若没有找到,脚本将在此报错并且结束。

     

    代码二:

     web_reg_find("Text=Payment Details", "SaveCount=para_count", LAST); //check 的函数

    web_submit_form("reservations.pl_2",           //check的页面的录制时的代码

               "Snapshot=t22.inf",

               ITEMDATA,

               "Name=outboundFlight", "Value=003;0;06/23/2007", ENDITEM,

               "Name=reserveFlights.x", "Value=61", ENDITEM,

               "Name=reserveFlights.y", "Value=2", ENDITEM,

               LAST);

    if (atoi(lr_eval_string("{para_count}"))>0)        //验证是否找到了页面上的要检查的字符串

        lr_output_message("we find the string!");

     else

    lr_output_message("sorry,don't find the string!");

       代码思路:

    1.“Payment Details” 为你要检查的文本;

    2. 脚本执行到此处,不管页面上是否存在你要检查的字符串,脚本都不会报错,而是执行下去。

    3. 此段代码将找到的你要检查的字符串的个数,存为一个参数。 然后在页面代码的后面,通过检查这个参数的值是否大于0,来判断是否找到了你所要检查的字符串。

     

    代码三:

           A. web_reg_find("Text=Payment Detdils", "Fail=NotFound",LAST);或者

       B. web_reg_find("Text=Payment Detdils", "Fail=Found",LAST);

       代码思路:

    1.“Payment Details” 为你要检查的文本;

    2. 若是A代码:脚本执行到此处,若没有找到check的字符串,脚本将FAIL 并且停止执行下去。反之,则一直执行下去。

    3. 若是B代码:脚本执行到此处,若找到check的字符串,脚本将FAIL 并且停止执行下去。反之,则一直执行下去。

211/212>
Open Toolbar