日历

« 2008-12-05  
 123456
78910111213
14151617181920
21222324252627
28293031   

统计信息

  • 访问量: 4933
  • 日志数: 48
  • 图片数: 3
  • 建立时间: 2007-05-22
  • 更新时间: 2008-11-10

RSS订阅

昨晚,猪猪做了一个梦,梦见自己长了一双天使的翅膀,带着她飞翔,飞阿飞啊,不知道飞了多久,翅膀把猪猪带到了美丽的城堡,那就是猪猪的家,猪猪的梦开始的地方,呵呵。。。

我的最新日志

  • LoadRunner中参数的设置

    2008-11-10

    LoadRunner中参数的设置

     

    参数个数:10

    tester1tester2tester3 tester10

    迭代次数:2

     

    场景设置()Sequential+Each Iteration

    执行结果:

    VuGen中:1个用户

    第一次迭代(Iteration)取值为tester1

    第二次迭代(Iteration)取值为tester2

     

    Controller中:5个用户并发,每个用户

    第一次迭代(Iteration)取值为tester1

    第二次迭代(Iteration)取值为tester2

     

    (备注:5个用户每次迭代取值都相同,强调了用户之间的一致性)

     

    场景设置()Sequential+Each Occurrence

    执行结果:

    VuGen中:1个用户,1次迭代

    第一次出现(Occurrence)取值为tester1

    第二次出现(Occurrence)取值为tester2

     

    Controller中:5个用户,1次迭代

    第一次出现(Occurrence)取值为tester1

    第二次出现(Occurrence)取值为tester2

     

    每次迭代以此类推…

     

    (备注:5个用户每次出现取值都相同,每次迭代取值都不同)

     

    场景设置()Sequential+Once

    执行结果:

    VuGen中:1个用户

    每次都取同一个值,无论迭代多少次,都取tester1

     

    Controller中:5个用户

    每次都取同一个值,无论迭代多少次,都取tester1

     

    (备注:5个用户每次都取同一个值,无论迭代多少次)

     

    场景设置()Unique+Each Iteration+Abort Vuser

    执行结果:

    VuGen中:1个用户

    第一次迭代(Iteration)取值为tester1

    第二次迭代(Iteration)取值为tester2

     

    Controller中:5个用户

    用户1:第一次迭代(Iteration)取值为tester1

    第二次迭代(Iteration)取值为tester2

     

    用户2:第一次迭代(Iteration)取值为tester3

    第二次迭代(Iteration)取值为tester4

    .

    .

    .

    以此类推…

     

    (备注:当6个用户并发时,会出现参数不够的情况,有一个用户就会被终止)

     

    场景设置()Unique+Each Iteration+Continue in a cycle manner

    执行结果:

    VuGen中:1个用户

    第一次迭代(Iteration)取值为tester1

    第二次迭代(Iteration)取值为tester2

     

    Controller中:5个用户

    用户1:第一次迭代(Iteration)取值为tester1

    第二次迭代(Iteration)取值为tester2

     

    用户2:第一次迭代(Iteration)取值为tester3

    第二次迭代(Iteration)取值为tester4

    .

    .

    用户6:第一次迭代(Iteration)取值为tester1

    第二次迭代(Iteration)取值为tester2

     

    以此类推…

     

    (备注:当6个用户并发时,会出现参数不够的情况,会重新从参数列表第一行开始取)

     

    场景设置()Unique+Each Iteration+With Last Value

    执行结果:

    VuGen中:1个用户

    第一次迭代(Iteration)取值为tester1

    第二次迭代(Iteration)取值为tester2

     

    Controller中:5个用户

    用户1:第一次迭代(Iteration)取值为tester1

    第二次迭代(Iteration)取值为tester2

     

    用户2:第一次迭代(Iteration)取值为tester3

    第二次迭代(Iteration)取值为tester4

    .

    .

    用户6:第一次迭代(Iteration)取值为tester9

    第二次迭代(Iteration)取值为tester10

     

    以此类推…

     

    (备注:当6个用户并发时,会出现参数不够的情况,会用最后的值作为参数)

     

    场景设置()Unique+Once

    执行结果:

    VuGen中:1个用户,迭代2次,每个迭代中参数出现2

    与迭代无关,一次都取唯一一个值:tester1

     

    Controller中:5个用户

    用户1: 取值为tester1

    用户2: 取值为tester2

    用户3: 取值为tester3

    .

    .

    以此类推…

     

    (备注:与迭代无关,强调用户之间的差异性)

     

    场景四至七中,Block Size是自动分配的,如果人工分配取值会有变化,比如说2个用户,每个用户迭代2次,为每个用户分配3个参数,则:

    用户1取值tester1tester2 tester3

    用户2取值tester4tester5 tester6

     

  • 根据页面结构使用描述性编程读取页面中经常变动的内容 ---- 无需依赖对象-2

    2008-7-09

    根据页面结构使用描述行编程读取页面中经常变动的内容 ---- 无需依赖对象,本章注意介绍如何读取页面中Table(QTP中是WebTable)中的数据(子对象)

    '在脚本中设定开启哪个网页,这样会更方便一些
    InvokeApplication "C:\Program Files\Internet Explorer\IEXPLORE.EXE http://www.google.cn/"
     
    '定义Browser对象
    Dim descBrowser
    Set descBrowser = Descrīption.Create()
    descBrowser("openurl").value="http://www.google.cn"
     
    '定义Page对象
    Dim descPage
    Set descPage = Descrīption.Create()
    descPage("url").value="http://www.google.cn"
     
    '定义WebTable对象
    Dim descTable
    Set descTable = Descrīption.Create()
    descTable("html tag").value="TABLE"
    descTable("height").value="363"
    descTable("width").value="510"

    '(使用Descrīption定义描述性对象的时候,最好使用一些不经常变动的对象)
     
    '获取表格的行数
    rowCount = Browser(descBrowser).Page(descPage).WebTable(descTable).RowCount
    '循环行
    For row = 1 to rowCount
    '获取每一行中表格的列数
     colCount = Browser(descBrowser).Page(descPage).WebTable(descTable).ColumnCount(row)
      '循环列
     For col = 1 to colCount
      '获取每列中包含的link数
      linkCount = Browser(descBrowser).Page(descPage).WebTable(descTable).ChildItemCount (row,col,"Link")
      For i = 0 to linkCount -1
        '根据行数、列数、对象名以及index属性值定位表格中的ChildItem对象,并点击
       Browser(descBrowser).Page(descPage).WebTable(descTable).ChildItem(row, col, "Link", i).Click
       '返回首页
       Browser(descBrowser).Back
      Next
     Next
    Next


  • 根据页面结构使用描述性编程读取页面中经常变动的内容 ---- 无需依赖对象-1

    2008-7-09

    根据页面结构使用描述性编程读取网页中的链接 --- 无需依赖对象

    '在脚本中编写使用哪种浏览器开启哪个网页,这样更方便
    InvokeApplication "C:\Program Files\Internet Explorer\IEXPLORE.EXE http://www.google.cn/"
     
    '定义Browser对象
    Dim descBrowser
    Set descBrowser = Descrīption.Create()
    descBrowser("openurl").value="http://www.google.cn
    "

    '定义Page对象
    Dim descPage
    Set descPage = Descrīption.Create()
    descPage("url").value="http://www.google.cn
    "

    '定义Link对象,也就是要读取的链接
    Dim descLink
    Set descLink =  Descrīption.Create()
    descLink("html tag").value = "A"
     
    '找到包含该Link链接的的父对象DIV,然后通过父对象来获取符合条件的子孙数量(此处为:链接的数量),使用index属性循环读取这些链接即可
    For i=0 to 1
     set pd_link =  Browser(descBrowser).Page(descPage).WebElement("html tag:=DIV","Class:=left","index:="&i).ChildObjects(descLink)

     For j=0 to pd_link.count()-1
      Browser(descBrowser).Page(descPage).WebElement("html tag:=DIV","Class:=left","index:="&i).Link("index:="&j).click
      Browser(descBrowser).back
     Next

    Next

    '根据页面结构使用描述性编程读取网页中的链接 --- 无需依赖对象属性,只要知道页面的结构就可以轻松完成,非常方便实用,大家可以用FireFox中的Debug工具来查看页面属性。

  • 在QTP中判断一个网页是否已经被开启

    2008-6-30

    Dim descBrowser
    Set descBrowser = Descrīption.Create()
    descBrowser("openurl").value = "http://www.google.cn/"

    Set child = desktop.ChildObjects(descBrowser)

    msgbox child.count()

    If child.count()=0 Then
        print "该网页没有被开启"
    Else
        For i =1 to child.count()
             child(i-1).close
        Next
    End If
  • 循环将DataTable的值写入Excel表中

    2008-6-30

    Dim excelApp,excelSheet,fso
    Set excelApp = CreateObject("Excel.Application") '创建Excel Application对象
    Set excelSheet =  CreateObject("Excel.sheet") '创建Excel Sheet对象
    Set fso = CreateObject("scrīpting.FileSystemObject") '创建FileSystemObject对象
    filename = "F:\QTP\QTPscrīpt\text.xls" '设定文件路径

    excelApp.Visible = true 'excel可见

    If fso.FileExists(filename) Then '检测文件是否存在,如果存在就删除文件然后写入数据
        print "text.xls 文件已经存在"
        fso.DeleteFile(filename)
        For i =1 to 2
         excelSheet.ActiveSheet.Cells(i,1).Value = Cstr(i)  '如果读取DataTable的值,可以用DataTable(1,1)代替Cstr(i)
       Next
    Else  '如果文件不存在,直接写入数据
       print "text.xls 文件不存在"
       For i =1 to 10
         excelSheet.ActiveSheet.Cells(i,1).Value = Cstr(i)
       Next
    End If
    excelSheet.SaveAs filename '将数据保存到文件中
    excelApp.Quit  '退出Excel
    Set excelSheet = nothing '将sheet对象置为空
    Set fso = nothing '将fso对象置为空

  • 循环将DataTable中的值输出到Reporter文件中

    2008-6-30

    Dim dtValue
    For i = 0 to 10
      If dtValue = "" Then
          dtValue = dtValue + Cstr(i)   '如果输出DataTable中的值可以用DataTable(1,1)代替 i
      Else
          dtValue = dtValue + VbCrLf + Cstr(i) 'VbCr:回车 VbLf:换行 VbCrLf:回车换行
      End If
    Next

    Reporter.ReportEvent micPass,"file",dtValue
  • 最近比较郁闷

    2008-6-24

    最近比较郁闷,不知道怎么搞的,莫名其妙的发火,莫名其妙的想哭,想找人吵架,想独自去旅行,想放弃身上承担的一切一切的责任,总之只要轻轻松松就好,可是,这种轻松的无忧无虑的生活什么时候才能真正拥有呢
  • QTP连接数据库进行增删改查脚本

    2008-6-24

    步骤:
    1、首先创建数据源
    2、在QTP的Exper View中开发脚本如下脚本

    增删改脚本为:

    Dim conn,strSql
        '定义变量
    set conn = CreateObject("ADODB.Connection")
       '创建连接
    conn.ConnectionString="DSN=test_access_odbc;DBQ=E:\test.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"
       '设置连接字符串
    conn.open
      '开启连接
    'strSql="insert into email_value values(11,'123')"
      '设置插入语句
    'strSql="update email_value set email_value='tester' where ID=11"
    strSql="delete from email_value where ID=11"
    If conn.state=0 Then
       '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       conn.execute strSql    '执行更新语句
       conn.close
       Set conn = nothing
    End If


    查询脚本为:

    Dim conn,res,strSql
        '定义变量
    set conn = CreateObject("ADODB.Connection")
       '创建连接
    conn.ConnectionString="DSN=test_access_odbc;DBQ=E:\test.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"
       '设置连接字符串
    conn.open
      '开启连接
    Set res = CreateObject("ADODB.RecordSet")
       '创建一个记录集对象
    strSql="select * from email_value"
      '设置查询雨具
    If conn.state=0 Then
       '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        res.close                               '关闭结果集和连接,并且置为空
        Set res = nothing
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       res.open strSql,conn    '执行查询语句
       res.MoveFirst        '将记录集游标指到记录集的最开始
       Do
          Reporter.ReportEvent micPass,"file",cstr(res(0))+" : "+cstr(res(1))  '循环遍历查询结果,并且保持到reproter对象中,直到记录集到达末尾,循环结束
          res.MoveNext
       Loop until res.eof = true
       res.close
       Set res = nothing
       conn.close
       Set conn = nothing
    End If

  • loadrunner中Lr_save_string()函数和Itoa()函数的使用

    2008-5-22

                 Lr_save_string()函数和Itoa()函数的使用

     

    /*

    目的:使用for循环添加多条有规律的数据,比如说:a1a2a3......a1000

    方法:从上面看1-1000是一个有序序列,并且前面的a都是固定的,所以只需要用for循环将1-1000循环出来就可以了。

          但是loadrunner使用的是C语言的语法,所以不能向在java中一样,将两个变量直接相加(+)(+:连字符)

          所以这个时候就需要将首先将int变量转换成string,然后再用lr_save_string()函数将该变量用loadrunner可以识别的参数化方式保存起来,再应用到录制的脚本中就可以了

         

    函数简介:

          int itoa ( int value, char *str, int radix );

          函数目的:int类型转换成string

          参数介绍:value 要转换的int型的值

                     str 目标字符串,即将转换成的string值保存到str

                    radix:转换数字时所用的基数 10:十进制;2:二进制……

                   

          int lr_save_string (const char *param_value, const char *param_name);

          函数目的:param_value值保存到param_name变量中

          参数介绍:param_value:要保存的值

                    param_name 变量名称

     

    问题:为什么要用itoa()lr_save_string()两个函数相结合使用呢?

          因为lr_save_string()中的两个参数都是char类型的指针,int类型的值必须经过转换才能在lr_save_string()函数中使用,所以此处就要将itoa()lr_save_string()两个函数相结合使用。

    */

     

    Action()

    {

           int i;

           char str[100];   //定义一个数组用来保存int类型转换后的值

     

           for(i=0;i<=9;i++){

                  itoa(i,str,10);

                  lr_save_string(str,"ID");

                  lr_output_message("==str:=%s==ID:=%s====",str,lr_eval_string("{ID}"));

           }

     

     /*

    lr_save_string()将数组保存到变量中以后就可以应用到Loadrunner录制的脚本中了

    {ID}loardrunner识别参数的方式

     

        web_url("login",

                  "URL=http://server0.im.sonoro.cn:18001/login?username=a{ID}&password=test&autoLogin=false&1211433835878&1211433835878",

                  "TargetFrame=",

                  "Resource=0",

                  "RecContentType=text/html",

                  "Referer=http://server0.im.sonoro.cn:18001/proxy.html?1211433821547",

                  "Snapshot=t6.inf",

                  "Mode=HTML",

                  LAST);

     

    */

           return 0;

    }

  • 在LoadRunner中用web_reg_save_param()做关联

    2008-5-21

    LoadRunner中用web_reg_save_param()做关联

     

    LoadRunner中有两种关联方式,一种是手动关联,一种是自动关联。一般情况下我都是如下做关联的。

    1、  录制并调整好脚本以后直接回放脚本,用LoadRunnerFind Correlations查找需要关联的地方,根据情况点CorrelationCorrelation All,进行关联即可。这种方式有时候不能全部找到需要关联的地方,所以还需要手动关联的支持。

    2、  手动关联也可以用两种方法进行:

    (1)       一种方法是录制两份相同的脚本,用LoadRunner自带的Diff工具查找需要关联的地方,然后手动进行关联;

    Tools --->Compare with Vuser,选择脚本进行比较,查找需要关联的地方,然后再手动关联。

    (2)       另一种方法是基于你对程序比较熟悉的情况下进行的,可根据查看录制的scrīpt脚本,结合源代码来进行查找,找到后用web_reg_save_param()函数做关联即可。我一般采用这种方法。不太确定的就找开发人员询问,比用diff工具要方便的多,(*^__^*) 嘻嘻……

    3、  结合实例分析如何用web_reg_save_param()做关联

    最近在测试一个邮件系统,邮件系统中有一个FolderId是一个隐含变量,<input type=”hidden” name=”folderId” value=”PNKpUfAKVrgn”/> 这个Value值会在程序中被带入不同的页面,并且该值是根据登录用户的变化而变化的,所以这个Value值就需要关联。此时可以这样进行:

    (1)       进入Tree View模式,在Server Response处选择该值,右键选择Create Parameter,弹出一个是否确认替代的对话框,选择【是】即可完成。

    (2)       或者在scrīpt View模式下,自己手动写,不过因为web_reg_save_param()函数是一个注册型函数,所以需要写在需要关联的语句前面。

    4、  关于web_reg_save_param()函数

    函数原型:int web_reg_save_param (const char *ParamName, <List of Attributes>, LAST);举例   web_reg_save_param("folderIdValue",

           "LB= value=¥"", "RB= "", "Search=Body",

    LAST);

    LB:左边界

    RB:右边界

    Search:搜索范围:All 、Header、Body

     

    关联应用:

    web_submit_data("login.pl_2",

    "Action=http:// {webUrl}/mercuryWebTours/login.pl",

    "Method=POST",

    "TargetFrame=",

         "RecContentType=text/html",       "Referer=http://{webUrl}/mercuryWebTours/nav.pl?folderId={folderIdValue }", 

    LAST);

    这样在运行的时候就可以根据不同用户改变folderId了。

Open Toolbar