发布新日志

  • 如何用QTP解析PDF

    2007-06-25 10:13:07

    今天有人问如何解析PDF,下边是其中的对话。

    Gao.Sheng 说:
    你好qtp可以解释pdf文件吗
    pcl@LoadRunner/QTP/QCSP 认证报名 说:
    解释?还是解析
     
    Gao.Sheng 说:
    解析
    pcl@LoadRunner/QTP/QCSP 认证报名 说:
    qtp是功能自动化测试工具,它是基于gui元素进行测试的!它不能识别pdf里面的文字,如果你要做到解析,那么需要pdf的sdk作为支撑,开发相应的dll,然后提供给qtp调用就可以了

    其实在网上你就可以找到相应的pdf解析库,下边这个网站就是 http://www.pdflib.com/cn/tet.html 作解析的,可以利用他们写好的东西开发dll,在你的脚本中调用

  • 如何在QuickTest Pro中使用IE以外浏览器录制和运行测试?

    2007-06-25 10:11:37

     

    如何在QuickTest Pro中使用IE以外浏览器录制和运行测试?

    1. 首先要了解支持哪些类型?

    QuickTest 支持在下列Web 浏览器上录制和运行测试或组件:

    • Netscape
    • Microsoft Internet Explorer

    ·  AOL (America Online)

    ·  带有嵌入式Web 浏览器控件的应用程序

    2. 使用Internet Explorer

    选择IE中的“工具”>“Internet 选项”>“高级”,然后在Internet Explorer  中选中“启用第三方浏览器扩展”选项。

    3. 注意使用其它浏览器应注意的请查看QuickTest Pro帮助!

    备注:如果以录制的不符合你的要求,可以查看QuickTest Pro中的配置web方式录制,选择合适的方式,小经验分享给大家^_^

  • QuickTest Pro 8.2 企业级自动化测试工具介绍

    2007-06-25 10:10:51

     

    QuickTest Pro 8.2 企业级自动化测试工具介绍

    QuickTest 8.2 Pro最新正式版发行,QTP 8.2是一个B/S系统的自动化功能测试的利器,软件程序测试工具。Mercury的自动化功能测试软件QuickTest Professional 8.2,可以覆盖绝大多数的软件开发技术,简单高效,并具备测试用例可重用的特点。
    Mercury QuickTest Pro 8.2是一款先进的自动化测试解决方案,用于创建功能和回归测试。它自动捕获、验证和重放用户的交互行为。
    Mercury QuickTest Pro 8.2为每一个重要软件应用和环境提供功能和回归测试自动化的行业最佳解决方案。

    创建测试:用QuickTest Professional创立一个测试,您只需记录下一个标准的业务流程,如下一张订单或建立一个新的商家帐户。QuickTest Professional直观的记录流程能让任何人在GUI上轻轻点击鼠标就可建立测试,即使技术知识有限的用户也能生成完整的测试。您还可以直接编辑测试指令来满足各种复杂测试的需求。QuickTest Professional将2种测试创建方式结合在一个环境下,来适应不同的背景支持和您团队的喜好。

     插入检查点:在记录一个测试的过程中,可插入检查点,在查寻潜在错误的同时,比较预想和实际的测试结果。在插入检查点后,QuickTest Professional会收集一套性能指标,在测试运行时对其一一验证。QuickTest Professional允许使用几种不同类型的检查点,包括文本的,GUI,位图和数据库。

     检验数据:除了创立并运行测试,QuickTest Professional还能验证数据库的数值,从而确保交易的准确性。例如,在测试创建时,您可以设定哪些数据库表格和记录资料需要检测。在重放时,您的测试程序就会核对数据库内的实际数值与预想的数值。QuickTest Professional能自动显示检测结果,在有更新/修改,删除或插入的记录上会用突出标识以引起注意

     增强测试:为了彻底全面地测试一个应用程序,您需要了解对于不同类型的数据它是如何运行的。QuickTest Professional的DataDriverTM Wizard,让您只需点击几下鼠标,就能简单地将一个记录下的业务流程转化为一个数据驱动的测试,来反映多个用户各自独特且真实的操作行为。目前有相当数量的企业应用程序仍然使用非标准的对象。QuickTest Professional的Virtual Object Wizard能识别以前未知的对象,不必特别编写代码。使用Virtual Object Wizard界面,您会看到一张的对象类型列表,能用其来代表您未知的对象。您可以为您的对象设定标识,如一个按钮,并为其命名。

     运行测试:建立起您的测试,并插入检查点和做一些必要的功能添加后,您就可以开始运行测试。当WinRunner和QuickTest Professional执行您的测试时,它会自动操作应用程序,正如一个真实用户根据记录流程执行着每一步的操作。而且,它的意外处理功能为测试排除干扰,包括消息和警报

     分析结果:一旦测试运行后,您就需要分析测试结果。QuickTest Professional的互动式的报告工具通过提供详尽的,易读的报告,其中会列出在测试中发现的差错和出错的位置,来帮助您解释所得的结果。这些报告对在测试运行中发生的重要事件进行描述,如出错内容和检查点等。点击按钮,您还能进一步获取任何未被包括在此测试范围内的错误的详尽资料

     维护测试:随时间推移,开发人员会对应用程序做进一步的修改,并需要另加额外的测试。有了QuickTest Professional,您不必应用程序改动一次,就得重新建一个新的测试。而WinRunner会帮助您创立在程序应用周期内可重复使用的测试。这样大大地节省时间和资源,充分利用测试投资。

    特点和优势

    ·具有行业领先的便于使用的特性,以及支持提前配置环境的功能,确保了快速的投资回报。
    ·可独立运行,也可以同Mercury Business Process Testing和Mercury质量中心集成。
    ·引进了QuickTest Professional 8.0中新一代的“零配置关键词驱动测试技术,从而实现了快速建立测试、测试脚本更易维护,和更强大的数据驱动能力。
    ·通过集成的数据表,可数据驱动任意对象、方式、检查点和输出值等。

    QuickTest Professional 8.2 新功能:
    Keyword View: Lets you easily build and maintain tests without writing VBscrīpts.
    Auto-Documentation: Provides improved test clarity and the ability to view test steps in plain English.
    Step Generator: Allows you to quickly insert custom-built functions into your tests.
    Mercury Business Process Testing: Enhanced integration with BPT -- Business Components, scrīpted Components, and Application Areas.
    Enhanced Expert View: Provides greater efficiency when generalizing test components.
    Action Parameters: Allows you to generalize testing actions for greater reusability.
    Data Parameters: You can now specify test or action parameters to pass values into and from your test, and between actions in your test.
    Open XML Report Format for Test Results: Test results are now stored in an open XML format, enabling you to easily customize the reports according to your own requirements, and to integrate the test result information with other applications.
    Unicode Support: Lets you test global deployments of your enterprise applications.
    Function Definition Generator: You can use the new Function Definition Generator to generate definitions for user-defined functions, add header information to them, and register functions to a test object.

     

  • QTP的登陆脚本设计

    2007-06-25 10:09:26

    由于一直以来事情都比较多,最近上课还有其它的事情,所以本来答应一个朋友把脚本帮他写一些,但是耽误了3-4天了,实在不好意思。这里把脚本简单说一下,我们分析一下。
        当时问题是这样的,“我的错误的用户名就没办法登陆”,其实含义就是脚本最好能处理成功的用户名错误的用户名,那么这里涉及到脚本的设计。

    目标如下:
    1.    脚本需要处理成功和失败的用户的登陆
    2.   数据驱动

    设计开发脚本如下:


    第一步录制脚本如下
    Browser("智能变电巡检仪系统4.0").Page("智能变电巡检仪系统4.0").WebEdit("txtLoginName").Set "吕巍"
    Browser("智能变电巡检仪系统4.0").Page("智能变电巡检仪系统4.0").WebButton("登 录").set ""
    Browser("智能变电巡检仪系统4.0").Page("Page").Syn
    Browser("智能变电巡检仪系统4.0").Close

    以上为录制的正确的用户名,下边录制错误的用户名
    Browser("智能变电巡检仪系统4.0").Page("智能变电巡检仪系统4.0").WebEdit("txtLoginName").Set "xx"
    Browser("智能变电巡检仪系统4.0").Page("智能变电巡检仪系统4.0").WebButton("登 录").set ""
    出现错误提示“该用户不存在”

    第二步 增强脚本

    现在需要设计的是一套脚本驱动所有的测试数据,这样可以驱动所有的用例数据,qtp中提供了datatable。
    但是有数据驱动也要做一个事情就是如何处理错误的用户名和正确的用户名,如何结合起来呢?
    这里我把datatable看作存放测试用例的地方,里面放入测试数据,还放入测试的预期结果。这样我的设计已经出现雏形了。
    我把datatable设计为三列

    username  password status
    吕x               
    xxx       xxxx     该用户不存在

    第三列放入最后执行的结果,我设计的是空为成功登陆,如果有信息就用实际运行的结果和这一列对比.好了万事俱备只欠东风了

    修改脚本如下:
    Dim iStatus

    Browser("智能变电巡检仪系统4.0").Page("智能变电巡检仪系统4.0").WebEdit("txtLoginName").Set DataTable("username", dtLocalSheet)
    Browser("智能变电巡检仪系统4.0").Page("智能变电巡检仪系统4.0").WebButton("登 录").set DataTable("password", dtLocalSheet)
    iStatus = DataTable("status", dtLocalSheet)

    If   iStatus=""  Then
      Browser("智能变电巡检仪系统4.0").Close
    End If


    If   iStatus="该用户不存在"    Then
         Reporter.ReportEvent micFail, "登陆", "登陆失败."
    End If

    Browser("智能变电巡检仪系统4.0").Close

    第三步,设置脚本运行过程

    打开tests-〉settings
    设置RUN TAB页面下Datatable iterations中Run On all rows

    这样就完成了整个脚本的设计工作,以上通过一个简单例子吧脚本的设计和软件的功能结合起来,达成脚本的设计效果。

  • QTP中一些基础代码结构累积

    2007-06-25 10:08:27

    1.        生产随机数列

    第一种方法:

    randomize'更新反回的数据

    funcation rand(k,n)

    n=int((k-1)*rnd+1)

    rand=n

    end funcation

    第二种方法:

    n=randomnumber.value(1,255)

    2.        当运行到表中的某一行,自动导出表中的所有数据

    row=datatable.getcurrentrow

    if row="5" then

      datatable.export("d:\data.xml")

    end if

    3.        webedit("txtpass").setsecure"sdsdf...."

    如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set

    4.        如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证

    if browser("web_name".dialog("dialog_name").exist(1) then

    //如果不出现=false

    error_message=browser("web_name".dialog("diaglog_name".static("用户密码错误!").getRoproperty("text")))

      if error_message<>(datatable.value("error_info")) then

            msgbox(error_message)

        end if

        browser("web_name").dialog("diaglog_name").close

    end if

    这里我总结了两点技巧:

      一是:对于dialog中,虽然提示信息对象名称是“用户密码错误”,但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性。

        二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理。

    5.        在运行时,向某一个单元格赋值: datatable.value("kai",dtlocalsheet)="nanjing"

    datatable.value("num")只在global形式下的一种省略形式;完整形式是datatable.value("num",dtlocalsheet)

    ——取得某一具体行的值:

    datatable.setcurrentrow(n);

    msgbox(datatable.getsheet("global").getparameter("kai").Rawvalue)

    或者

    kk=datatable.Rawvalue("kai","action1")

    -------------

    for i=1 to 3

    DataTable.SetCurrentRow(i)

    DataTable.Value("A","Global")=I            //DataTable.SetNextRow

    next

    -------------

    ——在run-time期间,添加一个action和参数

    kk=datatable.addsheet("name").addparameter("kai","ddd"). name'/value

    6.         

    with dialog("name")                                  //可以省好多代码,看着也简洁

    content=.wintreeview

    end with

    7.         

    wintreeview.select(item)                    (根是0,列表第一个也是0)

    wintreeview.getcontent

    wintreeview.getitem(整行)+";"+

    winlistview.getitem(行中的第一个字符段)

    wincheckbox("").set"off"'/on

    8.        数据库检查点:

    sub getdata

    set con=createobject("adodb.connection")

    con.open("descrīption=mod;driver=sqlserver;server=hp\sqlserver;uid=sa;"&_

             "pwd=11111;APP=qtp;WSID=hp;database=MOD31" 

                                                  //sqlserver方式

    Con.open "DRIVER = {Microsoft Access Driver (*.mdb)};DBQ=D:\Testdb.mdb"

    //access方式

    set record=createobject("adodb.recordset")

    sql="select * from m3_program"

    //选择具体满足一条件的:sql="select* from m3_program where "

    record.open sql,con

    if(record("p_name")="kai") then

    num=num+1;

    end if          

    if(not record.eof) then

    record.movenext

    msgbox("p_name")

    end if

    record.close

    set record=nothing

    con.close

    set con=nothing

    end sub                             //如果没有查到内容,在结果中不会报错,也不会弹出窗口

    9.         

    vbcr----chr(13)回车符

    vblf----chr(10)换行符

    vbcrlf----chr(13)+chr(10)结合

    10.    stel run has two ways

    11.    对于时间,日期等的格式检查(一种是正则表达式,另一种是输出对比,如果不好对比,用mid截取一部分对比)

    12.    对于一些列表框或树结构,如果发生结点名称发生变化,此时如果报没有彼配的对象,此时可以把更改后面的名称如_2

    13.    对于动态变化的对象,要分清是对像还是属性;对于属性可以用gettoproperty("ddd");得到,而对于由于动态无法识别对像可以用描述性脚本,如:

    Set ōbject= Descrīption.Create()

    Object("regexpwndclass").Value="HtmlButton"

    Object("regexpwndtitle").Value="登陆"

    browser("ss").page("a").button(Object).click

    14.    对于属性是变化的,有时可以把该属性从识别对象里删除

    15.    从系统的文件中获取信息及删除文件get_file_infor("c:\she.mpg")

    function get_file_infor(url)

    dim fso,f

    set fso=createobject("scrīpting.filesystemobject")

    set f=fso.getfile(url)

    msgbox(f.datecreated)

    f.name:f.size:f.type

    fso.deletefile(url)'/////删除文件

    end function

    --------获取文件夹里所有文件信息get_folder_infor("c:\kai")

    function get_folder_infor(folder)

    dim fso,f,f1,n

    set fso=createobject("scrīpting,filesystemobject")

    set f=fso.getfolder(folder)

    set fc=f.files

    for each f1 in fc

    select case f1.name

    case"kai.mpg","she.mpg","dd.mp3"

    end select

    next

    end function

    16.    四舍五入可以在后面+0.5,进行自动解决

    17.    y=-------waitproperty("visible",true,10000)

    18.     

    on error resume next

    on error goto o

    19.    window("").wintreeview("systreeview32").type micctrldown+"p"+micctrlup

    20.    定义数组 name=array(1,2,"aa","bb");name(0)=1

    21.    进行日期YYYY-MM-DD的格式检查:

    Function RegExpTest(patrn, strng)

    Dim regEx, Match, Matches                //Create variable.

    Set regEx = New RegExp                        //Create a regular expression.

    regEx.Pattern = patrn                                    //Set pattern.

    查看(430) 评论(2) 收藏 分享 管理

  • QTP基础代码

    2007-06-25 10:07:19

       这两周我开始学习QTP测试我们的web服务了;大体的软件使用操作流程是懂了,但具体实施起来特别是代码的组织及函数应用还有一些困难,因为自己只会vb没学习vbscrīpt,所以想和大家交流一下代码等一些基础知识;呵呵,一起学习,加强记忆与应用。

     

    1 生产随机数列
    第一种方法
    randomize'更新反回的数据
    funcation rand(k,n)
    n="int((k-1)*rnd+1) rand=n
    end funcation
    第二种方法
    n="randomnumber.value(1,255)

    2  当运行到表中的某一行,自动导出表中的所有数据
    row=datatable.getcurrentrow
    if row="5" then
      datatable.export("d:\data.xml")
    end if

     

    3 参数化密码
    webedit("txtpass").setsecure"sdsdf...."
    如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set

     

    4 如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
    if browser("web_name").dialog("dialog_name").exist(1) then'如果不出现="false     error_message=browser("web_name").dialog("diaglog_name").static("用户密码错误!".getRoproperty("text")
       if error_message<>(datatable.value("error_info"))then
             msgbox(error_message)
          end if
         browser("web_name").dialog("diaglog_name").close
      end if
    这里我总结了两点技巧:
      一是:对于dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性
         二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理

     

    5  datatable.value("num")只在global形式下的一种省略形式;完整形式是:
    datatable.value("num",dtlocalsheet)
    -----向某一列的单元格赋值:
    datatable.value("column_name",dtlocalsheet)="nanjing"
    -----取得某一行具体值:
    datatable.setcurrentrow(n)
    msgbox(datatable.getsheet("global").getparameter("column_name").Rawvalue)
    或者kk=datatable.Rawvalue("column_name","action1")
    ----在run-time时,动态添加表格与数据
    kk=datatable.addsheet("sheet_name").addparameter("column_name","value").name;

     

    7   wintreeview一些操作
    选择一个条目:wintreeview.select(item)'根是0
    根的名称:wintreeview.getitem(0)

     

    8   数据库检查点模块:
    sub database_check
    set con="createobject(""adodb.connection")
    con.open "Descrīption="IBM_ODBC;DRIVER=SQL" Server;SERVER="IBM;UID=sa;""&_
                     "PWD="123456;APP=Quick" Test Pro;WSID="IBM;DATABASE=IBM_table""
    'access方式:con.open "DRIVER="{Microsoft" Access Driver (*.mdb)};DBQ="d:\test.mdb""
    'Orocle方式:con.open "DRIVER="{Oracle" in OraHome92};SERVER="CESHI;UID=CND_TEST;PWD=CND;DBQ=CESHI;DBA=W;APA=T;

    EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BA

    M=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;""
    set record="createobject(""adodb.recordset")
    sql="select*from ibm_one_table"
    record.open sql,con
    DO
    if(record("ibm_table_column")="kai")then'//查找表格中有多少kai
    num=num+1;
    end if
    record.movenext
    loop until record.eof="true record.close
    set record="nothing con.close
    set con="nothing end sub

     

    9   换行符
    vbcr----chr(13)回车符// vblf----chr(10)换行符
        vbcrlf----chr(13)+chr(10)结合//type(chr(13)就相当于按了一上键盘上的enter

     

    10  Run from step有两种方式:
    在Keyword View模式会从本步骤运行到所有action结束
    在expert view模式仅会将本action运行结束

     

    11  由于对象属性原因,无法识别对象
    -----对于对象属性是变化的,可以参数化/或者用正则表达式
    -----报匹配多个对象错误,可以spy查看对象,添加一个该对象另一个唯一标识属性
    -----有时可以删除对象的变化的属性来解决识别问题
    ------对于多个完全相同的对象,可以采用添加index,location,createtime等特殊属性来识别
      (index:按照程序源码,绘制对象的先后标识对象,所以与其它相同对象是相互依赖,当其它对象发生
      变化后,原先的所有对象index属性要发生变化,开始是0;如index:="0;         location:根据对象的位置进行确定,从上到下,从左到右;
      CreateTime:按照对象被浏览器打开的先后标识对象)
    ------另外换一种思维方式,采取等效的方法;比如用键盘代替鼠标或用操作系统本身特性去解决问题

     

    12  对系统文件的操作
    -------从系统的文件中获取信息及删除文件
      get_file_infor("c:\she.mpg")
       function get_file_infor(url)
        dim fso,f
        set fso="createobject(""scrīpting.filesystemobject")
        set f="fso.getfile(url)"
        f.name:f.size:f.type:f.datacreated'///获取文件信息
        fso.deletefile(url)'/////删除文件
       end function
    --------获取文件夹里所有文件信息
    get_folder_infor("c:\kai")
    function get_folder_infor(folder)
    dim fso,f,f1,n
    set fso="createobject(""scrīpting,filesystemobject")
    set f="fso.getfolder(folder) set fc="f.files for each f1 in fc
    select case f1.name
    case"kai.mpg","she.mpg","dd.mp3"'//检查文件夹里是否含有这些文件
    end select
    next
    end function

     

    13   等待某个对象出现方法
    y="......waitproperty(""visible",true,10000)

     

    14   防程序中断方法
    On error resume next
    On error goto handle

     

    15  数组的应用:
    name="array(1,2,""aa","bb")
    name(2)="aa"

     

    16  正则表达式应用模板
    进行日期YYYY-MM-DD的格式检查 :
    Function RegExpTest(patrn, strng)
      Dim regEx, Match, Matches      ' Create variable.
      Set regEx = New RegExp         ' Create a regular expression.
      regEx.Pattern = patrn         ' Set pattern.
      regEx.IgnoreCase = True         ' Set case insensitivity.
      regEx.Global = True         ' Set global applicability.
      Set Matches = regEx.Execute(strng)   ' Execute search.
      For Each Match in Matches      ' Iterate Matches collection.
        RetStr = RetStr & "Match found at position "
        RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
        RetStr = RetStr & Match.Value & "'." & vbCRLF
      Next
      RegExpTest = RetStr
    End Function
    date_pattern="^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((01,3-9])|(1[0-2]))-(29|30)))))$"
    result_message=RegExpTest(date_pattern, inputbox("请你输入要检查的时间:"))'用其它正则表达式更改此处
    Select case result_message
    Case ""
             msgbox("你输入的日期格式与标准不匹配")
    case else  MsgBox(result_message)
    end select

     

    17   返回一个字符串在另一字符串中的位置
    instr(string1,string2)

     

    18   有时回放出现找不到对象时,可能不是由于你的代码问题,而是由于你的操作系统等设置问题;
    举例说明1:
    比如:你录制一个选择磁盘中的文件动作
    会录制为:
    .winlistview("  ").drap 46,99
    .winlistview("  ").draponitem "she.mp3"
    下次录制的时候,如果你的系统文件改为不显示扩展名,下次执行的时候,QTP就找不到she.mp3,只能找到she;
    举例说明2:
    有时由于不同操作系统以及不同的ie,导致有些窗口不能识别,比如在2000下弹出的网页对话框的标题是:
    “web对话框",而在2003上是”网页对话框"

     

    19  "is+*"类型function
    isarray'是否是数组
    isconnected'判断QTP是否连接到TD
    isdate'是否是合法的日期类型
    isempty'判断是否初始化
    isNull'判断是否为空值
    isNumeric'判断是否是数字型
    isobject'判断是否一个功能对象
    isready'判断设备是否准备就绪
    isRootFolder'是否是根目录

     

    20 Action之间的参数传递
    例如:在Action1中,有如下代码:
    out_str="This is out_string"
    RunAction "Action2",oneIteration,out_str
    在Acton2中,在其step->Action Properties中的,input参数栏,加入out_str后,
    msgbox(parameter("out_str")),就能正确显示参数了 

     

    21 Wscrīpt.Shell的一些应用
    set WshShell ="CreateObject(""Wscrīpt.Shell")
    WshShell.SendKeys "{ENTER}"     '模拟键盘进行操作
    WshShell.AppActivate "Calculator"             '启动应用程序

     

    22 获取对象属性名称用法:
    GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是QTP为识别该对象创立的描述属性;
    GetToproperty----从对象库中描述对象的属性,静态值
    GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法

     

    23 FireEvent的使用可以对一个对象进行更复杂的操作
    如:FireEvent("onfocus")   '使一个控件获取焦点
         FireEvent("ondblclick")  '实现双击/也可以在事件设定中针对该对象事件响应  

     

    24 模板的应用
    -----新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,
     并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;
    例如:
    '-------------------脚本说明---------------
    '产品版本:      __Build(  )
    '测试员:
    '编写日期:
    '测试功能:
    '脚本类型:
    '被测试对象初始状态:
    '进展程度:
    '基本思路:
    '主要功能函数:
    '历史修改:
    '没解决的问题:
    '--------------------脚本内容-------------

     

    25 在对象库中,两个对象有时不能通过更改属性或命名来达到两个对象完全一致的替换;
    在web-mod项目中,我在对象库里添加了一个自动含有index标识属性的对象,然后每次通过SetToproperty来改变
    index值,对对象进行数据驱动,使其操作另一个对象,但脚本始终操作原先index属性值的对象;后来,把该对象
    删除掉,重新添加一个不自动含有index标识属性的该类对象,然后,手工添加,index标识属性,后来脚本能正常工作了,可见两次的对象属性完全一致,但形成方式不一样,导致的结果往往也不一样;

     

    26 childobject的应用
    childobject可以返回界面上满足条件的对象集合,而且与对象库里是否有这些对象无关,这就可以简化对象库;
    返回的对象集合的count方法可以返回对象个数,这就可以通过下标对单个对象进行操作;在出现index标识对象时
    可以进行运用
    如:Set m_WinCheck="Descrīption.Create()       m_WinCheck("nativeclass").Value="Button"
          set All_WinCheck="Window(""").Dialog("").Childobject(m_WinCheck)
          n="All_WinCheck.Count()      for i="0" to n-1
          All_WinCheck(i).Set "ON"
         next

    --以上是一些简单基础内容及我的经验心得,欢迎大家贴一些特色代码或具体应用的核心代码,谢谢

  • 在QTP中将数据库的数据导入到EXCEL

    2007-06-14 12:04:20

     昨天遇到这个问题.自己也有点迷茫,在51上发帖后得到高人指点,在这里我将代码写出来,留个足迹,呵呵,谢谢风过无痕.

    ------------------

    Set excelObj = CreateObject("Excel.Applicaiton") '创建一个对象

    xlsUrl = "C:\QTP\0110\sql-excel-qtp\data.xls"  '指定一个已经存在的XSL文件路径

    excelObj.workbooks.open(xlsUrl)    '打开EXCEL

    Set sheetNew = excelObj.sheets.item(2)  '设置将数据放在EXCEL中的那一页上(索引从1开始)

    '相关的数据库操作

    Set conn = CreateObject("adodb.connection") set rs = createobject("adodb.recordset") conn.open "Provider=SQLOLEDB.1;Password=qaqc;Persist Security Info=True;User ID=test;Initial Catalog=test;Data Source=192.168.0.53" sql="select * from test" rs.open sql,conn

    Dim i while not rs.eof

        user_id = rs("user_id").value

        user_name = rs("user_name").value

        sheetNew.cells(i+1,1).value = user_id  '列付值

        sheetNew.cells(i+1,2).value = user_name  '列付值

    i = i + 1

        rs.movenext

    wend

    excelObj.activeworkbook.saveas "C:\QTP\0110\sql-excel-qtp\data.xls"  '保存数据

    excelObj.quit    '关闭对象

    set excelObj = nothing  '清空对象

    rs.close    '关闭数据库连接操作

    set rs=nothing

    conn.close

    set conn = nothing

     

    ------------这就是导出到EXCEL的全部过程:),后面如果要用到这些数据的话,直接导入进来就可以了


  • 学习QTP方法

    2007-06-14 11:58:52

     我们使用QTP的目的是想用它来执行重复的手动测试,主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试,例如要测试那些功能、操作步骤、输入数据和期望的输出数据等。

            建议大家参照 Tutorial_oldsidney_cn.pdf 文件来认认真真、从头到尾地执行一遍,包括录制脚本、分析脚本、增加check point、Split Action等。我想这会减少你在学习QTP过程中的不少困惑和疑虑。


            这篇文档对如何使用QTP写的非常详细,是QTP初学者的经典教材。我就是看了这篇文档后才对QTP的整个测试流程有了一个初步的认识。在此,表示感谢。

            注意:
          1. 确保你的IE运行正常,依次点击菜单 查看 --> 工具栏,一定要上网助手等插件卸载掉,特别3721这个垃圾网站和其它拦截广告的插件(它也把测试过程中弹出的窗口当成广告,一样会拦截的!)
          2. 如果是按照Tutorial_oldsidney_cn.pdf 文件 中的订购飞机票的例子来练习 QTP的使用,那么只需选择Web 插件就可以了。如果是测试其它的应用程序或系统,就要根据需要来选择相应的插件了。
    在这个阶段你就要自己针对某个系统去录制脚本、维护脚本了。在录制后的回放过程中,你可能会遇到各种问题,这个时候就需要发挥你的主观能动性来解决遇到的问题。

            我想你可以按照下面的方法去解决:

           1. 查看QTP的有关文档,包括Help 、QTP User’s Guide等文档。这些都是比较系统全面的学习材料。你该好好利用呀。
           2. 在本论坛上查看以前别人是如何解决此类问题的(如果有的话)或者是发新贴寻求帮助,也可以搜索Google 等网站寻找问题的解决方法;
           3. 与自己部门的同事交流,例如与测试人员交流他们是如何解决的,与开发人员交流某个QTP无法识别的控件具体是是用什么来识别的等。毕竟他们对你测试的环境和测试的软件比论坛上的人熟悉呀。
           4. 自己通过学习VB scrīpt 等方式来提高自己的管理QTP scrīpt的能力。

            或许你会发现许多问题都是由提出问题的人来解决的,因为他们希望问题得到解决的迫切心比谁都强烈。
            如果你对VB scrīpt 、QTP和需要测试的程序或系统非常熟悉,你可能就想直接写QTP scrīpt来表现一下了。如果你能达到这个水平,那么恭喜你---你就是真正的高手了。这个时候你已经可以从宏观上把握QTP了,也能灵活自如地使用QTP了。


  • 性能测试之协议分析

    2007-06-09 14:12:08

    最近在论坛上的一些朋友问脚本方面的问题,比如用lr的winsock协议录制的脚本遇回放过程中遇到如下错误

    Action.c(20): Error : callConnect - Can't assign requested address. Error code : 10049.
    Action.c(20): Error : Timeout expired while trying to connect. Error code : 9017.

    这里的10049是udp协议错误,是脚本没有和服务器同步,这说明什么问题呢。下边我用一个协议进行分析,来看看到底是什么问题,
    smtp协议分析:

    1.SMTP工作方式有两种情况:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器.
    2.SMTP是个请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码.
    3.SMTP在TCP协议25号端口监听连接请求
    4.连接和发送过程:

    a.建立TCP连接
    b.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令
    服务器端正希望以OK作为响应,表明准备接收
    c.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行
    服务器端则表示是否愿意为收件人接受邮件
    d.协商结束,发送邮件,用命令DATA发送
    e. 以.表示结束输入内容一起发送出去
    f.结束此次发送,用QUIT命令退出。

    5.另外两个命令:
    VRFY---用于验证给定的用户邮箱是否存在,以及接收关于该用户的详细信息。
    EXPN---用于扩充邮件列表。

    6.邮件路由过程:
    SMTP服务器基于‘域名服务DNS中计划收件人的域名来路由电子邮件。SMTP服务器基于DNS中的MX记录来路由电子邮件,MX记录注册了域名和相关的SMTP中继主机,属于该域的电子邮件都应向该主机发送。

    若SMTP服务器mail.withub.org收到一封信要发到pcl@withub.org

    a.Sendmail请求DNS给出主机withub.org的CNAME记录,如有,假若CNAME到mail.withub.org,则再次请求mail.withub.org的CNAME记录,直到没有为止.
    b.假定被CNAME到mail.withub.org,然后sendmail请求@withub.org域的DNS给出mail.withub.org的MX记录,
    shmail MX 5 mail.withub.org
    10 shmail2.withub.org
    c. Sendmail最后请求DNS给出shmail.withub.org的A记录,即IP地址,若返回值为1.2.3.4
    d. Sendmail与1.2.3.4连接,传送这封给pcl@withub.org的信到1.2.3.4这台服务器的SMTP后台程序

    这里是协议的一个解析过程,我们要看看,利用lr录制脚本后然后回放,录制的过程中mail.withub.org返回客户端服务器上有多少给用户的邮件,lr把这个数字保存下来,最为下次回放的时候对比。当你第二次回放的时候,lr模拟客户端发送请求,这时候服务器上没有了新邮件,返回可能是0,lr把这个返回值和当时录制的脚本保存的返回值进行对比(那个时候可能服务器上有3个新的邮件,服务器返回的值是3),明显这个值是动态变化的。你的脚本如果没有经过修改,肯定是回返不成功的。

    那么上边提到的错误信息,同样的道理,我们要分析一下到底是什么问题,从协议上分析,从系统环境上分析。

    解决方法,动态关联

    1.用同样的用户操作同样的步骤两次,然后用lr工具wdiff进行脚本对比,找出不同的地方!

    2.用lr自动关联

    3.手工关联,找到要替换的动态数据进行替换

  • 系统性能测试方案

    2007-06-09 14:10:35

     
     
     
     
     

    1引言

    1.1编写目的

    编写本方案的目的是用于指导XXXX系统的性能测试,主要从测试环境、测试工具、测试策略、测试具体执行方法、任务与进度表等事先计划和设计。

    1.2适用范围

    XXXX系统性能测试组

    XXXX系统开发组

    XXXX系统性能优化组

    1.3参考资料

    系统性能测试指南

    1.4术语和缩写词

    缩写、术语

    性能测试

    performance testing

    运行这些测试通常要确定程序运行有多快,以便确定是否需要优化

    负载测试

    (load testing)

    通过在面临很多资源要求的系统上运行,攻击被测程序或系统

    可靠性测试

    (reliability testing)

    持续进行的性能测试,目标是发现短序列程序测试遗漏的情况

    ……

     

     

     

     

     

    2系统介绍

    3测试环境

    3.1网络拓扑图

    3.2硬件环境

    3.3软件环境

    4测试范围与主要内容

    测试范围:

    如:XXXX系统各项性能指标,反应时间的性能测试、CPU、Memory的性能测试、负载的性能测试(压力测试)、可靠性测试

    主要检测内容:

    如:

    1. 典型应用的反应时间

    2. 客户端、服务器的CPU、Memory使用情况

    3. 服务器的响应速度

    4. 系统支持的最优负载数量

    5. 网络指标

    6. 系统可靠性测试

    5测试工具和测试方法

    5.1测试工具

    MI(Mercury Interactive)公司的LoadRunner7.5.1创建虚拟用户脚本工具Virtual User Generator

    MI(Mercury Interactive)公司的LoadRunner7.5.1创建、运行实际场景工具Controller

    MI(Mercury Interactive)公司的LoadRunner7.5.1分析测试结果工具Analysis

    性能监视器(MicroSoft Win2000自带)

    5.2测试方法

    5.2.1反应时间的性能测试

    处理点或事件

    期望的反应时间

    实际反映时间平均值(至少3次)

    上次或上版本实际反映时间平均值(至少3次)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    测试结果分析:

    5.2.2CPUMemory的性能测试

    条件:

    1.客户端情况

    2. 应用服务器情况

    3.数据库服务器情况

    测试结果分析:

    5.2.3负载的性能测试(压力测试

    输入/动作

    输出/响应

    能否正常运行

    10个用户操作

     

     

    20个用户操作

     

     

    30个用户操作

     

     

    50个用户操作

     

     

    100个用户操作

     

     

    ……

     

     

    测试结果分析:

    5.2.4可靠性测试

    任务描述

     

    连续运行时间

    建议72小时

    故障发生的时刻

    故障描述

     

     

     

     

    ……

     

    统计分析

    任务A无故障运行的平均时间间隔

    CPU小时)

    任务A无故障运行的最小时间间隔

    CPU小时)

    任务A无故障运行的最大时间间隔

    CPU小时)

    测试结果分析:

    5.2.5网络性能测试

    对网络性能的测试,如网络流量、每秒采样数、网络延迟等。

    6测试完成准则

    系统满足各项性能要求、能满足实际使用情况并提供测试报告

    7任务与进度表

    8提交的文档和报告

    XXXX系统性能测试方案

    XXXX系统性能测试报告

    XXXX系统性能测试脚本

  • 性能测试(并发负载压力)测试分析-简要篇

    2007-06-09 14:09:18

    论坛混了多日,发现越来越多的性能测试工程师基本上都能够掌握利用测试工具来作负载压力测试,但多数人对怎样去分析工具收集到的测试结果感到无从下手,下面我就把个人工作中的体会和收集到的有关资料整理出来,希望能对大家分析测试结果有所帮助。

    分析原则:

    • 具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)

    • 查找瓶颈时按以下顺序,由易到难。

        服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)

        注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。

    • 分段排除法 很有效

    分析的信息来源:

    •1 根据场景运行过程中的错误提示信息

    •2 根据测试结果收集到的监控指标数据

    一.错误提示分析

    分析实例:

    1 •Error: Failed to connect to server “10.10.10.30:8080″: [10060] Connection

    •Error: timed out Error: Server “10.10.10.30″ has shut down the connection prematurely

    分析:

    •A、应用服务死掉。

    (小用户时:程序上的问题。程序上处理数据库的问题)

    •B、应用服务没有死

    (应用服务参数设置问题)

        例:在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25%

    •C、数据库的连接

    (1、在应用服务的性能参数可能太小了 2、数据库启动的最大连接数(跟硬件的内存有关))

    2 Error: Page download timeout (120 seconds) has expired

    分析:可能是以下原因造成

    •A、应用服务参数设置太大导致服务器的瓶颈

    •B、页面中图片太多

    •C、在程序处理表的时候检查字段太大多

    二.监控指标数据分析

    1.最大并发用户数:

    应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。

        在方案运行中,如果出现了大于3个用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。

        如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么OK。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。

    2.业务操作响应时间:

        • 分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用“事务性能摘要”图,可以确定在方案执行期间响应时间过长的事务。

    • 细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?

    • 如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用“网络监视器”图确定导致性能瓶颈的网络问题

    3.服务器资源监控指标:

    内存:

    1 UNIX资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。

    2 Windows资源监控中,如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。

    内存资源成为系统性能的瓶颈的征兆:

    很高的换页率(high pageout rate);

    进程进入不活动状态;

    交换区所有磁盘的活动次数可高;

    可高的全局系统CPU利用率; 

    内存不够出错(out of memory errors)

    处理器:

    1 UNIX资源监控(Windows操作系统同理)中指标CPU占用率(CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL Server,可接受的最大上限是80-85% 

    合理使用的范围在60%至70%。

    2 Windows资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。

    CPU资源成为系统性能的瓶颈的征兆: 

    很慢的响应时间(slow response time) 

    CPU空闲时间为零(zero percent idle CPU) 

    过高的用户占用CPU时间(high percent user CPU) 

    过高的系统占用CPU时间(high percent system CPU) 

    长时间的有很长的运行进程队列(large run queue size sustained over time)

    磁盘I/O:

    1 UNIX资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。

    2 Windows资源监控中,如果 Disk Time和Avg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。

    I/O资源成为系统性能的瓶颈的征兆 :

    过高的磁盘利用率(high disk utilization) 

    太长的磁盘等待队列(large disk queue length) 

    等待磁盘I/O的时间所占的百分率太高(large percentage of time waiting for disk I/O) 

    太高的物理I/O速率:large physical I/O rate(not sufficient in itself) 

    过低的缓存命中率(low buffer cache hit ratio(not sufficient in itself)) 

    太长的运行进程队列,但CPU却空闲(large run queue with idle CPU)

    4.数据库服务器:

    SQL Server数据库:

    1 SQLServer资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。

    2 如果Full Scans/sec(全表扫描/秒)计数器显示的值比1或2高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。 

    3 Number of Deadlocks/sec(死锁的数量/秒):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0。

    4 Lock Requests/sec(锁请求/秒),通过优化查询来减少读取次数,可以减少该计数器的值。

    Oracle数据库:

    1 如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。

    快存(共享SQL区)和数据字典快存的命中率: 

    select(sum(pins-reloads))/sum(pins) from v$librarycache; 

    select(sum(gets-getmisses))/sum(gets) from v$rowcache; 

    自由内存: select * from v$sgastat where name=’free memory’; 

    2 如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。

    缓冲区高速缓存命中率:

    select name,value from v$sysstat where name in (’db block gets’,

    ‘consistent gets’,'physical reads’) ;

    Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))

    3 如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。

    日志缓冲区的申请情况 :

    select name,value from v$sysstat where name = ‘redo log space requests’ ;

    4 如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序 。

    内存排序命中率 :

    select round((100*b.value)/decode((a.value+b.value), 0, 1, (a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name=’sorts (disk)’ and b.name=’sorts (memory)’

    注:上述SQL Server和Oracle数据库分析,只是一些简单、基本的分析,特别是Oracle数据库的分析和优化,是一门专门的技术,进一步的分析可查相关资料。

  • loadRunner资料整理(性能测试)转载

    2007-06-09 14:08:21

    loadRunner资料整理(性能测试)转载

    2007-05-25 14:36:18 / 个人分类:性能测试

    loadRunner资料整理(性能测试
    环境搭建
    1.安装LR8.0版本
    a.到\doc复制安装包到本地,解压后,里面有2个文件:Loadrunner 8.0 (Web Site Load Test Tool - Good).iso和说明.txt(10000并发用户注册码)
    b.用光驱工具(DAEMON Tools)打开iso镜像文件,安装LR
    c.安装过程注意:光驱工具在/doc中的daemon347.exe
                   按默认步骤一步步安装下来
    二.web性能测试计划
    1.性能测试基本概念
       性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。
    负载测试和压力测试都属于性能测试,两者可以结合进行。
    通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。
    压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。
    2.什么时候需要做web性能测试
       一般来说,开发人员或项目经理会提出需求,帮忙测下某个网站或某个功能点的性能如何?所以基本的测试需求和性能标准需要自己来设定。
       首先先了解到测试的范围,如果是整个网站的性能水平,则选择网页流量最多的几个页面,进行页面概率测试,首先判断出该网站流量最大的页面有:首页,下载页,个人管理页,广告页,等等其他页面。页面和页面之间的流量也存在着某种关系。假使用户群的20%会浏览首页,其中20%中的80%会到下载页面,20%会进入个人管理页面,20%会进入广告页面。
       如果是某个功能的测试,可以先进行试探性的测试,可以开始录制基本的脚本。例如测试网站注册功能的性能如何?先得出基本的性能标准。
       这次我要测的是网站的注册性能。首先注册功能的功能测试要全部通过,保证功能上没有问题。然后分析所测对象的模块结构是如何的?注册方式有3种:直接注册,第三方帐号注册,手机注册。其中预期到直接注册和第三帐号的注册量最大,所以测试2种方式下的注册性能如何。那么这次的性能测试范围就是直接注册了。然后在考虑测试环境
       测试工具:LoadRunner工具模拟多用户并发请求注册的客户端请求。那么如何模拟这个压力,如何得出压力过程中网站的是否稳定,事务的失败率是否太大?这些都要在开始压力之前想好。
    3.Web性能测试计划
       5W:“5W”规则指的是“What(做什么)”、“Why(为什么做)”、“When(何时做)”、“Where(在哪里)”、“How(如何做)”
       做什么:也就是测试范围,测试web注册系统性能是否满足用户需求?

       为什么做:在上线之前,或用户快速增长之后,及早的验证系统是否能支持多用户同时注册,以免在线时才发现系统承载不了。
       何时做:也就是测试任务的时间,基本上要1个星期的时间。
       在哪里:需要2台测试机,一台是web服务(注册系统,linux系统),一台是压力测试专用机(安装LR,windows系统)。另外需要准备一个自己的观察机(远程桌面操作并观察压力2台系统的结果)。
       如何做:也就是测试脚本的录制和测试场景的设置了。有几个问题必须先考虑清楚才开始做,LoadRunner能做些什么?
    a.功能是一个什么流程?用户点击页面->下一步到号码页面->用户输入验证码->设置用户密码->后台注册成功(数据库日志)->用户注册成功
    b. LoadRunner 通过使用虚拟用户来代替实际用户来减少人员要求。这些Vuser 模拟实际用户的行为(也就是注册)
    c. LoadRunner 联机监视应用程序的性能,使您可以在测试执行期间对您的系统进行微调。从服务器的性能调试还是代码的性能调试。
    d. LoadRunner 在测试过程中会自动记录应用程序的性能。您可以从众多的图和报告中进行选择以查看性能数据。
    e. LoadRunner 可检查出现性能延迟的地方:网络或客户端延迟、CPU 性能、I/O延迟、数据库锁定和数据库服务器上的其他问题。LoadRunner 将监视网络和服务器资源以帮助改进性能。
    f.性能测试并不是1次2次就能完成的工作,可能需要多轮的场景设置然后观察。
    三.一轮测试的整个过程
    1.规划测试
    也就是刚才所说的性能测试计划,想好第一探测要怎么做,从最表面的性能指标观察(响应时间,定义明确的测试计划确保方案能完成本次测试的目标
    2.创建user脚本
    录制单个用户完成整个功能时所做的动作(用户点击页面->下一步到号码页面->用户输入验证码->设置用户密码->后台注册成功(数据库及日志)->用户注册成功),而且后面的方案需要,可以设置单个用户反复录制该脚本的次数
    3.创建方案(测试场景)
    设置整个压力过程中,客户端请求动作的所有情况,你可以设置用户数量,多个脚本的百分比,而且还可以创建面向目标的方案,在其中定义你希望达到的测试目标,LR将根据你所设置的目标自动为你创建方案。
    4.运行方案(在运行前,先想好需要监视那些数据)
    第一次运行方案时,你可以观察下监视的性能指标图表变化,看是否有太大的异常,因为初次用工具肯定会有些问题,这时候可以查找答案排除问题。
    5.监视方案(LR能满足大部分的性能指标观察,但有些性能指标需要自己写些sh脚本录制)
    你可以观察用户加载数量,事务成功数,系统资源,web资源,WEB服务器资源,web应用程序服务器资源,数据库服务资源,网络吞吐量等。
    6.分析测试结果,得出更有效的下一步测试用例设计
    LR可以记录下不同负载下的性能数据,可以使用图表和报告来分析应用程序的性能,而这一环节也是最难的一步
    四.测试计划
    1.分析应用程序
    分析单用户完成整个功能的过程:用户从客户端机发出请求,网络环境,web服务器响应请求,数据库服务器保存结果
    先不考虑网络环境的瓶颈,在内网中进行性能测试
    2.定义测试目标
    度量最终用户的响应时间:完成一个注册需要多长时间
    定义最优的硬件配置:哪一种硬件配置可以提供最佳性能
    检查可靠性系统:无错误或无故障运行的时间长度或难度
    度量系统容量在没有显著性能下降的前提下,系统能够处理多大的负载:确定瓶颈哪些因素会延长响应时间
    3.计划测试实施方案
    定义用户的活动,一个用户的请求可以定义为一个事务,而且可以在脚本中设置集合点:指示多个用户同一时刻执行。
    4.检测测试目标
     度量最终用户响应时间:从客户端请求到服务器响应完毕所花费的时间
     定义最优的硬件配置(服务器的):检查各项系统配置对性能测试的影响
     检查可靠性:确定系统在高工作长期负载下的稳定性级别
    确定瓶颈(客户端,网络,服务器,数据库服务器,程序)
    五.录制脚本
    虚拟用户模拟实际用户的操作,开始录制(url,action),在页面上操作,完成注册后,停止脚本录制。就可以得出整个虚拟用户注册过程客户端部分的行为录制了。
    录制基本的vuser脚本
    VuGen 通过录制浏览器和 Web 服务器之间的活动来创建 Web Vuser 脚本。VuGen 监控系统的客户端(浏览器),并跟踪所有发送到服务器以及从服务器接收的请求。
    在 VuGen 中或从 LoadRunner Controller 运行录制的 Vuser 脚本时, Vuser 将与服务器直接通信,无需依赖客户端软件。而 Vuser 脚本则通过 API 函数直接执行对 Web 服务器的调用。
    过程:新建脚本->设置录制选项为action->录制浏览网站时执行的操作->终止操作
    增强并编辑脚本
    通过插入事务、集合点、检查和服务步骤来增强 Vuser 脚本。需要的话还可以定义参数(有变量时),vuser_init 和 vuser_end 部分通常用于录制服务器登录和注销过程。
    配置运行时设置
    以独立模式运行vuser脚本
    调试脚本,查看脚本是否有错。
    脚本保存,以便集成到LR方案中
    保存脚本。
    六.设置方案
    1.选择方案类型
    选择下列两个选项之一:
    a.手动方案:如果要生成手动方案,请选择此方法。通过创建组并指定脚本、负载
    生成器和每组中包括的 Vuser 数,可以生成手动方案。
    使用百分比模式在脚本间分配Vuser,如果要通过指定许多要在选定 Vuser 脚
    本间分配的 Vuser 来生成手动方案,请选择此选项。
    b.面向目标的方案:选择此方法可让 LoadRunner 为您生成方案。在面向目标的方
    案中,可以定义通过测试要实现的目标, LoadRunner 将根据这些目标自动生成
    方案。
    2.选择脚本
    选择刚刚保存录制的脚本
    3.设计方案
    a.“方案计划”窗格显示了与计划配置文件有关的信息:名称、计划模式、方案持
    续时间、负载行为和方案中要使用的 Vuser 总数。“负载预览”显示已定义方案
    计划的预览图。
    主要用途是设置虚拟用户的加载数,以及用户随着时间的增长如何加载用户数量(上升虚拟用户数,保持最高用户数,下降讯用户数),而且可以指示 LoadRunner 在一段延迟之后开始执行方
    案。您可以指定让 LoadRunner 自发出Run命令以来等待的分钟数,也可以指定让方案开始的特定时间。
    设置相同的时间加载一定的用户数量,直到全部加载完毕为止,这样设置的目的是为了方便记录用户数量明显增大时,性能指标的变化情况。
    b.“方案脚本”窗格列出了所有启用和禁用的 Vuser 脚本、脚本路径、负载生成器
    计算机以及分配给每个脚本的 Vuser 在总数中所占的百分比。
    4.预设计方案输出窗口,监视vuser状态。需要加进你想要的性能指标图表
    七.执行方案
    开始执行方案,保存执行方案的结果。方案将会持续你所设计的时间限制,也可以在中途手工停止或某些条件下停止。
    八.监视方案
    1.运行时和事务监视
    a.正在运行的用户数,已加载时间,每秒点击次数(表明每个 Vuser 所运行的每一秒钟内对测试的网站有多少次点击(HTTP 请求)),通过的事务数,失败的事务数,错误数(点击后可看到具体的错误日志)。
    b.事务监视图
    事务响应时间
    每秒事务数(通过)
    每秒事务数(失败、停止)
    每秒事务总数(通过)
    2.Web 资源
    每秒点击次数图:每秒点击次数图将点击(HTTP 请求) Web 服务器的次数显示为方案已用时间的函数。可将此图与事务响应时间图进行比较,以查看点击次数对事务性能产生的影响。
    吞吐量图:吞吐量图显示 Web 服务器在 方案运行的每一秒中的吞吐量。吞吐量的度量单位是字节,表示 Vuser 在任何给定的某一秒上从服务器获得的数据量。可将此图与事务响应时间图进行比较,以查看吞吐量对事务性能产生的影响。
    每秒 HTTP 响应数图:每秒=eqqm=响应数图显示方案运行的每一秒(X 轴)中从 Web 服务器返回的HTTP 状态代码数(Y 轴), HTTP 状态代码表示 HTTP 请求的状态,例如“请
    求成功”、“找不到此页”。
    每秒下载页数图:每秒下载页数图显示方案运行的每一秒(X 轴)中从服务器下载的网页数
    (Y 轴)。使用此图可依据下载的页数来计算 Vuser 生成的负载量。
    3.系统资源
    拖进“运行”新图-Unix资源。显示“添加计算机”对话框,该对话框可用于在现有列表中添加要监视的计算机(服务器)。输入要监视的计算机的名称或 IP 地址以及unix平台。但服务器需要配置unix中的rstatd守护程序才能监视。
    a.配置rstatd守护程序
    具体安装说明及安装包在:E:\压力测试\Linux系统资源配置下
    4.Web 服务器资源
    a.配置 Apache 监视器
    将apache图拖进“运行”视图中,单击“添加”输入要监视计算机的服务器名或 IP 地址。选择计算机运行的平台,并单击“添加”选择要监视的资源度量
    了解服务器统计信息 URL:http://192.168.1.22:80/server-status?auto
    5.数据库服务器资源(未使用过)
    6。还可添加新图,观测需要观测的图表数据
    九.分析性能测试数据
    1.Vuser 图
    在方案执行过程中, Vuser 在执行事务时生成数据。使用 Vuser 图可以确定方案执行期间 Vuser 的整体行为。它们显示 Vuser 状态、完成脚本的 Vuser 的数量以及集合统计信息。将这些图与事务图结合使用可以确定 Vuser 的数量对事务响应时间产生的影响。
    a. “正在运行的 Vuser”图显示在测试期间的每一秒内,执行 Vuser 脚本的 Vuser 的数量及它们的状态。此图可用于确定任何给定环境中服务器上的 Vuser 负载
    b. “Vuser 摘要”图显示 Vuser 性能的摘要。使用此图可以查看成功地完成方案运行的 Vuser 的数量与未成功完成 Vuser 数量之比。
    2.错误图
    在方案执行期间, Vuser 可能没有成功地完成所有事务。通过“错误”图可以查
    看有关失败的、停止的或因错误而终止的事务的信息。使用“错误”图,可以查
    看方案执行期间发生的错误的摘要以及平均每秒发生的错误数。
    3.事务图
    a.“平均事务响应时间”图显示在方案运行期间每一秒内执行事务所用的平均时间。
    b.“每秒事务数”图显示在方案运行的每一秒中,每个事务通过、失败以及停止的次数。此图可帮助您确定系统在任何给定时刻的实际事务负载。您可以将此图与平均事务响应时间图进行对比,以分析事务数目对执行时间的影响。
    c. “每秒事务总数”图显示方案运行的每一秒中,通过的事务总数、失败的事务总数以及停止的事务总数。
    4.Web 资源图
    a.“每秒点击次数”图显示在方案运行过程中 Vuser 每秒向 Web 服务器提交的HTTP 请求数。借助此图可依据点击次数来评估 Vuser 产生的负载量。可将此图与“平均事务响应时间”图进行比较,以查看点击次数对事务性能产生影响。
    b. “吞吐量”图显示方案运行过程中服务器上每秒的吞吐量。吞吐量的度量单位是字节,表示 Vuser 在任何给定的某一秒上从服务器获得的数据量。借助此图您可以依据服务器吞吐量来评估 Vuser 产生的负载量。可将此图与“平均事务响应时间”图进行比较,以查看吞吐量对事务性能产生影响。
    c. “每秒下载页面数”图显示方案运行(X 轴)过程中每秒钟从服务器下载的网页数(Y 轴)。可借助此图依据下载的页面数来评估 Vuser 产生的负载量。
    和吞吐量一样,每秒下载的页面数表示 Vuser 在给定的任一秒内从服务器接收到的数据量。但是吞吐量图考虑的是各个资源及其大小(例如,每个 .gif 文件的大小、每个网页的大小)。而每秒下载页面数图只考虑页面数。
    5.网页细分图
    a.“网页细分”图可以评估页面内容是否影响事务响应时间。使用网页细分图可以分析网站上有问题的元素(例如下载很慢的图像或中断的链接)。
    6.用户定义的数据点图
    7.系统资源图
    “UNIX 资源”图显示在方案运行期间度量的 UNIX 资源。此图可帮助您确定 Vuser 负载对各种系统资源的影响。
    8.网络监视器图
    使用网络监视器图,可以确定网络是否是造成瓶颈的原因。如果网络出现问题,则可以找到故障网段,以便解决该问题。
    9.Web 服务器资源图
    Apache 服务器图将服务器统计信息显示为方案已用时间的函数。
    10.摘要
    “摘要”报告提供有关执行方案的一般信息。列出关于方案运行的统计信息,并提供指向下列各图的链接:正在运行的 Vuser、吞吐量、每秒点击次数、每秒 HTTP 响应数、事务摘要和平均事务响应时间。
    11.自己制作测试报告
    各种表本身是有许多数据组合,找到你想要的数据,导出成excel文件形式,可以在excel中做出你想要看见的图表(曲线图之类的)。

  • 性能测试总结

    2007-06-09 14:06:38

    性能测试总结

    2007-06-07 18:09:06 / 个人分类:性能测试

    在论坛混了多日,发现越来越多的性能测试工程师基本上都能够掌握利用测试工具来作负载压力测试,但多数人对怎样去分析工具收集到的测试结果感到无从下手,下面我就把个人工作中的体会和收集到的有关资料整理出来,希望能对大家分析测试结果有所帮助。

    分析原则:


    &#8226;
    具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)


    &#8226;
    查找瓶颈时按以下顺序,由易到难。


    服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)


    注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。


    &#8226;
    分段排除法 很有效


    分析的信息来源:


    &#8226;1
    根据场景运行过程中的错误提示信息


    &#8226;2
    根据测试结果收集到的监控指标数据


    一.错误提示分析


    分析实例:


    1 &#8226;Error: Failed to connect to server “10.10.10.30:8080″: [10060] Connection

    &#8226;Error: timed out Error: Server “10.10.10.30″ has shut down the connection prematurely

    分析:


    &#8226;A
    、应用服务死掉。


    (小用户时:程序上的问题。程序上处理数据库的问题)


    &#8226;B
    、应用服务没有死


    (应用服务参数设置问题)


    例:在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25


    &#8226;C
    、数据库的连接


    (1
    、在应用服务的性能参数可能太小了 2、数据库启动的最大连接数(跟硬件的内存有关)
    )

    2 Error: Page download timeout (120 seconds) has expired

    分析:可能是以下原因造成


    &#8226;A
    、应用服务参数设置太大导致服务器的瓶颈


    &#8226;B
    、页面中图片太多


    &#8226;C
    、在程序处理表的时候检查字段太大多


    二.监控指标数据分析


    1
    .最大并发用户数:


    应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。


    在方案运行中,如果出现了大于3个用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。


    如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么OK。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。


    2
    .业务操作响应时间:


    &#8226;
    分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用事务性能摘要图,可以确定在方案执行期间响应时间过长的事务。


    &#8226;
    细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?


    &#8226;
    如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用网络监视器图确定导致性能瓶颈的网络问题


    3
    .服务器资源监控指标:


    内存:


    1 UNIX
    资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。


    2 Windows
    资源监控中,如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。


    内存资源成为系统性能的瓶颈的征兆
    :

    很高的换页率
    (high pageout rate);

    进程进入不活动状态
    ;

    交换区所有磁盘的活动次数可高
    ;

    可高的全局系统CPU利用率
    ;

    内存不够出错
    (out of memory errors)

    处理器:


    1 UNIX
    资源监控(Windows操作系统同理)中指标CPU占用率(CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL Server,可接受的最大上限是
    80-85%

    合理使用的范围在60%70%


    2 Windows
    资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。


    CPU
    资源成为系统性能的瓶颈的征兆
    :

    很慢的响应时间
    (slow response time)

    CPU
    空闲时间为零
    (zero percent idle CPU)

    过高的用户占用CPU时间
    (high percent user CPU)

    过高的系统占用CPU时间
    (high percent system CPU)

    长时间的有很长的运行进程队列
    (large run queue size sustained over time)

    磁盘I/O


    1 UNIX
    资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。


    2 Windows
    资源监控中,如果 Disk TimeAvg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。


    I/O
    资源成为系统性能的瓶颈的征兆
    :

    过高的磁盘利用率
    (high disk utilization)

    太长的磁盘等待队列
    (large disk queue length)

    等待磁盘I/O的时间所占的百分率太高
    (large percentage of time waiting for disk I/O)

    太高的物理I/O速率
    :large physical I/O rate(not sufficient in itself)

    过低的缓存命中率
    (low buffer cache hit ratio(not sufficient in itself))

    太长的运行进程队列,但CPU却空闲
    (large run queue with idle CPU)

    4
    .数据库服务器:


    SQL Server
    数据库:


    1 SQLServer
    资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。


    2
    如果Full Scans/sec(全表扫描/秒)计数器显示的值比12高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。


    3 Number of Deadlocks/sec(
    死锁的数量/):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0


    4 Lock Requests/sec(
    锁请求/),通过优化查询来减少读取次数,可以减少该计数器的值。


    Oracle
    数据库:


    1
    如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。


    快存(共享SQL区)和数据字典快存的命中率:


    select(sum(pins-reloads))/sum(pins) from v$librarycache;

    select(sum(gets-getmisses))/sum(gets) from v$rowcache;

    自由内存:
    select * from v$sgastat where name=’free memory’;

    2
    如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。


    缓冲区高速缓存命中率:


    select name,value from v$sysstat where name in (’db block gets’,

    ‘consistent gets’,'physical reads’) ;

    Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))

    3
    如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。


    日志缓冲区的申请情况


    select name,value from v$sysstat where name = ‘redo log space requests’ ;

    4
    如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序


    内存排序命中率


    select round((100*b.value)/decode((a.value+b.value), 0, 1, (a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name=’sorts (disk)’ and b.name=’sorts (memory)’

    注:上述SQL ServerOracle数据库分析,只是一些简单、基本的分析,特别是Oracle数据库的分析和优化,是一门专门的技术,进一步的分析可查相关资料。









    性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。
    一、概述

         
    性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。中国软件评测中心将性能测试概括为三个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。通常情况下,三方面有效、合理的结合,可以达到对系统性能全面的分析和瓶颈的预测。
        ·
    应用在客户端性能的测试
    应用在客户端性能测试的目的是考察客户端应用的性能,测试的入口是客户端。它主要包括并发性能测试、疲劳强度测试、大数据量测试和速度测试等,其中并发性能测试是重点。
         
    并发性能测试是重点
    并发性能测试的过程是一个负载测试和压力测试的过程,即逐渐增加负载,直到系统的瓶颈或者不能接收的性能点,通过综合分析交易执行指标和资源监控指标来确定系统并发性能的过程。负载测试(Load Testing)是确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统组成部分的相应输出项,例如通过量、响应时间、CPU负载、内存使用等来决定系统的性能。负载测试是一个分析软件应用程序和支撑架构、模拟真实环境的使用,从而来确定能够接收的性能过程。压力测试(Stress Testing)是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。
    并发性能测试的目的主要体现在三个方面:以真实的业务为依据,选择有代表性的、关键的业务操作设计测试案例,以评价系统的当前性能;当扩展应用程序的功能或者新的应用程序将要被部署时,负载测试会帮助确定系统是否还能够处理期望的用户负载,以预测系统的未来性能;通过模拟成百上千个用户,重复执行和运行测试,可以确认性能瓶颈并优化和调整应用,目的在于寻找到瓶颈问题。
    当一家企业自己组织力量或委托软件公司代为开发一套应用系统的时候,尤其是以后在生产环境中实际使用起来,用户往往会产生疑问,这套系统能不能承受大量的并发用户同时访问? 这类问题最常见于采用联机事务处理(OLTP)方式数据库应用、Web浏览和视频点播等系统。这种问题的解决要借助于科学的软件测试手段和先进的测试工具。
         
    举例说明:电信计费软件
    众所周知,每月20日左右是市话交费的高峰期,全市几千个收费网点同时启动。收费过程一般分为两步,首先要根据用户提出的电话号码来查询出其当月产生费用,然后收取现金并将此用户修改为已交费状态。一个用户看起来简单的两个步骤,但当成百上千的终端,同时执行这样的操作时,情况就大不一样了,如此众多的交易同时发生,对应用程序本身、操作系统、中心数据库服务器、中间件服务器、网络设备的承受力都是一个严峻的考验。决策者不可能在发生问题后才考虑系统的承受力, 预见软件的并发承受力, 这是在软件测试阶段就应该解决的问题。
    目前,大多数公司企业需要支持成百上千名用户,各类应用环境以及由不同供应商提供的元件组装起来的复杂产品,难以预知的用户负载和愈来愈复杂的应用程序,使公司担忧会发生投放性能差、用户遭受反应慢、系统失灵等问题。其结果就是导致公司收益的损失。
    如何模拟实际情况呢? 找若干台电脑和同样数目的操作人员在同一时刻进行操作,然后拿秒表记录下反应时间? 这样的手工作坊式的测试方法不切实际,且无法捕捉程序内部变化情况,这样就需要压力测试工具的辅助。
    测试的基本策略是自动负载测试,通过在一台或几台PC机上模拟成百或上千的虚拟用户同时执行业务的情景,对应用程序进行测试,同时记录下每一事务处理的时间、中间件服务器峰值数据、数据库状态等。通过可重复的、真实的测试能够彻底地度量应用的可扩展性和性能,确定问题所在以及优化系统性能。预先知道了系统的承受力,就为最终用户规划整个运行环境的配置提供了有力的依据。
         
    并发性能测试前的准备工作
    测试环境:配置测试环境是测试实施的一个重要阶段,测试环境的适合与否会严重影响测试结果的真实性和正确性。测试环境包括硬件环境和软件环境,硬件环境指测试必需的服务器、客户端、网络连接设备以及打印机/扫描仪等辅助硬件设备所构成的环境;软件环境指被测软件运行时的操作系统、数据库及其他应用软件构成的环境。
    一个充分准备好的测试环境有三个优点:一个稳定、可重复的测试环境,能够保证测试结果的正确;保证达到测试执行的技术需求;保证得到正确的、可重复的以及易理解的测试结果。
    测试工具:并发性能测试是在客户端执行的黑盒测试,一般不采用手工方式,而是利用工具采用自动化方式进行。目前,成熟的并发性能测试工具有很多,选择的依据主要是测试需求和性能价格比。著名的并发性能测试工具有QALoadLoadRunnerBenchmark FactoryWebstress等。这些测试工具都是自动化负载测试工具,通过可重复的、真实的测试,能够彻底地度量应用的可扩展性和性能,可以在整个开发生命周期、跨越多种平台、自动执行测试任务,可以模拟成百上千的用户并发执行关键业务而完成对应用程序的测试。
    测试数据:在初始的测试环境中需要输入一些适当的测试数据,目的是识别数据状态并且验证用于测试的测试案例,在正式的测试开始以前对测试案例进行调试,将正式测试开始时的错误降到最低。在测试进行到关键过程环节时,非常有必要进行数据状态的备份。制造初始数据意味着将合适的数据存储下来,需要的时候恢复它,初始数据提供了一个基线用来评估测试执行的结果。
    在测试正式执行时,还需要准备业务测试数据,比如测试并发查询业务,那么要求对应的数据库和表中有相当的数据量以及数据的种类应能覆盖全部业务。
    模拟真实环境测试,有些软件,特别是面向大众的商品化软件,在测试时常常需要考察在真实环境中的表现。如测试杀毒软件的扫描速度时,硬盘上布置的不同类型文件的比例要尽量接近真实环境,这样测试出来的数据才有实际意义。
         
    并发性能测试的种类与指标
    并发性能测试的种类取决于并发性能测试工具监控的对象,以QALoad自动化负载测试工具为例。软件针对各种测试目标提供了DB2DCOMODBCORACLENETLoadCorbaQARunSAPSQLServerSybaseTelnetTUXEDOUNIFACEWinSockWWWJava scrīpt等不同的监控对象,支持WindowsUNIX测试环境。
    最关键的仍然是测试过程中对监控对象的灵活应用,例如目前三层结构的运行模式广泛使用,对中间件的并发性能测试作为问题被提到议事日程上来,许多系统都采用了国产中间件,选择Java scrīpt监控对象,手工编写脚本,可以达到测试目的。
    采用自动化负载测试工具执行的并发性能测试,基本遵循的测试过程有:测试需求与测试内容,测试案例制定,测试环境准备,测试脚本录制、编写与调试,脚本分配、回放配置与加载策略,测试执行跟踪,结果分析与定位问题所在,测试报告与测试评估。
    并发性能测试监控的对象不同,测试的主要指标也不相同,主要的测试指标包括交易处理性能指标和UNIX资源监控。其中,交易处理性能指标包括交易结果、每分钟交易数、交易响应时间(Min:最小服务器响应时间;Mean:平均服务器响应时间;Max:最大服务器响应时间;StdDev:事务处理服务器响应的偏差,值越大,偏差越大;Median:中值响应时间;90%:90%事务处理的服务器响应时间)、虚拟并发用户数。
         
    应用实例:新华社多媒体数据库 V1.0”性能测试
    中国软件评测中心(CSTC)根据新华社技术局提出的《多媒体数据库(一期)性能测试需求》和GB/T 17544《软件包质量要求和测试》的国家标准,使用工业标准级负载测试工具对新华社使用的新华社多媒体数据库 V1.0”进行了性能测试。
    性能测试的目的是模拟多用户并发访问新华社多媒体数据库,执行关键检索业务,分析系统性能。
    性能测试的重点是针对系统并发压力负载较大的主要检索业务,进行并发测试和疲劳测试,系统采用B/S运行模式。并发测试设计了特定时间段内分别在中文库、英文库、图片库中进行单检索词、多检索词以及变检索式、混合检索业务等并发测试案例。疲劳测试案例为在中文库中并发用户数200,进行测试周期约8小时的单检索词检索。在进行并发和疲劳测试的同时,监测的测试指标包括交易处理性能以及UNIXLinux)、OracleApache资源等。
    测试结论:在新华社机房测试环境和内网测试环境中,100M带宽情况下,针对规定的各并发测试案例,系统能够承受并发用户数为200的负载压力,最大交易数/分钟达到78.73,运行基本稳定,但随着负载压力增大,系统性能有所衰减。
    系统能够承受200 查看(419) 评论(0) 收藏 分享 管理

  • LoadRunner函数中文翻译系列之一--Action

    2007-06-08 10:47:37

    web_url

    语法:

    Int Web_url(const char *name, const char * url, <Lists of Attributes>, [EXTRARES,<Lists of Resource Attributes>,LAST)

    返回值

    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)

    参数:

    NameVuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

    url:页面url地址。

    List of Attributes

    EXTRARES:分隔符,标记下一个参数是资源属性的列表了。

    List of Resource Attributes

    LAST:属性列表结束的标记符。

    说明

    Web_url根据函数中的URL属性加载对应的URL,不需要上下文。

    只有VuGen处于URL-based或者HTML-based(此时A scrīpt containing explicit URLs only选项被选中时)的录制模式时,web_url才会被录制到。

    可以使用web_url 模拟从FTP服务器上下载文件。web_url 函数会使FTP服务器执行文件被真实下载时的操作。除非手工指定了"FtpAscii=1",下载会以二进制模式完成。

    在录制选项中,ToosRecording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gifjpg图象文件。

    通过修改HTTP头可以传递给服务器一些附加的请求信息。使用HTTP头允许请求中包含其他的内容类型(Content_type),象压缩文件一样。还可以只请求特定状态下的web页面。

    所有的Web Vusers HTTP模式下的WAP Vusers或者回放模式下的Wireless Session ProtocolWSP),都支持web_url函数。

     

    web_image

    语法:

    Int web_image (const char *StepName, <List of Attributes>, [EXTRARES, <List of Resource Attributes>,] LAST );

    返回值

    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)

    参数:

    StepNameVuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

    List of Attributes(服务器端和客户端映射的图片):SRC属性是一定会被录制到的,其他的ALTFrameTargetFrameOrdinal则是有的话会被录制到。

    1ALT:描述图象的元素。用鼠标指向图象时,所浮出来的文字提示。

    2SRC:描述图象的元素,可以是图象的文件名. 如: button.gif。也可以使用SRC/SFX来指定图象路径的后缀。所有拥有相同此后缀的字符串都会被匹配到。

    3Frame:录制操作时所在的Frame的名称。

    4TargetFrame:见List of Attributes的同名参数。

    5Ordinal参见Web_link的同名参数。

    List of Attributes(客户端映射的图片):

    1AreaAlt:鼠标单击区域的ALT属性。

    2AreaOrdinal:鼠标单击区域的顺序号。

    3MapName:图象的映射名。 

    List of Attributes(服务器端映射的图片):尽管点击坐标不属于属性,但还是以属性的格式来使用。

    1Xcoord:点击图象时的X坐标。

    2Ycoord:点击图象时的Y坐标。

    EXTRARES:分隔符,标记下一个参数是资源属性的列表了。

    List of Resource Attributes:参见List of Resource Attributes一节。

    LAST:属性列表结束的标记符。

    说明

    web_image模拟鼠标在指定图片上的单击动作。此函数必须在有前置操作的上下文中使用。

    ToosRecording Option,如果录制级别设为基于HMTL的录制方式时,web_image才会被录制到。

    web_image支持客户端(client-side)和服务器端server-side的图片映射。

    在录制选项中,ToosRecording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gifjpg图象文件。

    通过修改HTTP头可以传递给服务器一些请求附加信息。使用HTTP头允许请求中包含内容,如同压缩文件一样。还可以只请求特定状态的web页面。

    web_image支持Web虚拟用户,不支持WAP虚拟用户。

    例子

    下面的例子模拟用户单击Home图标以回到主页(黑体部分):

    web_url("my_home", "URL=http://my_home/", LAST)

    web_link("Employees", "Text=Employees", LAST)

    web_image("Home.gif", "SRC=../gifs/Buttons/Home.gif", LAST)

    web_link("Library", "Text=Library", LAST)

    web_image("Home.gif", "SRC=../../gifs/buttons/Home.gif", LAST)

    下面的例子模拟用户在客户端映射的图片上单击:

    web_image("dpt_house.gif",

           "Src=../gifs/dpt_house.gif",

           "MapName=dpt_house",

           "AreaOrdinal=4",

           LAST)

    下面的例子模拟用户在服务端映射的图片上单击:

    web_image("The Web Developer's Virtual Library",

           "Alt=The Web Developer's Virtual Library",

           "Ordinal=1",

           "XCoord=91",

           "YCoord=17",

           LAST)

    下面是一个使用文件名后缀的例子:它指定了dpt_house.gif作为后缀,所以象../gifs/dpt_house.gif/gifs/dpt_house.gifgifs/dpt_house.gif/dpt_house.gif都会匹配到。

    web_image("dpt_house.gif",
            "Src/sfx=dpt_house.gif", LAST)

     

    web_link

    语法:

    Int web_link (const char *StepName, <List of Attributes>, [EXTRARES, <List of Resource Attributes>,] LAST )

    返回值

    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)

    参数:

    StepNameVuGen中树形视图中显示的名称,在自动事务设置中也被用做事务名称。

    List of Attributes:支持下列的属性:

    1.      Text:超链接中的文字,必须精确匹配。

    2.      Frame:录制操作时所在的Frame的名称。

    3.      TargetFrameResourceByteLimit:见List of Attributes一节。

    4.      Ordinal:如果用给出的属性(Attributes)筛选出的元素不唯一,那么VuGen使用此属性来指定其中的一个。例如:SRC=abc.gif”,“Ordinal=3标记的是SRC的值是“abc.gif”的第3张图片。

    EXTRARES:表明下面的参数将会是list of resource attributes了。

    LAST:结尾标示符。

    说明

    模拟鼠标在由若干个属性集合描述的链接上进行单击。此函数必须在前置动作的上下文中才可以执行。

    web_link 仅仅在基于HTML的录制方式中才会被VuGen捕捉到。

    HTML生成的资源的例子有.gif .jpg图像。对于List of Resource Attributes参数来说,仅仅当Recording Options--Recording --HTML-based scrīpt-- Record within the current scrīpt step选项被选中时,它们才会被插入到代码中。

    可以通过改变HTTP头信息给服务器传递一些附加信息。使用HTTP头信息可以,允许响应体中包含其他的内容类型(Content-Type),例如压缩文件,或者只有满足了特定的状态才去请求web页。

    此函数值支持Web虚拟用户,不支持WAP虚拟用户。

     

    web_submmit_form

    语法:

    Int web_submit_form (const char *StepName, <List of Attributes>, <List of Hidden Fields>, ITEMDATA, <List of Data Fields>, [ EXTRARES, <List of Resource Attributes>,] LAST );

    返回值

    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)

    参数:

    StepNameForm的名字。VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

    List of Attributes支持以下属性:

    1.      ActionForm中的ACTION属性,指定了完成Form中的操作用到的URL。也可以使用“Action/sfx” 表示使用此后缀的所有Action

    2.      Frame录制操作时所在的Frame的名称。

    3.      TargetFrameResourceByteLimitList of Attributes的同名参数。

    4.      Ordinal参见Web_link的同名参数。

    VuGen通过记录数据域唯一的标识每个Form。如果这样不足以识别FormVuGen会记录Action 属性。如果还不足以识别,则会记录Ordinal 属性,这种情况下不会记录Action属性。

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

744/4<1234