发布新日志

  • 如何在RedHat Linux中启动rstatd服务

    2008-10-17 11:21:33

    如何在RedHat Linux中启动rstatd服务
    2006-12-12    陈华       点击: 4629
    如何在RedHat Linux中启动rstatd服务

     

    启动portmap并确认进程的启动

    在安装前先运行 /sbin/portmap 进程,看111端口是否打开。

    # netstat -an   111端口打开,则portmap进程运行正常

     

    安装\配置\运行 rstatd 进程服务

    发表人:snappyboy | 发表时间: 2004年九月13日, 21:17

        这里介绍如何在RedHat Linux中启动rstatd服务,以便使用LoadRunner工具来监视Linux系统的性能情况。

    首先介绍一下在IBM AIX系统中如何启动rstatd服务(因为这个比较简单,顺便可以认识一下Unix系统)。使用telnetroot用户的身份登录入AIX系统,在命令行提示符下输入:

    vi /etc/inetd.conf

    在出现的界面中敲键盘:

    /rstatd

    命令解释:在打开的文档中查找“rstatd”,接下来继续敲键盘:

    x

    命令解释:删除当前字符,在这里为删除rstatd命令前的“#”,继续敲键盘:

    :wq

    命令解释:保存并退出,注意前面有个冒号。接着在命令提示符下输入:

    refresh –s inetd

    命令解释:重新启动服务。

    这样使用loadrunner就可以监视AIX系统的性能情况了。

    RedHat Linux中要麻烦一点......

     

    需要下载一个安装包rstatd.tar.gz,并且需要安装。比较复杂,安装包中具体的说明,为了简便起见,这里直接给出配置的命令。

    首先把rstatd.tar.gz文件放到用户目录下,进行解压(可以在windows下直接解压,然后把rpc.rstatd目录及其下所有文件拷贝到用户目录下)。然后进入rpc.rstatd目录,执行:

    ./configure

    命令解释:配置,详细的就不说了,反正它自己会执行的,命令执行完毕后再敲入:

    make

    命令解释:编译安装包,执行完毕后敲入:

    make install

    命令解释:安装程序、数据文件和其他文档。之后敲入:

    rpc.rstatd

    命令解释:运行rstatd服务。

    以上在RedhatLinux9下调试通过,RedhatLinux10下尚未通过。这时就可以使用LoadRunner监视此Linux的性能了。

    有关自动启动,在SuSE Linux 7.0 (kernel 2.2.16-suse18) and 7.1 (kernel 2.4)版本需要在/etc/inetd.conf文件中增加一行:

    rstatd/1-5 dgram     rpc/udp wait    root /usr/sbin/rpc.rstatd  rpc.rstatd

    RedhatLinux9中的自动启动和在RedhatLinux10需要再议:(

    验证RPC安装运行成功

    # rpcinfo –p 127.0.0.1 若有性能数据返回 ,具体参见如下步骤

     

    未启动rpc 前,通过rpcinfo 得到的数据为

    [root@EMS root]# rpcinfo -p 127.0.0.1

       program vers proto   port

        100000    2   tcp    111  portmapper

        100000    2   udp    111  portmapper

        100024    1   udp  32768  status

    100024    1   tcp  32768  status

     

    以上说明 portmapper启动了,但 rstatd 进程还没起来。

     

    [root@EMS root]# whereis rpc.rstatd

    rpc: /usr/src/patch-o-matic-ng-20040302/rpc /sbin/rpc.lockd /sbin/rpc.statd /usr/sbin/rpc.rquotad /usr/sbin/rpc.yppasswdd /usr/sbin/rpc.mountd /usr/sbin/rpc.nfsd /usr/sbin/rpc.ypxfrd /etc/rpc /usr/local/sbin/rpc.rstatd /usr/include/rpc /usr/share/man/man3/rpc.3.gz /usr/share/man/man5/rpc.5.gz

     

       whereis rpc.rstatd 命令是用来找 rpc.rstatd这个执行文件的路径。

     

    [root@EMS root]# /usr/sbin/rpc

    rpc.mountd     rpc.nfsd       rpc.rquotad    rpc.yppasswdd  rpc.ypxfrd     rpcinfo     

     

    通过 /usr/sbin/rpc 敲入制表符,则系统会提示其路径下是些什么文件. (作用类似于ls)

     

    [root@EMS root]# /usr/sbin/rpc.rquotad

    [root@EMS root]# /usr/lo        

    local       lost+found 

    [root@EMS root]# /usr/local/sbin/rpc.rstatd

     

    运行 rpc.rstatd命令

     

    [root@EMS root]# rpcinfo -p 127.0.0.1

       program vers proto   port

        100000    2   tcp    111  portmapper

        100000    2   udp    111  portmapper

        100024    1   udp  32768  status

        100024    1   tcp  32768  status

        100011    1   udp    688  rquotad

        100011    2   udp    688  rquotad

        100011    1   tcp    691  rquotad

        100011    2   tcp    691  rquotad

        100001    5   udp    699  rstatd

        100001    3   udp    699  rstatd

        100001    2   udp    699  rstatd

    100001    1   udp    699  rstatd

     

     

    此时检查到rstatd 已运行。

  • QTP描述性编程

    2008-06-18 16:09:23

    例1:获取单元格中的值
    thisText = Browser(…).Page(…).Frame.(…).WebTable("sample").GetCellData(2,1)
    例2:获取图片的名称
    ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")
    例3:检查某个对象是否存在,如果存在弹出对话框说明对象存在。
    If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then
    MsgBox("The object exists.")
    End if
    例4:描述性编程(descrīptive programming)
    1、descrīptive programming概述
    通常情况下,当在录制一个操作时,QTP会将被操作对象加入到对象库里(Object Repository)。一旦对象存在于对象库里,我们就可以在专家视图里通过添加相关的对象方法来对该对象进行操作。我们可以通过引用层次型对象库里的对象描述(Object Descrīption)来添加相应的方法。
    因为QTP对象库中的每个对象都具有唯一名称,所以在引用时对象名是必须需要指定的。然后在测试运行期间,QTP在对象库中根据这个对象的名称和父对象来查找对象,并使用为这个测试对象存储的测试对象描述,在网站或应用程序中标识该对象。
    例如我们用QTP录制Yahoo Mail登录情况时我们需要输入用户名,于是在录制时我们就会录下一个WebEdit对象,它的缺省逻辑名为“login”,该编辑字段位于名为“Yahoo! Mail - The best” 的页面上,并且该页面在浏览器中使用名称Yahoo!进行录制。如图所示,即为录制时的对象库的内容:


     
    那么如果我们想要应用该对象,就可以在专家视图输入以下信息:
    Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").Set “xxx”
    或者我们也可以调用一些方法,获取改对象在运行时的对象名,如:
    Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").GetROProperty(“name”)
    然而,我们可以发觉到,上面的例子在处理对象时,对象已经存在于对象库里,因此我们可以应用这个对象的逻辑名。实际使用中,情况往往并非如此简单,我们经常会遇到很多在页面上动态产生的对象,换而言之,对象库里没有这些对象,我们也无从引用。因此我们必须采用其他的技术来完成这类操作,这也就是我们需要讲解的Descrīptive Programming。
    为了满足上面提到的动态对象的处理问题,QTP允许用户通过将对象属性编码到测试脚本里来动态识别对象,这就是我们通常意义下称为的Descrīptive Programming。通过这种方式,我们可以指示QTP不通过引用对象库和对象名来对实际对象进行操作。具体操作中,我们只需要为QTP提供对象的一组属性和值,这样QTP就可以来识别相应的对象并对其进行操作。这相当于,告诉QTP要识别对象的一些关键特征,根据这些特征QTP就可以一一匹配然后识别出来这个对象。
    而且,更为重要的是,通过这种Descrīptive Programming的方式,还可以让QTP识别具有某些相同属性的对象。我们先来举个例子来看一下:我们假设当前的Windows系统中打开了若干的Yahoo主页面(多于一个),现在我们要关闭所有的正在浏览Yahoo主页面的浏览器。
    对于上面那个例子来说,我们先看一个简单一点的情况,假设只有且仅有一个Yahoo主页面:那么我们可以用下面的方法来
    Window("Text:=Yahoo! - Microsoft Internet Explorer").Close
    我们可以看到语句里我们要查找的对象是Window窗口标题为“Yahoo! - Microsoft Internet Explorer”,然后把它关闭,具体的语法说明我们稍后为解释。但是上面的语句仅仅适合前面提到的条件“只有且仅有一个Yahoo主页面”,如果有多个同样的窗口就会出错,原因是通过语句可以匹配到多个对象,而QTP不知道应该对哪个对象进行关闭动作。我们需要进一步的缩小匹配范围:
    Dim i
    i = 0
    while (Window("Text:="Yahoo!" - Microsoft Internet Explorer", "index:="&i).exist)
    Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).close
    i = i +1
    wend
    这里我们可以看到,对于具有相同属性的对象,我们可以通过index参数来对其进行区别,第一个对象为index=0,第二个为index=1等等,依次类推。当然我们还可以通过CreationTime和Location参数来定位对象,这里就不详细叙述了。
    通过上面的例子,我们对Descrīptive Programming有一个基本了解了,下面我们详细讲解一下Descrīptive Programming:在具体实现中,我们有两种类型的Descrīptive Programming方法。可以列出直接在测试语句中描述对象的属性和值的集合;或者向Descrīption 对象中添加属性和值的集合,然后在语句中输入Descrīption 对象的名称。下面我们分别举例介绍。
    2、直接在语句中输入编程描述
    通过多个指定描述对象的property:=value对,可以直接在语句中描述对象,这是最直接有效的方法。
    常规语法为:
    TestObject("PropertyName1:=PropertyValue1", "..." , "PropertyNameX:="PropertyValueX""}
    TestObject - 测试对象的类。
    PropertyName:=PropertyValue - 测试对象的属性及其值。各个property:="value" 对之间应用逗号和引号分开。
    例如:以下语句指定Mercury Tours 页面中名为author且索引值为3 的WebEdit 测试对象。当测试运行时,QTP 将查找具有匹配属性值的WebEdit 对象,并输入文本jojo。
    Browser("Mercury Tours").Page("Mercury Tours").WebEdit("Name:="Author"", "Index:="3"").Set "Mark Twain"
    我们也可以从从描述中的特定位置(从Page 对象描述开始)开始使用Descrīptive Programming。
    Browser("Mercury Tours").Page("Title:="Mercury" Tours").WebEdit("Name:="Author"", "Index:="3"").Set "jojo"
    此外,如果我们希望在在一个测试或组件中多次使用相同的Descrīptive Programming,则可以将创建的对象赋值给变量,这样使用会方便很多。
    例如:我们需要完成下面一系列操作
    Window("Text:=HyperSna").WinButton("Caption:=日期").Click
    Window("Text:=HyperSna").WinButton("Caption:=时间").Click
    Window("Text:=HyperSna").WinButton("Caption:=确定").Click
    那么,为了方便其见,我们可以将Window("Text:=HyperSna")赋值到一个变量,然后再使用,参见下面的代码:
    Set WinHyper = Window("Text:="HyperSna"")
    WinHyper.WinButton("Caption:=日期").Click
    WinHyper.WinButton("Caption:=时间").Click
    WinHyper.WinButton("Caption:=确定").Click
    如果使用了VBscrīpt里面的With语句,还可以简化为以下代码:
    With Window("Text:="HyperSna"")
    .WinButton("Caption:=日期").Click
    .WinButton("Caption:=时间").Click
    .WinButton("Caption:=确定").Click
    End With
    下面我们来看一个更为详细的例子,在QTP产品缺省安装里面自带了一个网上订机票的示例称为Mercury Tour,我们看一下在订票过程中何时需要用Descrīptive Programming。
    首先登入系统后,如果需要订票,就要先搜索航班,此时系统要求输入订票乘客的数量,假设我们在第一次录制脚本时选择了1个Passenger,并成功完成订票。然后,我们需要参数化乘客数量来测试订票系统,我们会发现回放会失败。原因在于,不同的乘客的数量导致在订票时需要输入每个乘客的姓名,而录制时,只输入了一个乘客的姓名。而乘客姓名的输入框是随着乘客数量的变化而动态生成的,我们不可能从对象库里得到没有录制的对象,因此必须使用Descrīptive Programming。


     
    在录制单个乘客时,我们得到的录制语句是:
    Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passFirst0").Set "Michael"
    Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passLast0").Set "Wang"
    显然WebEdit("passFirst0")和WebEdit("passLast0")是录制时产生的对象并存放到对象库里的。通过对象库,我们可以看到对象的属性如下


     
    系统对于发生多个FirstName时,命名规则是passFirst0,passFirst1…依次类推。因此只要通过简单的Descrīptive Programming就可以完成动态FirstName与LastName的识别工作。这里我们假设参数化的乘客数已经赋值给intPassNum,下面是脚本中的关键语句:
    counter = 0
    For i = 0 to (intPassNum)
    Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:="passFirst""&i).Set "Michael"
    Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:="passLast""&i).Set "Wang"
    counter = counter + 1
    Next
    3、使用descrīption对象
    使用Descrīption 对象可以返回包含一组Property 对象的Properties 集合对象。Property 对象由属性名和值组成。然后,可以在语句中指定用返回的Properties 集合代替对象名。(每个property 对象都包含一个属性名和值)。
    要创建Properties 集合,可以使用以下语法输入Descrīption.Create 语句:
    Set MyDescrīption = Descrīption.Create()
    创建Properties 对象(例如,以上示例中的MyDescrīption)后,就可以输入语句,以便在运行会话期间在Properties 对象中添加、编辑、删除或检索属性和值。这样,就可以在运行会话期间,使用动态方法确定哪个属性以及多少个属性应包含在对象描述中。
    在Properties 集合中填充一组Property 对象(属性和值)后,可以在测试语句中指定用Properties 对象代替对象名。
    例如,假设我们需要完成以下一个操作:
    Window("Error").WinButton("text:=OK", "index:="1"").Click
    我们可以通过Descrīption对象来实现同样的功能,参加下面的代码:
    Set MyDescrīption = Descrīption.Create()
    MyDescrīption("text").Value = "OK"
    MyDescrīption("index").Value = 1
    Window("Error").WinButton(MyDescrīption).Click
    Set MyDescrīption = Nothing
    【小结】以上是对QTP中有关处理动态对象中的Descrīptive Programming的简单介绍,希望对大家能够有所帮助,就总体而言,如果能够熟练掌握Descrīptive Programming,那么有很多实际中的问题就可以迎刃而解。当然Descrīptive Programming只是QTP中的一个功能,QTP在实际功能测试中还有很多强大的功能,作为QTP学习的一个系列有机会我会一一介绍。

  • 使用QTP9.0的一点心得——对象仓库

    2008-06-18 15:59:42

    QTP9.0的大部分功能与QTP8.2没什么区别,使用后最大的感受是对象仓库的功能增强了,不光有对象仓库窗口,还增加了对象仓库管理窗口、连接对象仓库窗口。

            
    我们知道对象仓库模式可分为每个对象库和共享对象库两类,在QTP8.2中,新建的测试默认情况下使用每个对象库,要使用共享对象库的话,应按如下方法进行设置:

            Ø   
    选择测试”——>“设置”——>“资源选项卡。

            Ø   
    对象库类型区域,选择共享

            Ø   
    请指定要用作对象库的共享对象库文件。要指定文件,请输入对象库文件名,或单击浏览按钮并从打开对话框中选择资源文件。要新建共享对象库文件,请在共享框中输入新文件名。

            Ø   
    对象库文件的默认文件扩展名是 .tsr,但是文件可以使用任何扩展名。在打开对话框中浏览现有对象库文件时,在文件类型框中选择所有文件

            Ø     
    注:请在新测试开始录制前进行设置,已有测试的对象库模式不能进行修改。




            
    QTP9.0中,对象仓库的使用相对灵活,每个action录制产生的对象都是存放在本地对象仓库中的,在对象仓库窗口(Resources...-> Object Repository...)中进行导出(File->Export Local Objects...)操作,可生成共享对象库,默认文件扩展名是 .tsr

            
    共享对象库的使用:打开连接对象仓库窗口(Resources...->Associate Repository...),选择共享对象库文件,然后进行连接。

            
    将某一action本地对象仓库的对象加入到共享对象库中的方法:

    方法一:

            Ø   
    先将该action与共享对象库连接,然后进行录制

            Ø   
    保存后关闭该测试文件

            Ø   
    打开对象仓库管理窗口(Resources...-> Object Repository Manager...)

            Ø   
    打开共享对象库文件
    (File->Open->*.tsr)

            Ø   
    从本地对象库进行更新 (Tools->Updated from Local Repository...),选择刚才的测试文件及要更新的action,更新(Update All->Save


    方法二:

            Ø   
    将该action本地对象仓库的对象也导出成一个共享对象库文件

            Ø   
    打开对象仓库管理窗口(Resources...-> Object Repository Manager...)

            Ø   
    将两个共享对象库文件进行整和(Tools-> Object Repository Merge Tool…),保存为另一个共享对象库文件。




            
    QTP9.0中,还可以在对象仓库中更新对象的属性,如果用来识别对象的属性在添加到对象仓库以后被改变了,QTP在回放脚本的过程中就无法识别这一对象,会导致出错。使用更新应用中对象这一方法,可以重新定义这些属性,使对象能被识别,所以非常有用。具体操作如下:

            Ø   
    打开对象仓库管理窗口(Resources...-> Object Repository Manager...)

            Ø   
    选择要更新的对象


            Ø   
    选择更新应用中对象Object > Update from Application)或工具栏上的

            Ø   
    在应用中找到该对象并点击它,选择与对象仓库中相同类的对象


            
    QTP中,对象识别是其核心的技术,正确识别到对象是保证自动化测试脚本成功运行的关键,QTP9.0中强大的对象仓库处理技术将给对象的识别、管理和使用带来很大的便利。

  • 软件测试中的相关概念定义

    2008-03-17 10:42:56

    软件测试的相关概念定义
    1.什么是软件测试
    1.1软件测试定义
    软件测试是为了发现错误而执行程序的过程。
     
    1.2软件测试两个阶段
    软件测试在软件生存期中横跨两个阶段:通常在编写出每一个模块之后就对它做必要的测试(称为单元测试)。编写与单元测试属于软件生存期的同一阶段。在结束这个阶段之后,对软件系统还要进行各种综合测试,这是软件生存期的另一个独立的阶段,即测试阶段。
    2.软件测试的目的和原则
    基于不同的立场,存在着两种不同的测试目的。从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可以接受该产品。而从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。
        有鉴于此,Grenford J.Myers就软件测试目的提出以下观点:
    测试是程序的执行过程,目的在于发现错误;
    ②一个好的测试用例在于能发现至今未发现的错误;
    ③一个成功的测试是发现了至今未发现的错误的测试
    3.软件测试的对象
    软件测试并不等于程序测试。软件测试应贯穿于软件定义与开发的整个期间。因此,需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应该成为软件测试的对象。
    4.黑盒测试与白盒测试
    4.1黑盒测试与白盒测试概念
    任何工程产品都可以使用以下的两种方法之一进行测试
    ①已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
    ②已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否已经过检查。
    前者就是黑盒测试,后者就是白盒测试
     
    4.2黑盒测试
    测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫做功能测试或数据驱动测试。黑盒测试主要是为了发现以下几类错误:
    ①是否有不正确或遗漏的功能?
    ②在接口上,输入能否正确地接受?能否输出正确的结果?
    ③是否有数据结构错误或外部信息(例如数据文件)访问错误?
    ④性能上是否能够满足要求?
    ⑤是否有初始化或终止性错误?
    所以,用黑盒测试发现程序中的错误,必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是否都能产生正确的输出。
     
    4.3白盒测试
    软件的白盒测试是对软件的过程性细节做细致的检查。它允许测试人员利用程序内部的逻辑结构及相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。软件人员使用白盒测试方法,主要想对程序模块进行如下的检查:
    ①对程序模块的所有独立的执行路径至少测试一次;
    ②对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测试一次;
    ③在循环的边界和运行界限内执行循环体;
    测试内部数据结构的有效性,等等。
    5α测试β测试
    α测试是由一个用户在开发环境下进行的测试,也可以是开发机构内部的用户在模拟实际操作环境下进行的测试。软件在一个自然设置状态下使用。开发者坐在用户旁边,随时记下错误情况和使用中的问题。这是在受控制的环境下进行的测试。α测试的目的是评价软件产品的FLURPS(功能、局域化、可使用性、可靠性、性能和支持)。尤其注重产品的界面和特色。α测试人员是除开发人员之外首先见到产品的人,他们提出的功能和修改意见是特别有价值的。α测试可以从软件产品编码结束之时开始,或在模块(子系统)测试完成之后开始,也可以在确认测试过程中产品达到一定的稳定和可靠程度之后再开始。有关的手册(草稿)等应事先准备好。
    β测试是由软件的多个用户在一个或多个用户的实际使用环境下进行的测试。这些用户是与公司签订了支持产品预发行合同的外部客户,他们要求使用该产品,并愿意返回有关错误信息给开发者。与α测试不同的是,开发者通常不在测试现场。因而,β测试是在与开发者无法控制的环境下进行的软件现场应用。在β测试中,由用户记下遇到的问题,包括真实的以及主观认定的,定期向开发者报告。β测试主要衡量产品的FLURPS。着重于产品的支持性,包括文档、客户培训和支持产品生产能力。只有当α测试达到一定的可靠程度时,才能开始β测试。由于它处于整个测试的最后阶段,不能指望这时发现主要问题。同时,产品的所有手册文本也应该在此阶段完全定稿。
    6、为了隔离被测试模块,需要用一些安全模块来代替被测试模块所调用的模块,叫它们“桩”。
    7、为了能把测试数据输入到被测试模块中,需要一个驱动模块将数据输入到被测模块中,并获得被测模块的反馈,最后通过判断得到测试结果。完成这样功能的模块通常也叫做“驱动”模块。
  • Linux 基本命令

    2007-11-05 15:23:24

    Linux基本命令:
    1、设置用户John的空间有效期
    命令:# chage -M 30 John
    2、用于获得临时root用户权限
    命令:# su -
    3、显示Linux系统的当前日期和时间
    命令:# date
    4、显示当前在系统中登录的所有用户名
    命令:# who
    5、显示当前登录用户(自己)的名称
    命令:# who am i
    6、清除终端屏幕
    命令:# clear (同tput clear)
    7、显示当前目录的完整路径名
    命令:# pwd
    8、改变目录
    命令:# cd
    9、显示文件的名称和目录的子目录
    命令:# ls
    Ex:# ls -l 显示文件和目录的详细列表
    10、显示当前登录会话的所有活动进程
    命令:# ps
    11、帮助命令
    命令:# man
    12、结束Linux会话
    命令:# exit / logout
    13、关闭Linux操作系统
    命令:# shutdown
    14、查看系统上已经创建的文件系统的磁盘空间利用率
    命令:# df
    15、挂接一个文件系统
    命令:# mount
    16、定义启动时可挂接的文件系统和设置
    命令:# /etc/fstab
    17、卸载已经挂载的文件系统
    命令:# umount
    18、创建目录
    命令:# mkdir
    19、删除目录
    命令:# rmdir
    20、创建和编辑文本文件
    命令:# vi
    >按下i键可在当前光标位置插入文本
    >键入:wq可保存所有更改并退出
    >键入:q!可不保存更改而退出
    21、用于将源文件中的内容复制到目录文件
    命令:# cp
    22、用于将文件或目录从一个位置移动到另一位置,或改变文件或目录的名称
    命令:# mv
    23、用于在屏幕上显示文件的内容
    命令:# cat
    24、允许用户在查看文件内容时向上翻页
    命令:# more或less
    注:
    >more 和 less 命令可以和
    其他命令结合使用,通过管道符"|"分页显示内容
    >键入q可退出
    命令:ls -l | more
    --显示当前目录中所有文件的所有属性,more命令分页显示ls -l命令的输出结果
    25、rpm -qa | more
    --查看用户计算机上安装的所有软件
    >rpm是指计算机运行RPM程序的命令
    >-q选项:执行查询操作
    >a选项:查询选项的修饰符,用于告诉RPM用户想列出的所有包
    >命令 | more 用于分页显示
    rpm -ivh ***-***.i386.rpm
    --用于安装软件包
    >i选项:用于执行安装操作
    >v选项:用于在安装失败时显示详细信息
    >h选项:使用竖线显示安装进度
    rpm -e ***-***.i386.rpm
    --用于删除和卸载软件包
    rpm -Uvh ***-***.i386.rpm
    --用于更新当前安装的软件包
    -- -U是upgrade的缩写
    26、用于压缩和解压文件
    命令:# tar
    27、用于备份程序
    命令:# cpio
    28、用于在屏幕上显示消息
    命令:# echo
    29、用于查看IP地址
    命令:# ifconfig
    30、用于切换到Shell
    命令:# !/bin/bash
    31、查看IP
    cat /etc/sysconfig/network-scrīpts/ifctg-etho
    32、查看DNS
    cat /etc/resolv.conf
    33、执行/etc/profile文件
    # . /etc/profile
    34、验证JDK的安装
    #
    java -version
  • QTP精华问题

    2007-10-17 15:56:40

    QTP问与答

    1.Q:runaction 后面能不能接变量(动态调用action,所以从数据库取数据做action名字了,但是调用总是找不到)?  
      A:脚本中原有RunAction "testbase [case1]", oneIteration
        把引号中的内容放到Global表中的第22行,然后将代码修改为:
        datatable.getsheet("Global")
        datatable.setcurrentrow(22)

        strLogin=DataTable("ActionName","Global")
        RunAction strLogin, oneIteration
       
        help中也有相关帮助
        如:
        Syntax
        RunAction ActionName, [IterationMode , IterationRange , Parameters]
        ActionName : String : The name of the action



    2.Q:QTP8.2 中调用VB函数的问题(用VBscrīpt写了一些测试脚本需要的几个通用函数,有没有办法可以用类似include的方式进行调用,而不需要每次都把这些函数Copy到新的脚本中)?
      A:程序开头加上ExecuteFile "..\..\..\project\DeVariable.vbs"



    3.Q:QTP 如何做回归测试(300多个TestCase,TD是否可以管理) ?
      A:TD可以实现,可以生成测试集,一个测试集可以包含若干个测试脚本
        QTP8.2本身提供一个工具Test Batch Runner但是运行完没有报告。
        MI有另一个工具叫MTM(multitestmanager)



    4.Q:qtp 自动节图功能

    A: 具体可参考此帖:[url]http://www.51testing.com/cgi-bin[/url] ... d=17663&fpage=1



    5.Q: 在QTP中如何设置使用别的浏览器(XP系统,用IE访问程序时,每次总提示屏蔽安装ActiveX插件,需要手动安装.但把这个过程录制到QTP后,回放一次是成功的。当我给某个输入框参数化了好多数据后,回放过程中,某些就会失败.
        可能有两个方面可以解决这问题1、每个动作设置延迟时间 2、设置为用别的浏览器。)
        (失败的提示信息是  object not visible)
      A:1.延迟可用WAIT X(X单位是秒)
        2.可以安装插件添加新的浏览器
           SystemUtil.Run "file” "params" "dir" "op'' "mode"
           QTP运行可执行文件的方法及其参数
         ps: 建议是用IE浏览器,或者IE内核浏览器做测试



    6.Q:checkpoint 检查网页,是否能实现只要网页出现乱码就返回错误报告?
      A:Text not displayed能解决问题
        关于 Text Checkpoint 的总结。
        1)Text Checkpoint 的检查部分分为三个部分。Checked Text 、Text Before 、Text After。在默认的情况下,Checked Text执行的是精确检查,其余两个部分执行的是模糊检查。Text Before(After)检查的内容可以比实际的内容少。但是不能有和是实际内容不相符的地方,否则就失败。
        2) Exact match选项。如果选择了这个选项,三部分完全都进行精确检查。个人觉得和只检查checked Text部分没有区别。
        3) Text not displayed。这个选项本质上就是一个结果取反的过程。就是把检查的结果给反过来,把pass变成Fail,Fail变成pass。我觉得这样就很容易理解。



    7.Q:WSH 的应用方法
      A:WSH 实际上是一个脚本语言的运行环境,它之所以具备强大的功能,是在于其充分挖掘了脚本语言的潜力。因此,如果抛开脚本语言而空谈 WSH ,那实际上就没有了意义。而如果再展开来讲述脚本语言,显然就离开了今天的主题。

    在这种情况下,只好采取一种折衷的方法:给大家推荐几个脚本文件利用 WSH 执行任务的实例,希望大家能通过这些例子对 WSH 的使用有一个初步的认识。

      脚本文件的编写十分方便,你可以选用任意一个文字编辑软件进行编写,编写完成后,只需将它保存为 WSH 所支持的文件名就可以了(如.js 文件和.vbs 文件)。最常用的就是记事本编辑器,下面的实例都是以它作为工具编写的。

    打开记事本编辑器,在上面编写如下内容:
      Wscrīpt.Echo("走近 WSH")
      将它保存为以 .vbs 或 .js 为后缀名(千万不要写成了 .txt)的文件并退出记事本。双击执行这个文件。
      这一次,我们要利用 WSH 完成一次创建十个文件夹的工作。代码如下:
      dim objdir
      set ōbjdir=wscrīpt.createobject("scrīpting.filesystemobject")
      for k=1 to 10
      anewfolder="c:\chapter" & k
      objdir.createfolder(anewfolder)
      next

    同样,将它存为 .vbs 文件并退出。运行后,我们会发现,C 盘根目录下一次性多出了十个新文件夹。

        最后,再举一个在服务器上的运用。下面的代码将帮助你重新启动指定的 IIS 服务:  ' define a constant for stopped services
      Const ADS_SERVICE_STOPPED = 1

    ' get an ADSI object for a computer
      Set ōbjComputer = GetObject("WinNT://MYCOMPUTER,computer")

    ' get an object for a service
      Set ōbjService = objComputer.GetObject("Service","MYSERVICE")

    ' check to see if the service is stopped
      If (objService.Status = ADS_SERVICE_STOPPED) Then

    ' if the service is stopped, then start it
      objService.Start

      End If

    将它以 startsvc.vbs 为名保存在 C: 盘根目录。并通过如下命令执行:Cscrīpt C:\STARTSVC.VBS。运行后,经你指定的 IIS 服务项将被重新开启。

    其实,在 Windows 的 samples 目录下,有个 WSH 文件夹,那里面有不少很具代表性的 .vbs 和. js 脚本文件。

    此外,利用 WSH 还可以自己编写脚本文件来提高网络管理方面的效率。


    8.Q; 从 EXCEL 中导出数据进行测试

    datatable.AddSheet("51sheet")
    datatable.ImportSheet "f:\test.xls","testsheet","51sheet"

    Dim i,RowCount ' 定义两个变量
    i=0
    RowCount=datatable.GetSheet("51sheet").GetRowCount ' 设置 RowCount 等于 51sheet 中的行数。
    msgbox RowCount
    Do while i<rowcount
    i=i+1 ' 第一次进入循环,执行这句后, i=1
    'datatable.getsheet("51sheet").setcurrentrow(i)   这句话被我注释掉了,正确的写法应该是下面这样,分开写。

    datatable.getsheet("51sheet")
    datatable.setcurrentrow(i)

    ' 执行过上面两句后, CurrentRow 是第一行。

    tempData=DataTable.GetSheet("51sheet").GetParameter("Name").Value
                      
    ' 现在,我们调用 msgbox 看看下面这种调用方法得到的是什么值?没错,是第一行的值,下一次循环呢?
    ' 得到的是第二行的值么?
    msgbox "GetParameter-Name:"&tempData ' 这里弹出我们要看的值。
    ' 下面我们用另外一种方法来得到。
    msgbox "GetParameter-i:"&DataTable.GetSheet("51sheet").GetParameter(1).Value ' 这里我用 GetParameter(1) 去得到 sheet 中第一列的值。
    loop



    9.Q: 关于 dtGlobalsheet 与 dtGlobalsheet

    1) dtGlobalsheet 只有一个,它的 index 值比较特殊,它有两个 index 值,一个是 1 还有一个是内置的默认的 1000 。
    你可以用 1 或者 1000 去引用它都是正确的。当然了,如果你用 dtGlobalsheet 来引用它也是正确的。这个 sheet 的 Name 叫做 "Global" 。注意: SheetName 是区分大小写的。
    2) dtLocalsheet 可以用 index:1001 来引用,当然,也可以用 2 来引用。至于其它自定义的 sheet 嘛,你就只能用 index:3 来引用了。
    它没有内置的默认的类似前两个那样的 index 值。
    3) datatable 这个对象只有一个。就是所有 sheet 的集合。或许你把它理解为 excel 文件比较好。
    dtsheet 呢?就是其中的每个 sheet 。所不同的就是 MI 为他们做了一些默认值。在我们的应用中,可能会有多个 action, 如: actiion1,actiion2,actiion3
    这些 action 也分别对应有各自默认的 LoaclSheet. 即: actiion1 , actiion2 , actiion3 。

    如果每个 action 中,我们都只用到一个 sheet ,那就好办了,在每个 action 中都可以用 localsheet 来引用,但是如果我们有两个及两个以上的 sheet. 那么就比较容易乱套了。



    10.Q: 移动当前位置的行

    For i=1  to 3
    datatable.getsheet("Global")
    datatable.setcurrentrow(i)
    DataTable("C","Global") = DataTable("nodename","Global") ‘把表Global中的nodename字段中的内容取出来。
    Next



    11.Q: 如何能记录到页面的校验码?(Output value能不能得到web页面的校验码,一般的校验码是由图片随即生成的 ,用QTP怎么录脚本在登陆前得到校验码并输入到校验码一栏)
       A:1)一个很简单的方法:测试时叫开发屏蔽掉检验码的功能后,再录制脚本。检验码的功能可以手工很简单测试出来。
         2)想得到图片的校验码,唯一的方法就是跟程序员拿程序,然后自己在脚本里面写FUCNTION!
            其它就要手动输入了!



    12.Q:QTP 正则表达式的帮助
       A:见附件word文档

    附件: QTP regular expression usage.doc (2005-9-8 18:32, 26.5 K)



    13. 自动测试实施计划
       1)分析实施自动化测试可能存在的风险:就是决定是否实施, 用成本 时间 效果 。。
       2)制定实施的时机:也就是在什么阶段
       3)研究所要测试的功能 性能
       4)分析在测试中可能遇到的问题 和困难
       5)预估所需要的人时和相应的硬件
       7)确定负责人员和相关测试人员
       6)制定详细的测试计划 方案
       7)最后是执行计划



    14.Q: 一个Action里如何调用在另一个Action中定义的函数、过程(或变量、常量)
       例如:
       -----------------------------------
       'Action_A
         Public strURL   
            ...... ......
        Function QueryList()
            ...... ......
            ...... ......  
        End Function
       ------------------------------------
       'Action_B
       '如何调用 QueryList函数和strURL
       A:1)可以把这些变量和Function放在vbs文件作为resource文件共享,在每个Action中添加该文件.         

    如果function中出现控件调用,那么必须确保该控件在相应的Action的object repository中是存在的.
      2)定义一个可被调用的ACTION里面唯一的放一个FUNCTION

    wing1799 2007-10-3 15:17

    15.Q: 如何管理QTP的源代码?(QTP生成的源代码比较多,而且和环境控件都有关,假如需要多人同时开发, 请问如何管理源代码?)
       A: 一个是代码你可以通过vss,cvs等来进行管理
         一个是通过td或者qc的基于用例的代码管理      

    其实第一种方法是基于版本控制来进行的,第二种方法是基于用例管理进行的
         角度不同,管理方法也不同,不过团队协作需要的大家分工明确,进度控制。代码管理可以借鉴开发的方法。



    16:Q: 脚本不能回放,IE中的AtiveX设置有问题??
       A: TOOL---OPTIONS----Ative screen
         然后点开advanced..,把LOAD  ACTIVEX CONTROLS打勾
         TOOL---OPTIONS----Ative screen
         然后点开advanced..,run scrīpts-->disabled!



    17 .Q: 如何参数化link

    Browser("Browser").Page("Page").Sync
    Browser("Browser").Navigate "http://www.51testing.com/cgi-bin/index.php"
    Browser("Browser").Page("51Testing 软件测试论坛---软件测试,软件质量工程师").Sync

    Set tags=Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Object.links
    Dim i,j, arr()
    i=0
    For Each element in tags
        If Ucase(element.tagname)="A" and left(element.InnerText,1)="[" Then
                            ReDim Preserve arr(i+1)
                        arr(i)=element.InnerText
        i=i+1
            end if
    Next



    For j=0 to i
                            Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").SetTOProperty "Text",arr(j)
                Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").Click
                            Browser("Browser").Back
    Next

    这段代码先是打开一个空的页面,然后输入url.
    到达论坛首页。

    然后得到所有版面的名称,也就是link的名称。
    存到数组里面。
    然后使用SetTOProperty更换录制时候录下的link的属性。
    这时候再click





    18. Q:QTP 在Debug狀態,在Export View 區域不能寫入任何東西

    A: 如果你的目的是在debug过程中修改已执行过的命令,可以在Debug view的Command中执行命令,如重新执行已经执行过的命令,修改变量的值等等。

    如:Window("Flight Reservation").WinEdit("Name:").Set "51testing"
    已经执行,如果现在想修改“51testing”为“testing”,可以在command中执行
    Window("Flight Reservation").WinEdit("Name:").Set "testing"



    19 .Q: 动态变化值如何获取

    A:VAL=Browser("欢迎使用我的工作台").Page("欢迎使用我的工作台").Frame("managePlace_7").WebRadioGroup("userAccountId_0").GetROProperty("Value")
    Browser("欢迎使用我的工作台").Page("欢迎使用我的工作台").Frame("managePlace_7").WebRadioGroup("userAccountId_0").select val



    20 .Q: 如何一一获得Table中 某栏 link 的 text?

    A:通过上面link 的学习. 我终于融会贯通,完成了我的问题: 与大家共享:


    //////////////////////////////////////////////////////////////////////////////////////
    Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Image("Tplus").Click
    Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Image("Tplus_2").Click
    Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Link("开课设置").Click
    Browser("Login").Page("Page").Frame("main").WebList("drpStatus").Select "任意"
    Browser("Login").Page("Page").Frame("main").WebButton("查找").Click
    Browser("Login").Page("Page").Sync

    Dim finded,findCode,Nowout
    'define a constrat for find
    findCode = 110901   
    finded = false

    Function MaxPage(pageString)
       'msgbox pageString
       Dim ilen,i,j
       ilen = len(pageString)
       i=ilen
       While i>0
            j = mid(pageString,i,1)
               'msgbox j
               If instr("123456789",j)>0 Then
               MaxPage = j
                       'msgbox MaxPage
                       Exit function
               End If
               i=i-1
       Wend
    End Function

      
    Dim trowcount,maxp
    trowcount = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").RowCount
    msgbox "Rowcount: "&trowcount
    Nowout = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").GetCellData(trowcount,1)
    Nowout = trim(Nowout)
    maxp = MaxPage(Nowout)
    msgbox "max page: "& maxp

    Dim nowPage,checkid
    For nowPage = 1 to maxp
       If  finded Then
               Exit for
       End If
      ' link to the 当前所需page
      If nowpage>1 Then
        Browser("Login").Page("Page").Frame("main_8").Link("[2]").SetTOProperty "Text","["&nowpage&"]"
        Browser("Login").Page("Page").Frame("main_8").Link("[2]").Click
        Browser("Login").Page("Page").Sync
       end if

      ' Get the rowcount of table in now page
       trowcount = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").RowCount
       msgbox "Rowcount: "&trowcount

      'link every record in the table of the page
       for i = 2 to trowcount  - 2
            Nowout = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").GetCellData(i,2)
            'msgbox i&": "&Nowout

        checkid = "dgCourse:_ctl" &(i+1)& ":_ctl0"
        Browser("Login").Page("Page").Frame("main_8").WebCheckBox("dgCourse:_ctl3:_ctl0").SetTOProperty "name",checkid
        Browser("Login").Page("Page").Frame("main_8").WebCheckBox("dgCourse:_ctl3:_ctl0").Set "ON"
            
        Browser("Login").Page("Page").Frame("main_8").Link("0901").SetTOProperty "Text",Nowout
        Browser("Login").Page("Page").Frame("main_8").Link("0901").Click
        Browser("开课设置详细信息").Page("开课设置详细信息").Sync
            'wait(1)
            msgbox "begun"
            msgbox findCode
            msgbox Nowout
            msgbox "finished"
            If  trim(findCode) = trim(Nowout) Then
            finded = true
                    msgbox "find is ok!"
                    wait(2)
                    Exit for
            End If
        Browser("开课设置详细信息").Close
        Browser("Login").Page("Page").Sync
      next

    Next



    21 .Q:网页下拉框的选择

    A:For i =1 to 10
        Randomize
        IndexNum=Int((10 - 5 + 1) * Rnd + 5)
        Browser("Mercury Tours").Page("Find Flights_2").WebList("arrive").Select "#"&IndexNum
        wait(3)
    Next



    Sub ChildObjects_Example()
    'The following example uses the ChildObjects method to find all the
    'list objects on a Web page, and then to select an item in each list.

    Set ōDesc = Descrīption.Create()
    oDesc("micclass").Value = "WebList"
    Set Lists = Browser("Mercury Interactive").Page("Mercury Interactive").ChildObjects(oDesc)
    NumberOfLists = Lists.Count()
    For i = 0 To NumberOfLists - 1
    Lists(i).Select i + 1
    Next


    End Sub



    22 .Q: 将测试数据单独拿出来

    A: 取得一个
    Browser("Browser").Page("").WebList("fid").GetItem (1)
    取得全部
    Browser("Browser").Page("").WebList("fid").GetROProperty("all items")



    以下可以在自带的例子中实现
    Window("Flight Reservation").WinComboBox("Fly From:").Select "Frankfurt"
    a=window("Flight Reservation").wincombobox("Fly From:").GetItem(1)
    reporter.ReportEvent 2,"下拉列表的值",a



    23 .Q:和TD连接

    A:在QTP中不是有个Quality Center Connection,选择服务器连接,服务器处输入类似http://computer_name/tdbin,其中computer_name为服务器的名字,连接后在测试结果中添加defect就可以与TD相连了。



    24 :Q:处理Windows弹出窗口

    A:IF Not Window("Flight Reservation").Exist(1) Then
                            'Calling  open flight
                   If    not Dialog("Login").Exist(1)  Then
                                                        Browser("管理系统").Dialog("Microsoft Internet Explorer").WinButton("确定").Click

                                             End If



    25 .Q:查询结果的比较

    这是查询一个字段的,对查询结果多页的情况也涉及了,其实应该把所有查询字段联合起来的,也就是改改sql语句和判断条件。

    [i]Set Conn = CreateObject("ADODB.Connection")
    Set Rs = CreateObject("ADODB.Recordset")
    Conn.Open "Descrīption=kml-it;DRIVER=SQL Server;SERVER=KML-IT;UID=sa;PWD=password;APP=QuickTest Professional;WSID=KML-MICHELLE;DATABASE=kml_db"
    sql="select distinct grn_no from grn_dtl where grn_no like '%"&grnNo&"%' order by grn_no DESC"
    Rs.open sql,Conn,1,3
    Dim i,j,cell
            i=1
            j=2 'j=2 的原因是因为页面上table是的数据是隔一行一条,不知   道怎么回事,开发人员弄的怪把
                    Do while not rs.eof
                            If i=13 Then  '13是每页显示出的最大行数,是个常数
                                    i=1
                                    j=2
                                     Browser("::").Page("::").Frame("mainFrm_5").Link("下一页").Click
                            end if
                            cell=Browser("::").Page("::").Frame("mainFrm_5").WebTable("收货单号").GetCellData(j,2)
                            If cell<>rs("grn_no") Then
                    Reporter.ReportEvent 1, "查询功能"&cell, "查询结果错误."
                                    Exit do
                            else
                                    Reporter.ReportEvent 0, "查询功能"&cell, "查询结果正确."
                            End If
                            rs.movenext
                            j=j+2
                            i=i+1
                    Loop
    rs.close
    conn.close
    set conn=nothing[/i]
  • QTP中的描述性编程

    2007-10-12 16:29:51

    使用编程性描述(Using Programmatic Descrīptions

    在录制脚本时,QTP会将被测对象添加到对象仓库中。只要对象存在于仓库中,我们就可以在专家视图中使用该对象进行手动添加脚本。在脚本中,我们一般都使用对象的名称(该对象名称不区分大小写)作为对象描述。

    例如:

    在下面的语句中“username”是一个编辑框的名称。这个编辑框位于某页面(Page)之上(该页面的名称为“Mercury Tours”),并且该页面属于名为“Mercury Tours”的浏览器(browser)。

    Browser("Mercury Tours").Page("Mercury Tours").WebEdit("username")

    因为对象仓库中的对象的名称是唯一的,因此你只要在脚本中指定对象的名称即可。QTP根据指定的对象名称以及它的父对象在对象仓库中找到该对象,然后根据仓库中对象的详细描述从被测试程序中查找并识别对象。

    其实,在QTP脚本中,不使用对象仓库或对象名称,也可以对被测程序中的对象进行操作。为了做到这一点,我们需要在QTP脚本中提供对象的属性及其值的列表。这就是编程性描述。

    当对象不存在于对象仓库之中,而我们又希望操作该对象时,编程性描述就非常有用。如果有多个对象,它们具有某些相同的属性,通过编程性描述,我们可以在这些对象上进行相同的操作;或者某个对象的属性无法确定,需要在运行过程中指定,我们也可以使用编程性描述,来对该对象进行操作。

    例如:在一个页面有多个check box,你不能预知其个数,也不知道所有check box的准确描述,然而你希望选中所有的check box。在这种情况下,你可以使用编程性描述来解决。你只需要让QTP对所有描述为 HTML TAG=input,TYPE=check box的对象执行一个 Set “ON”的操作即可。

    编程性描述的方法有两种:

    方法一:在语句中直接列出对象的属性及值的列表;

    方法二:使用Descrīption对象,为Descrīption对象添加属性及值的集合,然后在语句中直接使用Descrīption对象的名称即可。

    使用第一种方法要简单一些,但是在很多情况下,第二种方法更显得功能强大并更有效率。

    在语句中直接使用编程描述(Entering Programmatic Descrīptions Directly into Statements

    在语句中不使用对象的名称,而是使用对象的描述(指定多对property:=value值)。

    通常语法如下:

    TestObject(“PropertyName1:=PropertyValue1”,”,“PropertyNameX:=PropertyValueX)

    TestObject:指的是测试对象的类名

    PropertyName:=PropertyValue:指的是测试对象的属性及值。每对property:=value用双引号标记,并用逗号隔开。

    注:property value可以是变量。

    注意:在编程性描述中,QTP将所有的property value视为正则表达式。因此,当property value中包括正则表达式特殊字符(如*,?,+)时,要在特殊字符前加“\”

    下面的语句中,使用到了Mercury Tours网页中的一个WebEdit对象,它的NameAuthorIndex3。在运行过程中,QTP就会从网页中查找NameAuthor并且Index3WebEdit对象,并在WebEdit中输入文字“MarkTwain”。

    Browser("Mercury Tours").Page("Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "Mark Twain"

    注意:如果你对测试对象层级关系中的某个上级对象使用了编程性描述,那么在同一语句中,从该对象开始,它的所有下级对象都必须使用编程性描述,否则QTP不能识别该父级对象的下级对象。

    例如:语句中,层级关系中所有的对象都使用了编程性描述:

    Browser("Title:=Mercury Tours").Page("Title:=Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "Mark Twain"

    下面的语句中,从层级关系中的某个点开始,使用编程性描述(从Page对象开始):

    Browser("Mercury Tours").Page("Title:=Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "Mark Twain"

    但是,你不能象下面的语句这样使用编程性描述。(它对BrowserPage对象使用了编程性描述,但是对于WebEdit对象,却又想使用对象仓库中的名称)

    Browser("Title:=Mercury Tours").Page("Title:=Mercury Tours").WebEdit("Author").Set "Mark Twain"

    QTP偿试根据WebEdit的名称在仓库中定位对象,但是却无法在仓库中找到它的父对象。

    For more information on working with test objects, see Working with Test Objects.

    如果在脚本中你要多次使用到相同的编程性描述,可以将对象指定到变量。

    例如,有如下脚本:

    Window("Text:=Myfile.txt - Notepad").Move 50, 50

    Window("Text:=Myfile.txt - Notepad").WinEdit("AttachedText:=Find what:").Set "hello"

    Window("Text:=Myfile.txt - Notepad").WinButton("Caption:=Find next").Click

    你可以将脚本改进为:

    Set MyWin = Window("Text:=Myfile.txt - Notepad")

    MyWin.Move 50, 50

    MyWin.WinEdit("AttachedText:=Find what:").Set "hello"

    MyWin.WinButton("Caption:=Find next").Click

    你还可以使用With语句,将脚本改进为:

    With Window("Text:=Myfile.txt - Notepad")

           .Move 50, 50

           .WinEdit("AttachedText:=Find what:").Set "hello"

           .WinButton("Caption:=Find next").Click

    End With

    For more information about the With statement, see With Statement.

    在编程性描述中使用Descrīption对象(Using Descrīption Objects for Programmatic Descrīptions

    你可以使用Descrīption对象,来返回一个Properties collection对象,该集合对象包括一系列Property对象。每个Property对象由Property namevalue组成。

    然后在语句中用Properties collection对象替代被测对象的名称。

    注意:默认情况下,所有被添加到Properties collection中的Property对象的值被当成正则表达式对待。因此,当Property Value中包含正则表达式的特殊字符(如*?+)时,要在特殊字符前使用“\”符号。

    你也可以在Properties Collection中,将RegularExpression属性值设置为False,这样即使在Property Value中用到了正则表达式的特殊字符,也会被视为普通字符。更多信息参考QuickTest Professional Object Model ReferenceUtility部分。

    要创建Properties collection,使用Dexcription Create语句,语法如下:

    Set MyDescrīption = Descrīption.Create()

    一旦创建了Properties 对象(例如上例中的Mydescrīption,在运行过程中,你就可以使用语句向Properties对象添加、编辑、移除或获取属性及属性值。这使你在运行过程中可以动态的决定:在对象描述中使用哪些属性、使用多少属性。

    当你将一系列的属性及属性值加入到Properties collection中以后,你就可以在脚本语句中用Properties对象替代被测对象的名称。

    例如,有如下语句:

    Window("Error").WinButton("text:=OK", "width:=50").Click

    通过改造,成为:

    Set MyDescrīption = Descrīption.Create()
    MyDescrīption("text").Value = "OK"
    MyDescrīption("width").Value = 50
    Window("Error").WinButton(MyDescrīption).Click

    注:当为一个ActiveX对象创建编程性描述时,如果该对象的run-time对象是windowless的(即没有相应的window handel),就必须在属性描述中将它的windowless property设置为Ture

    例如:

    Set ButDesc = Descrīption.Create
    ButDesc("ProgId").Value = "Forms.CommandButton.1"
    ButDesc("Caption").Value = "OK"
    ButDesc("Windowless").Value = True
    Window("Form1").AcxButton(ButDesc).Click

     

    获取Child ObjectsRetrieving Child Objects

    通过ChildObjects方法,可以获取指定对象下的所有子对象,或只获取那些符合编程性描述的子对象。为了获取某对象的子对象的子集,首先需创建一个descrīption对象,然后在该对象的descrīptions collection中添加一系列的属性及属性值,这些属性及属性值必须符合子集的要求。

    注意:你必须使用Descrīption对象来为ChildObjects描述参数 创建编程性描述,不能使用property:=value语法直接将编程性描述添加到参数中。

    一旦你已经在descrīption对象中“built”了描述,就可以使用下面的语法来获取与描述匹配的子对象:

    Set MySubSet=TestObject.ChildObjects(MyDescrīption)

    例如:下面的语句使QTP选中网页中的所有选择框:

    Set MyDescrīption = Descrīption.Create()

    MyDescrīption("html tag").Value = "INPUT"

    MyDescrīption("type").Value = "checkbox"

    Set Checkboxes = Browser("Itinerary").Page("Itinerary").ChildObjects(MyDescrīption)

    NoOfChildObjs = Checkboxes.Count

    For Counter=0 to NoOfChildObjs-1

           Checkboxes(Counter).Set "ON"

    Next

    For more information about the ChildObjects method, refer to the QuickTest Professional Object Model Reference.

    WebElement对象使用编程性描述(Using Programmatic Descrīptions for the WebElement Object

    如果没有录制WebElement对象,也可以使用编程性描述,来对Web网站中的任何一个WebElement对象进行操作。

    例如:

    Browser("Mercury Tours").Page("Mercury Tours").WebElement("Name:=UserName", "Index:=0").Click

    set WebObjDesc = Descrīption.Create()

    WebObjDesc("Name").Value = "UserName"

    WebObjDesc("Index").Value = "0"

    Browser("Mercury Tours").Page("Mercury Tours").WebElement(WebObjDesc).Click

    QuickTest clicks on the first Web object in the Mercury Tours page with the name UserName.

    关于WebElement对象的更多信息,参考QuickTest Professional Object Model Reference

    在编程性描述中使用Index属性(Using the Index Property in Programmatic Descrīptions

    在需要唯一识别一个对象时,index属性有时候可能非常有用。index属性是对象在源代码中出现的顺序,第1次出现时,index值为0

    Index属性是object-specific的。因此,当你用index属性值“3来描述一个WebEdit对象时,QTP会在被测程序的当前页面中查找第4WebEdit对象。

    如果你使用index属性值3来描述一个WebElement对象时,QTP会在被测程序的当前页面中查找第4Web对象。

    例如,当前页面中存在下面的对象:

    • 一个名为QppleImage对象
    • 一个名为UserNameImage对象
    • 一个名为UserNameWebEdit对象
    • 一个名为PasswordImage对象
    • 一个名为PasswordWebEdit对象

    下面的语句中指的是列表中的第3个对象,因为它要求指向的是第1个名为UserNameWebEdit对象。

    WebEdit("Name:=UserName", "Index:=0")

     

    下面的语句中指的是列表中的第2个对象,因为它要求指向的是第1个名为UserNameWebElement对象。

    WebElement("Name:=UserName", "Index:=0")

    注:如果当前只有一个对象,使用index=0将无法查找到对象,因此就不能在对象描述中使用index属性。

  • mantis相关配置的方法

    2007-08-02 10:59:27

    1)远程访问mantis的方法%%EasyPHP_Install_dir%\apache\conf\httpd.conf 文件,找到 Listen 127.0.0.1:80,修改为 Listen 0.0.0.0:80 以后重启 EasyPHP 服务就可以了。EasyPHP_Install_dir%\apache\conf\httpd.conf 文件,找到 Listen 127.0.0.1:80,修改为 Listen 0.0.0.0:80 以后重启 EasyPHP 服务就可以了。

     2)邮件服务器配置 在c:\php-5.0.3\php.ini文件中查找smtp,将localhost改为你的发件服务器,如SMTP = smtp.163.com 在php.ini文件中查找sendmail_from,将前面的分号去掉,并在后面填上邮件地址 在c:\mantis-0.19.2\config_inc.php文件中添加 $g_smtp_host='smtp.163.com'; $g_smtp_username='yourusername'; $g_smtp_password='yourpassword'; $g_phpMailer_method =2; 查找$g_return_path_email,将后面的邮件地址改为有效的地址,这一点非常重要,不然将无法正常发送激活注册的邮件。 config_inc.php其它邮件地址最好也改为有效的地址。 $g_smtp_username,$g_smtp_password在服务器需要验证时用,不需验证时不用加,或设为 $g_smtp_username=' $g_smtp_password=' 现在你可以注册新用户,并使用发送邮件功能了。

    3)中文显示 在APACHE的httpd.conf配置文件中将AddDefaultCharset ISO-8859-1 改为 AddDefaultCharset OFF 在c:\mantis-0.19.2\config_inc.php中添加 $g_default_language='auto';

    4)文件上传 在config_inc.php中添加 $g_allow_file_upload=ON; $g_file_upload_method=DISK; 并且在c:\mantis-0.19.2下面新建一个upload目录当你以管理员身份登录,新建项目时,在上传文件路径那一项填上upload即可,如果要为每一个项目指定不同的目录,可以先在upload下建一个projectname,在上传文件路径那一项填上upload\projectname,注意最好不要用中文目录名,目录名中间也不要带空格。

    5)连接mysql数据库的方法

    mysql   --user=root   -p  

  • loadrunner 小知识累积

    2007-07-04 15:35:19

     

    1. 在启动录制脚本操作的Start Recording对话框,去掉Record the application startup前的选择,可以不录制应用程序启动时的操作,而仅录制所需的特定操作。

    2. 添加windows性能计数器时,必须先用管理员身份登录该台服务器,然后添加才可生效(注意先后顺序)。

    3. 设置DB2数据库监视:在Monitored Server Machines中配置Machine Information机器信息,Name中要填写“主机名@实例名”,如“168.31.6.47@DB2”,其中实例名要填完整,包括节点名称。Platform选“N/A”。

    4. 添加windows性能计数器时,必须先用管理员身份登录该台服务器,然后添加才可生效(注意先后顺序)。

    5. web_reg_save_param是在web脚本中用于关联HTML语句的函数。只有在录制中的关联有效时(在录制选项中设置),web_reg_save_param才会被自动录制。

    6. 设置Internet首选项的其它选项
    几个比较常用的:
    由资源引起的步骤超时是警告(Step timeout caused by resources is a warning):如果由于资源未在超时间隔内加载而引起超时,将发出警告而不是错误。对于非资源,VuGen 总是发出错误。(默认情况下为 NO)
    HTTP 请求连接超时(秒)(HTTP-request connect timeout(sec)):Vuser 终止之前在步骤内等待特定 HTTP 请求连接的时间(秒)。超时为服务器保持稳定并响应用户提供了机会。默认值为 120 秒。
    HTTP 请求接收超时(秒)(HTTP-request receive timeout(sec)):Vuser 终止之前在步骤内等待接收特定 HTTP 请求的响应时间(秒)。超时为服务器保持稳定并响应用户提供了机会。默认值为 120 秒。
    超时设置主要用于以下高级用户:这些用户已确定可接受的超时值应该随环境而异。大多数情况下,默认设置应该足够长。如果服务器在合理的时间内并未做出响应,请检查其他与连接相关的问题,不要设置太长的超时,否则可能会导致脚本不必要地等待。
    网络缓冲区大小(Network buffer size):设置用于接收 HTTP 响应的缓冲区的最大大小。如果该数据的大小超过了指定的大小,则服务器将按块发送数据,从而增加了系统开销。从 Controller 中运行多个 Vuser 时,每个 Vuser 都使用自己的网络缓冲区。该设置主要用于以下高级用户:这些用户已确定网路缓冲区的大小可能影响其脚本的性能。默认值为 12K 字节。

    7. 在Analysis中,可以很方便地将各个分析图表拷贝出来。方法是:先切换到某个图表页(Graph),再使用EditCopy to Clipboard功能,便可将该图表的图、数据等复制到剪贴板,然后就可以粘贴到需要的地方(如测试报告)去。
    8. 将参数设置为Unique时,要特别注意提供的参数列表是否足够,在Controller中分配值的选项(Allocate Vuser values in the Controller)默认设置为自动分配数据块(Automatically allocate block size),这样的设置在场景的执行过程中往往会出问题,报出“参数不够”的错误,可以修改为由人工分配(Allocate__values for each Vuser),为每个虚拟用户分配指定数目的参数,以便于控制。
    9. LR在录制脚本时有时常会出现一些乱七八糟的字符,例如:
    "Name=save_path", "Value=D:"
    "\\x5C"
    "resin-2.1.12"
    "\\x5C"
    "doc"
    以上脚本片断中用红色标出的“x5C”部分就是录制下来的乱字符,该脚本原本是为了将附件上传到服务器端保存,可录制下来的保存路径却多了以上的乱字符,导致本应的保存路径D:\resin-2.1.12\doc\...,变为D:\x5Cresin-2.1.12\x5Cdoc\...。要特别注意,以避免产生不必要的错误

    10. 如何设置oracle数据库监视?

    首先要安装oracle客户端,完成相关配置,再添加oracle计数器就可以了。

  • LoadRunner的Apache的监控

    2007-07-04 14:46:51

    LoadRunner的Apache的监控

    具体配置如下:
    配置LoadRunner监控Apache,LoadRunner监控Apache服务器是调用的Apache自身的模块进行监控的,所以需要配置Apache和LoadRunner

    一.配置LoadRunner
    1.在图树中单击 Apache 图,并将该图拖进“运行”视图的右窗格中。
    2.右键单击该图,然后选择“添加度量”,或选择“监视器”>“添加联机度量”。
    3.在“Apache”对话框的“监视的服务器计算机”部分,单击“添加”输入要监
    视计算机的服务器名或 IP 地址。选择计算机运行的平台,单击“确定”。
    4.在“Apache”对话框的“资源度量”部分中,单击“添加”选择要监视的度量。
    将打开“Apache - 添加度量”对话框,显示可用的度量和服务器属性。
    5.在“服务器属性”部分,输入端口号和不带服务器名的 URL,并单击“确定”。
    默认的 URL 是 /server-status?auto。
    6.在“Apache”对话框中单击“确定”,激活监视器。
    二.配置Apache
    1.修改Apache中Httpd.conf文件,添加如下代码(该文件中都有,只要取消注释就好了)
    <Location /server-status>
    SetHandler server-status
    Order deny,allow
    # Deny from all
    Allow from .localhost
    </Location>
    2.添加 ExtendedStatus
    设置 ExtendedStatus On
    3.取消注释LoadModule status_module modules/mod_status.so
    加载该模块。
    4.重新启动Apache

  • 在Linux下安装Oracle Database 9i

    2007-07-04 11:44:06

    在Linux下安装Oracle Database 9i

    Oracle9i 2000年10月在Oracle Open World上发布,为 Oracle 数据库、应用服务器和开发工具引进了许多新功能。Oracle9i是业界第一个完整、简单的用于互联网的新一代智能化的、协作各种应用的软件基础架构。Oracle9i 实际上是指 Oracle9i Database, Oracle9i Application Server 和Oracle9i Developer Suite的完整集成。随着软件逐渐开始转变为一种托管服务(hosted services), 具有Internet上的高伸缩性能的、智能化的、和可靠的Oracle9i 将成为高质量的电子商务服务实现的关键软件。本文将介绍Oracle Database 9i在Linux下的安装过程,如果你是有过安装Oracle的经验本安装过程可以权当快速安装手册;如果你以前从未在Linux下安装过Oracle数据库,那我们就从这篇文章开始熟悉Oracle的安装过程。

    系统要求:
    以下的系统要求适用于典型的Oracle安装和创建简单数据库的方式。

    内存:
    安装Oralce 9i软件至少需要512M内存,用以下命令可以查看主机内存大小:
    grep MemTotal /proc/meminfo
    MemTotal: 900252 kB

    900252kB就是你系统的内存大小。

    交换区:
    交换区的大小一般要求是内存的两倍,至少要求达到400M以上,当然是越大越好,用以下的命令可以查看系统交换区的大小:
    /sbin/swapon -s
    Filename Type Size Used Priority
    /dev/sda6 partition 105221 686976 -1

    其中105221就是系统交换区的大小。

    光驱:
    如果你使用光盘安装Oracle9i则你的机子上需要8速以上的CDROM,如果你是下载了Oracle9i的包文件,则不需要使用的CDROM。

    硬盘空间:
    安装Oracle9i数据库至少要有2.5GB以上的剩余空间。

    临时硬盘空间:
    Oracle安装程序在安装过程中需要400M以上的临时硬盘空间,建议使用/tmp文件夹作为零时文件夹,如果/tmp文件没有足够的硬盘,可以新创建一个文件夹作为安装的临时目录,之后设置环境变量TEMP和TMPDIR指向相应的位置,例如:
    • 使用bash
      mkdir /home/temp
      TEMP=/home/temp ; export TEMP
      TMPDIR=/home/temp ; export TMPDIR

    • 使用csh
      mkdir /home/temp
      setenv TEMP /home/temp
      setenv TMPDIR /home/temp


    操作系统:
    Oracle公司官方公布的资料指出Oracle 9i只在安装SuSuSe 7.1, 内核 2.4.4 和glibc2.2的系统上测试通过,经过本人的测试,Oracle在Linux Mandrake release 8.0,内核2.4.3-20和glibc-2.2.2的版本上也可以顺利安装,本文将以Linux Mandrake8.0为例介绍Oracle9i的安装过程。

    虚拟x-windows软件:
    这个软件不是必要的!所谓虚拟x-windows软件指的是可在远程终端允许服务器x-windows的虚拟软件,现在流行的x-windows软件有exceed、x-win32等软件,如果你嫌在控制台安装Oracle系统麻烦,可以使用虚拟x-windows软件在远程终端在图形界面下安装oralce9i,本文将以x-win32 5.0为例介绍用虚拟x-windows安装Oracle9i的过程。

    JDK
    如果你要安装Oracle HTTP Server还需要用到blackdown的JDK1.3.1,请到以下地址下载ftp://ftp.progsoc.uts.edu.au/pub/Linux/java/JDK-1.3.0/i386/rc1/j2sdk-1.3.0-RC1-linux-i386.tar.bz2

    配置内核参数
    Oracle9i使用Linux的共享内存、交换区等资源进行工作,如果你的内核参数设置不能满足Oracle的要求,那在安装oracel9i或使用过程就会频频出现问题,因此配置系统内核的参数就显得尤为重要和关键了。
    内核参数的配置一般在/proc文件夹下配置:
    1. 以root用户允许以下命令;
    2. 进入目录/proc/sys/kernel;
    3. 用cat命令或more命令查看semaphore当前参数的值:
    cat sem

    命令运行后将会出现如下的结果:
    250 32000 32 128
    其中, 250 是参数SEMMSL的值,32000是参数SEMMNS的值, 32是参数SEMOPM的值,而128则是参数SEMMNI的值。
    4. 用以下的命令可以对上述参数进行修改
    echo SEMMSL_value SEMMNS_value SEMOPM_value SEMMNI_value > sem

    其中SEMMSL_value、SEMMNS_value、SEMOPM_value、SEMMNI_value分别用相应的值进行替换,并且这些值的顺序不能调换
    5. 设置共享内存大小,共享内存大小一般设为物理内存的一半,在这里我们假设物理内存为512M则共享内存的值4294967295以此类推,如果你的物理内存是1G则这里的值则是8589934590:
    echo 4294967295 > shmmax

    添加用户
    Oracle在安装和使用中需要用特定用户(非root用户),按照Oracle的标准说明是需要添加三个专门用户和用户组,为了简便大家的安装和使用我们把Oracle的安装和使用归到一个特定用户来完成。
    首先创建Oracle用户组,我们架设这个用户组命名为dba:
    以root用户登陆系统;
    运行groupadd dba命令添加dba用户组;
    添加Oracle用户:
    以root用户登陆系统;运行如下命令:
    useradd –g dba –p password –d /Oracle –s /bin/bash Oracle

    运行后系统创建了一个属于dba用户组的用户Oracle,密码为password,主目录为/Oracle使用bash
    这个用户将作为系统的安装和使用指定用户,因此要妥善保存好!

    创建安装点(mount point)
    Oracle9i的典型安装需要至少两个安装点:一个安装基本的运行程序,要求至少要有850M的硬盘空间;一个为存放数据库,至少要求有450M的硬盘空间。为了简化安装我们可以把运行程序和数据库装在同一个安装点下。
    在你的文件系统上找到有足够空间的分区,在分区下创建文件夹,我们假设这个文件夹为/Oracle
    配置系统环境变量
    很多网友安装Oracle失败都是因为环境变量没有配置正确,环境变量的配置直接影响到以后Oracle9i的安装和配置,在配置的时候要尤为小心!
    配置x-windows变量
    确认Oracle9i在安装过程中是否使用本地x-windows安装还是远程虚拟x-windows安装,如果需要远程x-windows安装,则需要配置DISPLAY变量,这个变量用于告诉系统屏幕的图形将输出到什么位置,默认情况下是本机,如果你使用虚拟x-windows进行安装,则在这里指明远程终端的显示情况,比如你远程终端的IP地址是xxx.xxx.xxx.xxx则DISPLAY的变量应设为“xxx.xxx.xxx.xxx:0”后面的“:0”表示该终端的第一个显示器。
    确定安装临时目录
    前面我们提到过Oracle9i的安装需要一个临时的可写空间,我们在这里把/tmp作为临时的可写目录。如果你不是使用/tmp作为临时可写目录则需要配置相应的值TMPDIR=/path。
    配置Oracle的环境变量
    下面提供一个例子可以供大家参照使用
    export DISPLAY="192.9.200.24:0.0"
    export BASH_ENV=$HOME/.bashrc
    Oracle_HOME=/Oracle/product/9.0.1; export Oracle_HOME
    Oracle_SID=Oracle; export Oracle_SID
    Oracle_TERM=xterm; export Oracle_TERM
    TNS_ADMIN=/home/Oracle/config/9.0.1; export TNS_ADMIN
    NLS_LANG=american_america.ZHS16GBK; export NLS_LANG
    ORA_NLS33=$Oracle_HOME/ocommon/nls/admin/data; export ORA_NLS33
    LD_LIBRARY_PATH=$Oracle_HOME/lib;export LD_LIBRARY_PATH
    PATH=$PATH:/bin:/usr/bin:/usr/sbin:/etc:/opt/bin:
    /usr/ccs/bin:/usr/openwin
    PATH=$PATH:/opt/local/bin:/opt/NSCPnav/bin:$Oracle_HOME/bin
    PATH=$PATH:/usr/local/samba/bin:/usr/ucb:
    export PATH
    CLASSPATH=$Oracle_HOME/JRE:$Oracle_HOME/jlib:
    $Oracle_HOME/rdbms/jlib
    CLASSPATH=$CLASSPATH:$Oracle_HOME/network/jlib
    TMPDIR=/tmp;export TMPDIR
    umask 022

    其中:
    Oracle_HOME为系统软件的安装目录;
    Oracle_SID 为数据库的SID,这里可以自行设置;
    NLS_LANG 为数据库的字符集,为了保证数据库能够输出输入数据库,我们需要在这里把字符集设为american_america.ZHS16GBK,其中american_america英文字符集,ZHS16GBK为中文字符集。
    Oracle用户登陆系统,
    vi $HOME/.bash_profile
    把以上环境变量的设置粘贴到文件中,确认相应的内容并修改,存盘退出。
    重新登陆Oracle用户
    使用set|more命令查看Oracle用户的环境变量是否生效
    CLASSPATH=/Oracle/product/9.0.1/JRE:/Oracle/product/9.0.1/jlib:
    /Oracle/product/9.0.1/rdbms/jlib:
    /Oracle/product/9.0.1/network/jlib
    DISPLAY=192.9.200.24:0.0
    LD_LIBRARY_PATH=/Oracle/product/9.0.1/lib:/lib:/usr/lib:
    NLS_LANG=american_america.ZHS16GBK
    Oracle_HOME=/Oracle/product/9.0.1
    Oracle_SID=Oracle
    Oracle_TERM=xterm
    ORA_NLS33=/Oracle/product/9.0.1/ocommon/nls/admin/data
    OSTYPE=linux-gnu
    PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/games:
    /bin:/usr/bin:/usr/sbin:/etc:/opt/bin:/usr/ccs/bin:/usr/openwin:
    /opt/local/bin:/opt/NSCPnav/bin:
    /Oracle/product/9.0.1/bin:/usr/local/samba/bin:/usr/ucb:
    TNS_ADMIN=/home/Oracle/config/9.0.1

    仔细检查一下以上的几项,确保都设置正确了。
    安装Oralce9i
    安装JDK1.3.1
    把下载的j2sdk-1.3.0-RC1-linux-i386.tar.bz2文件上传到服务器的/usr/local/目录下,以root用户登陆,用bzip –d j2sdk-1.3.0-RC1-linux-i386.tar.bz2命令先把文件解成tar格式,再使用tar xvf j2sdk-1.3.0-RC1-linux-i386.tar.bz2解压出来,为了便于操作可以把文件夹名改成jdk.。
    配置x-windows
    Oracle9i的安装几乎支持所有的x-windows,也支持远程的虚拟x-windows安装,如果你要在本机安装在控制台上以我们先前创建的Oracle用户登陆(注意要先设置好环境变量,并把DISPLAY的值设为空export DISPLAY=””)运行startx命令进入x-windows。
    如果需要在远程终端使用虚拟x-windows进行安装,需要在客户端先安装x-win32软件,x-win32的安装过程我们就不多介绍了,安装完成后运行x-win32命令在你的任务栏会出现一个x的标致。使用neterm等终端攻击以Oracle用户登陆系统确认环境变量都已经生效并且DISPLAY变量的值为你终端机的IP地址,运行startkde命令启动x-windows,运行完毕后系统会出现一大堆的出错信息,忽略不管,过了几秒后在你的远程终端上会出现Linux的kde界面。
    下载Oracle安装软件
    Oracle网站(http://otn.Oracle.com)现在提供Oracle9i for Linux软件下载,在下载前请仔细阅读他的Licence,这样在今后的使用中才不会有版权问题。在下载前你需要一个otn的账户,申请是免费的,只要简单回答几个问题就可以,Oracle9i的安装程序共有三个文件包分别是:
    Linux9i_Disk1.cpio.gz (412,092kb)
    Linux9i_Disk2.cpio.gz (638,547kb)
    Linux9i_Disk3.cpio.gz (82,956kb)
    下载完这三个文件后,把这三个文件上传到服务器/Oracle目录下,并保证这三个文件的属主是Oracle用户。如果你有Oracle9i的安装CD那就可以省下大把下载时间了。
    安装Oracle 9i 数据库
    Oracle用户登陆系统,启动本地x-windows或虚拟x-windows,打开一个控制台窗口,进入到刚才存放Oracle文件的目录下,分别使用
    gunzip Linux9i_Disk1.cpio.gz
    cpio -idmv <Linux9i_Disk1.cpio
    gunzip Linux9i_Disk2.cpio.gz
    cpio -idmv <Linux9i_Disk2.cpio
    gunzip Linux9i_Disk3.cpio.gz
    cpio -idmv <Linux9i_Disk3.cpio
    命令解包,把三个文件包解压缩成三个安装文件夹分别为Disk1、Disk2、Disk3。
    进入Disk1目录
    cd Disk1
    在控制台窗口敲入
    ./runInstaller &
    运行后会出现一个OUI的图形界面,如下图所示:

    点击小图放大

    中间绿色的窗口就是Oracle的安装图形界面了。
    下面我们来进行Oracle9i最基本的安装,在进入安装界面后点Next进入下一步:

    点击小图放大

    Source指的是包含Oracle产品信息的文件,一般情况下他会自动识别到,如果找不到可以用Browse按钮来手工指定路径。
    Destination指的是9i将要安装的路径这里就是我们在环境变量里设的$Oracle_HOME,如果这一栏里是空白的则要重新检查环境变量中各值的设定是否有误。确认正确后按Next进行下一步:

    点击小图放大

    这一步有三个安装选项供选择:
    Oracle9i Database 9.0.1.0.0,安装Oracle9i的数据库服务器版本、管理工具、网络服务以及基本的客户端软件;
    Oracle9i Client 9.0.1.0.0 ,企业版的客户端软件,网络服务以及开发工具等。
    Oracle9i Mangement and Integration 9.0.1.0.0,安装Management Server,管理工具Oracle的网络目录、综合服务、网络服务以及基本的客户端软件。
    我们选第一项安装Oracle9i数据库服务器,接着安Next按钮;

    点击小图放大

    这一步是选择Oracle安装的类型,有三个类型供选择Enterprise Edition,企业版,Standstard Edition标致版,Custom自定义安装,我们选择企业版的安装,如果你对Oracle这一系列的产品比较熟悉的化可以选择Custom自定义安装,按自己的需求选择组件进行安装,确认后安Next进入到下一步;

    点击小图放大

    这里可以选择一种适合你的数据库模版,一般我们选第一种通用的数据库模版,如果你需要使用数据仓库,则可以使用选择数据仓库的模版进行安装。确认后按Next进入下一步;

    点击小图放大

    这一步是确认Oracle9i的SID和全局数据库的名字,SID的值我们在环境变量中已经设好了,所以这里就自动显示了,全局数据库名(Global Database Name)我们可以也指定成和SID的值相同,确认后按Next进入下一步;

    点击小图放大

    前面我们提到了,数据库的字符类型在数据库超作中是很关键的,这一步就是设置数据库的字符集,前面我们设置的是NLS_LANG=american_america.ZHS16GBK,所以我们选择Simplifiled Chinese ZHS16GBK,按Next进入下一步;

    点击小图放大

    因为我们在前面选择了Enterprise的版本进行安装,系统会安装Oracle Web Server,安装Oracle Web Server需要使用JDK,我们使用Browse按钮把前面安装JDK的目录指定好以便系统能在安装过程中找到需要的应用程序,确认按Next进入下一步;

    点击小图放大

    进行完所有选择后,系统会给出一个安装概要,这里列举了你选择安装的组件,确认你要安装的东西都在列表内后,安Install钮进行安装,如果不需要安装其它的程序,则按Exit退出安装界面。

    点击小图放大


    Oracle的安装速度视服务器的性能一般来说需要装30分钟的时间,在安装过程中可能会有对话框弹出,对话框内会有一些需要root运行的命令要求你执行,这时候另外开一个控制台窗口,su成root并运行提示框内的命令,运行完毕后按确定继续安装;

    点击小图放大

    安装完数据库后系统会运行配置工具对系统进行网络和数据库的配置。配置完成后,系统会自动启动数据库,并开启Oracle Web Server。所有配置完后,按Next完成安装。

    点击小图放大

    如果一切正常,OUI会出现The Installation Of Oracle9i Database Was successful.的字样,这表明你的Oracle9i数据库安装正常了,如果需要安装其它的内容按Next Install钮进行其它内容的安装,否则按Exit退出安装。

    使用Oracle 9i 数据库
    安装完毕后Oracle数据库会自动启动,下面我们用实际超作来说明一下Oracle 9i数据库的启动和关闭。
    Oracle用户登陆数据库,开个控制台窗口;
    关闭Oracle 9i 数据库
    [Oracle@wing /Oracle]$ sqlplus " / as sysdba" //以sysdba用户登陆数据库
    SQL*Plus: Release 9.0.1.0.0 - Production on Wed Jul 11 15:35:31 2001
    (c) Copyright 2001 Oracle Corporation. All rights reserved.

    Connected to:
    Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
    With the Partitioning option
    JServer Release 9.0.1.0.0 - Production
    运行shudown命令关闭数据库
    SQL> shutdown
    Database closed.
    Database dismounted.
    Oracle instance shut down.
    SQL>
    启动Oracle 9i 数据库
    [Oracle@wing bin]$ sqlplus " / as sysdba"
    SQL*Plus: Release 9.0.1.0.0 - Production on Wed Jul 11 16:00:59 2001
    (c) Copyright 2001 Oracle Corporation. All rights reserved.
    Connected to an idle instance.
    SQL> startup
    Oracle instance started.
    Total System Global Area 336356520 bytes
    Fixed Size 279720 bytes
    Variable Size 268435456 bytes
    Database Buffers 67108864 bytes
    Redo Buffers 532480 bytes
    Database mounted.
    Database opened.
    SQL>

    启动Oracle 9i监听程序
    Oracle的监听程序主要是为客户端的连接提供接口
    [Oracle@wing bin]$ lsnrctl
    LSNRCTL for Linux: Version 9.0.1.0.0 - Production on 11-JUL-2001 16:12:17
    Copyright (c) 1991, 2001, Oracle Corporation. All rights reserved.
    Welcome to LSNRCTL, type "help" for information.
    LSNRCTL> start
    Starting /Oracle/product/9.0.1/bin/tnslsnr: please wait...
    TNSLSNR for Linux: Version 9.0.1.0.0 - Production
    System parameter file is /Oracle/product/9.0.1/network/admin/listener.ora
    Log messages written to /Oracle/product/9.0.1/network/log/listener.log
    Listening on: (DEscrīptION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
    Listening on: (DEscrīptION=(ADDRESS=(PROTOCOL=tcp)(HOST=wing)(PORT=1521)))
    Connecting to (DEscrīptION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
    STATUS of the LISTENER
    ------------------------
    Alias LISTENER
    Version TNSLSNR for Linux: Version 9.0.1.0.0 - Production
    Start Date 11-JUL-2001 16:12:58
    Uptime 0 days 0 hr. 0 min. 0 sec
    Trace Level off
    Security OFF
    SNMP OFF
    Listener Parameter File /Oracle/product/9.0.1/network/admin/listener.ora
    Listener Log File /Oracle/product/9.0.1/network/log/listener.log
    Listening Endpoints Summary...
    (DEscrīptION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
    (DEscrīptION=(ADDRESS=(PROTOCOL=tcp)(HOST=wing)(PORT=1521)))
    Services Summary...
    Service "PLSExtProc" has 1 instance(s).
    Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
    Service "Oracle" has 1 instance(s).
    Instance "Oracle", status UNKNOWN, has 1 handler(s) for this service...
    The command completed successfully
    LSNRCTL>


    关闭Oracle 9i监听程序
    [Oracle@wing bin]$ lsnrctl
    LSNRCTL for Linux: Version 9.0.1.0.0 - Production on 11-JUL-2001 16:12:17
    Copyright (c) 1991, 2001, Oracle Corporation. All rights reserved.
    Welcome to LSNRCTL, type "help" for information.
    LSNRCTL> stop
    Connecting to (DEscrīptION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
    The command completed successfully
    LSNRCTL>

    关闭Oracle Web Server
    cd $Oracle_HOME/Apache/Apache/bin
    ./stopJServ.sh
    /Oracle/product/9.0.1/Apache/Apache/bin/apachectl stop: httpd stopped

    启动Oracle Web Server
    cd $Oracle_HOME/Apache/Apache/bin
    [Oracle@wing bin]$ ./startJServ.sh
    /Oracle/product/9.0.1/Apache/Apache/bin/apachectl start: httpd started


    启动Oracle Web Server后默认的端口号是7777
    在客户端浏览器地址栏输入http://xxx.xx.xxx.xxx:7777/
    如果浏览器出现以下界面则表示Oracle Web Server运行正常

     

  • 性能测试分析-中级测试师用

    2007-06-26 15:27:35

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

    分析原则:
        • 具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)
        • 查找瓶颈时按以下顺序,由易到难。
        服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库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数据库的分析和优化,是一门专门的技术,进一步的分析可查相关资料。
  • 性能测试的几个主要术语

    2007-06-19 11:43:55

    性能测试的几个主要术语

    (摘选)



    响应时间(response time

    响应时间,是指系统对用户操作的反馈时间。我们可以举一个163邮箱登录的例子:
    我们如何来测试邮箱的登录响应时间呢?我们首先进入[size=10.5pt]mail.163.com网页,输入合法的用户名和密码,点击“登录”,直到登录后的邮箱界面完全显示出来为止。那么响应时间从什么时候开始计算呢?是我们输入用户名的时候,还是点击“登录”的时候?
    显然,我们应该从按下“登录”按钮的那一瞬间开始计时,到登录后页面完全显示出来为止,这才是真正的用户登录时间,而不包括用户输入用户名和密码的时间以及思考停顿的时间([size=10.5pt]think time



    登录响应时间其实包括3个部分:网络传输时间,服务器处理时间,浏览器显示时间
    登录响应时间=网络传输时间*2+服务器处理时间+客户端显示时间
    网络传输是双向的,所以要乘以2。网络传输时间又可以包括接入网的传输时间和互联网中的传输时间,它的大小和你所使用的上网方式有关,比如光纤一般要比adsl要快。
    服务器包括web服务器和数据库服务器,服务器处理时间是我们测试的重点,也是我们能够控制的部分,因为最终用户用什么机器上网,什么接入方式上网我们是控制不了的。我们要重点测试服务器的处理速度如何,以及能否承受较大的压力,我们可以用工具(比如[size=10.5pt]LoadRunner)来模拟大量用户同时登录访问服务器,来查看服务器的承载能力。
    客户端显示时间,如何将服务器传过来的页面尽快地显示到浏览器上,是开发人员需要考虑的问题,这里面涉及到算法优化的问题,这也是开发人员容易忽略的地方。
    由此可见,响应时间是可以分解成若干个时间段的,任何一个环节出问题都会影响到最终的响应时间,这就需要我们在实际工作中结合具体情况加以分析。
    最后再说明一点,响应时间的快慢是一个相对的概念,没有绝对的标准,比如对于163邮箱登录来说,用户可以接受的时间可以在10秒以内,而对于一个实时的军工软件来说,相应时间要精确到毫米级别甚至更低。
    对于普通的web网站来说,一个普遍被接受的响应时间标准是2/5/10,即用户对2秒钟以内的的响应时间非常满意,对于5秒钟以内的响应时间基本满意,对于10秒钟以上的响应时间则无法接受,如图2-3


    吞吐量(throughput

    吞吐量,是指单位时间内流经被测系统的数据流量,一般单位为b/s,即每秒钟流经的字节数。
    吞吐量是大型门户网站以及各种电子商务网站衡量自身负载能力的一个很重要的指标,一般吞吐量越大,系统单位时间内处理的数据越多,系统的负载能力也越强。
    吞吐量和很多因素有关,比如服务器的硬件配置,网络的拓扑结构,软件的技术架构等。实际工作中,我们往往对升级客户的硬件配置无能为力,大多数情况下,我们还是在软件的技术架构上做文章:
    比如后台数据库装oracle还是装sql s[size=10.5pt]erver,显然前者的处理能力更强;
    web服务器是用w[size=10.5pt]eblogic还是iis,要看服务器端的语言是jsp还是asp…
    测试的时候多跟项目经理,系统架构师以及用户沟通,来获取系统架构的第一手材料。

    2.2.3并发(concurrency

    并发,是指多个同时发生的操作。比如有10个用户同时点击“登录”按钮(注意是同时),来登录163邮箱,我们就说此次登录163邮箱的并发数为10。
    需要注意的是,并发和并行不是一个概念,并发是同时发生,并行是同步运行。10个用户并发登录163邮箱,只是在点击“登录”按钮那一瞬间是并行的,而登录后各个用户的操作则不同步。

    稳定性测试(reliability testing


    稳定性测试,也叫可靠性测试([size=10.5pt]reliability testing),是指连续运行被测系统,检查系统运行时的稳定程度。


    我们通常用mtbf([size=10.5pt]mean time between failure,即错误发生的平均时间间隔)来衡量系统的稳定性,mtbf越大,系统的稳定性越强


    稳定性测试的方法也很简单,即采用24*7(24小时*7天)的方式让系统不间断运行,至于具体运行多少天,是一周还是一个月,视项目的实际情况而定。

    负载测试(load testing

    负载测试,是性能测试的一种,通常是指让被测系统在其能忍受的压力的极限范围之内连续运行,来测试系统的稳定性。
    可以看出负载测试和稳定性测试比较相似,都是让被测系统连续运行,区别就在于负载测试需要给被测系统施加其刚好能承受的压力,比如我们还是测试163邮箱系统的登录模块,我们先用1个用户登录,再用两个用户并发登录,再用5个,10个…在这个过程中,我们每次都需要观察并记录服务器的资源消耗情况(可以通过任务管理器中的性能监视器或者控制面板中的性能监视器),当发现服务器的资源消耗快要达到临界值时(比如cpu的利用率90%以上,内存的占有率达到80%以上),停止增加用户,假如现在的并发用户数为20,我们就用这20个用户同时多次重复登录,直到系统出现故障为止。
    负载测试为我们测试系统在临界状态下运行是否稳定提供了一种办法。

    压力测试(stress testing

    压力测试,是性能测试的一种,通常是指持续不断的给被测系统增加压力,直到将被测系统压垮为止,用来测试系统所能承受的最大压力。
    比如我们不断增加并发的登录用户数,20,30,50…比如,当增加到70个用户并发登录时,系统崩溃了,我们就可以知道163邮箱所能承载的最大登录并发数为70个左右。

    我们把上面的思路整理一下,编写一下163邮箱登录模块性能测试用例,供大家参考(假设163邮箱要求登录的时间最多不超过10秒,测试环境略)


    关于性能测试的分类,可以举一个比较通俗的例子方便大家理解:
    假设一个人很轻松就能背1袋米,背2袋米很吃力,最多就能背3袋米
    稳定性测试--我让他背1袋米,但是让他去操场上跑圈,看多久累倒。
    负载测试--我让他背2袋米去操场上跑圈,看多久累倒。
    压力测试--我让他背2袋米,3袋米,4袋米…发现他最多就能背3袋。
  • LoadRunner监控Windows和Linux常见问题

    2007-06-14 17:53:40

    LoadRunner监控Windows和Linux常见问题

    字体:        | 上一篇 下一篇 | 打印

            在51Testing看到一位网友的总结,非常全面. 最近上礼拜Levis总是问为什么他的Linux资源情况监控不了,应该好好看看这篇文章。

    关于LR监视Windows和linux的说明

    一 windows

    1 监视连接前的准备工作

            首先保证被监视的windows系统开启以下二个服务Remote Procedure Call(RPC) 和Remote Registry Service (这里具体在那里开起服务就不说了)。

            被监视的WINDOWS机器:右击我的电脑,选择管理->共享文件夹->共享 在这里面要有C$这个共享文件夹,(要是没有自己手动加)。

            然后保证在安装LR的机器上使用运行.输入\\被监视机器IP\C$ 然后输入管理员帐号和密码,如果能看到被监视机器的C盘了,就说明你得到了那台机器的管理员权限,可以使用LR去连接了。

            说明: LR要连接WINDOWS机器进行监视貌似要有管理员帐号和密码才行。

    2 用LR监视windows的步骤

    (这里就不详细说明了,只要在窗口中右击鼠标选择Add Measurements就可以了)

    二 linux

    1 准备工作

            首先,监视Linux一定要有rstatd这个守护进程,有的Linux版本里也有可能是rpc.rstatd这里只是名字不同而已,功能是一样的。

            一般来说LINUX需要下载一个包才有这个服务,包名字是rpc.rstatd-4.0.1.tar.gz. 这是一个源码,需要编译。

    下载并安装rstatd

    tar -ivh rpc.rstatd-4.0.1.tar.gz
    ./configure —配置
    make —编译
    make install —安装
    rpc.rstatd —启动rstatd进程

    配置rstatd 目标守护进程是xinetd,它的主配置文件是/etc/xinetd.conf 里面内容是

    只有基本信息
    # Simple configuration file for xinetd
    #
    # Some defaults, and include /etc/xinetd.d/

    defaults
    {
    instances = 60
    log_type = SYSLOG authpriv
    log_on_success = HOST PID
    log_on_failure = HOST
    cps = 25 30
    }

    includedir /etc/xinetd.d

    里面内容的意思在这里就不说了!网上有具体解释,

            我们这里需要修改的是/etc/xinetd.d/下的三个conf文件 rlogin ,rsh,rexec 这三个配置文件,打这三个文件里的disable = yes都改成 disable = no ( disabled 用在默认的 {} 中 禁止服务)或是把# default: off都设置成 on 这个的意思就是在xinetd启动的时候默认都启动上面的三个服务!(由于貌似用ps ax不能看到rlogin ,rsh ,rexec这三个进程是否开启,所以使用default: on,因为rstatd和xinetd这二个服务是否启动在ps ax里是看的到的)。
            然后你在保证Linux机器上的进程里有rstatd和xinetd这二个服务就可以用LR去监视了。

    几点小的技巧:

    检查是否启动: rsh server 监听和TCP 是514。
    [root@mg04 root]# netstat -an |grep 514
    tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN
    如果能看到514在监听说明rsh服务器已经启动。

    检查是否启动: rstatd

    输入命令: rpcinfo -p

    如果能看到

    程序 版本 协议 端口

    *** **** udp 741 rstatd

    那就说明rstatd服务启动了,(当然这里也可以用ps ax代替)。

    几点说明: 1) 在实际操作中有可能会碰到一些问题,这里还有一份网上的关于LR连接时候可能出错的情况,详细请见下面;

    2) 网上也有人说在LR的资源窗口中右击鼠标出现的Add Measurements选项是暗淡的,我操作的时候没碰到,这里可能是LR没有完全安装的原因;

    3) 启动rstatd:

    # rpc.rstatd

    在启动rpc.rstatd时,会报错“Cannot register service: RPC: Unable to receive; errno = Ction refused”。

    解决方法如下:

    # /etc/init.d ./portmap start
    # /etc/init.d ./nfs start
    然后再次启动rpc.rstatd就好了。

    4)重起xinetd方法:
    在有的系统中,通过如下命令重启:
    # service xinetd reload
    # /sbin/service xinetd rstart
    在suse linux 中如下操作:
    cd /etc/init.d/
    ./xinetd restart

    LoadRunner中服务器资源监控器疑难解答

            要监控服务器计算机上的资源,必须能够连接到该计算机。如果监控失败,并且 LoadRunner 找不到指定的服务器,请确认指定的服务器是否可用。在 Controller 或优化控制台计算机命令行中键入 ping <server_name>,执行“ping”操作。

            验证可以访问该计算机后,请查看下表中有关监控器疑难解答的其他提示。

    问题

    解决方案

    无法监控其他域中的 Windows 计算机,或者访问被拒绝

    要获得对远程计算机的管理权限,请在命令提示符下执行以下命令:

    %net use \\<计算机名>/用户:[<>\<远程计算机名>]

    提示输入密码时,输入远程计算机的密码。

    无法监控 NT/Win 2000 计算机(发出一条错误消息:未找到计算机名无法连接到主机

    要监控的 NT/Win 2000 计算机仅允许具有管理员权限的用户进行监控。要允许非管理员用户进行监控,必须授予用户对特定文件和注册表项的读取权限(Microsoft 技术说明编号 Q158438)。需要执行下列步骤:

    a. 使用浏览器或文件管理器,授予用户对下列项的读取权限:
    %windir%\system32\PERFCxxx.DAT

    %windir%\system32\PERFHxxx.DAT

    其中 xxx 是系统的基本语言 ID
    例如,英语 ID 009。这些文件可能
    已丢失或损坏。如果对此有怀疑,请从
    安装 CD 中提取这些文件。

    b. 使用 REGEDT32,授予用户对下列项的读取权限:
    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Perflib
    以及该项的所有子项。

    c. 使用 REGEDT32,至少授予用户对下列项的读取权限:
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\ Control\SecurePipeServers\winreg

    无法从 NT 计算机监控某些 Win 2000 计数器。

    Win 2000 计算机上运行 Controller 或优化控制台。

    某些 Windows 默认计数器生成错误

    删除有问题的计数器,并使用添加度量对话框添加相应计数器。

    无法从被监控的计算机上获得 SQL Server 6.5 版的性能计数器。

    这是 SQL Server 6.5 版的一个错误。解决方法为:在被监控的计算机上使用 regedt32,授予用户对以下注册表项的读取权限:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer

    Microsoft 技术说明编号 Q170394

    选定度量未显示在图中。

    确保已注册显示文件和 online.exe。要在不执行完全安装的情况下注册监控器的 dll,请运行 LoadRunner\bin 中的 set_mon.bat 批处理文件。

    监控 Windows 计算机时,图中不显示任何度量。

    检查内置的 Windows 性能监控器。如果该监控器不能正常工作,则可能是通信设置有问题。

    监控 UNIX 计算机时,图中不显示任何度量。

    确保 rstatd 正在 UNIX 计算机上运行(请参阅系统资源监控)。

    无法监控下列 Web 服务器之一:MS IISMS ASP ColdFusion

    请参阅上面的问题无法监控 Windows 计算机

    无法监控 WebLogic (JMX) 服务器

    打开 <LoadRunner 根文件夹>\dat\monitors\WebLogicMon.ini 文件,并搜索:
    [WebLogicMonitor]
    JVM=javaw.exe
    javaw.exe 更改为java.exe。将打开一个包含跟踪信息的窗口。


     三 Unix

    对于Unix系统,比如Solaris,AIX或者HP UX等,它们的配置过程比较简单——在inetd.conf(在/etc目录下)文件中去掉rstatd前面的注释,然后启动rstatd服务即可。

     

    查看全部评论(1) 最新评论

    • 删除 red-hat (2007-6-07 14:55:59, 评 0 分)

      tar -ivh rpc.rstatd-4.0.1.tar.gz
      这条命令是错误的,用tar命令解压缩没有错误,关键是这个命令后面带的几个option错了 ,-ivh是用rpm命令安装rpm包时所用的options, #rpm -ivh,在这里,i是显示安装信息的,包括包名,版本等;v也代表显示信息,h代表用#号显示安装的进度
      tar -ivh rpc.rstatd-4.0.1.tar.gz正确的是tar -xzvf rpc.rstatd-4.0.1.tar.gz

Open Toolbar