发布新日志

  • vss的documend help

    2008-03-20 20:25:52Top 1 Digest 2

    VSS使用手册

    1 VSS概述

    版本控制是工作组软件开发中的重要方面,它能防止意外的文件丢失、允许反追踪到早期版本、并能对版本进行分支、合并和管理。在软件开发和您需要比较两种版本的文件或找回早期版本的文件时,源代码的控制是非常有用的。

    Visual SourceSafe 是一种源代码控制系统,它提供了完善的版本和配置管理功能,以及安全保护和跟踪检查功能。VSS通过将有关项目文档(包括文本文件、图象文件、二进制文件、声音文件、视屏文件)存入数据库进行项目研发管理工作。用户可以根据需要随时快速有效地共享文件。文件一旦被添加进VSS,它的每次改动都会被记录下来,用户可以恢复文件的早期版本,项目组的其他成员也可以看到有关文档的最新版本,并对它们进行修改,VSS也同样会将新的改动记录下来。你还会发现,用VSS来组织管理项目,使得项目组间的沟通与合作更简易而且直观。

    VSS可以同 Visual BasicVisual C++Visual J++Visual InterDevVisual FoxPro 开发环境以及 Microsoft Office 应用程序集成在一起,提供了方便易用、面向项目的版本控制功能。Visual SourceSafe 可以处理由各种开发语言、创作工具或应用程序所创建的任何文件类型。在提倡文件再使用的今天,用户可以同时在文件和项目级进行工作。Visual SourceSafe 面向项目的特性能更有效地管理工作组应用程序开发工作中的日常任务。

     

     

    11 VSS中的文件

    当你要修改某个文档时,需要先从数据库中将它签出(check out),或者告诉VSS你要编辑该文档。VSS会将该文档的副本从数据库中拿到你的工作文件夹(working folder)中,你就可以修改你的文档了。如果其他用户再想对同一文档进行修改,VSS会产生一个信息,告诉他,该文档已被签出(check out),从而避免多人同时修改文档,以保证文档的安全性。

    当你完成修改之后,需要将文档 签入(check inVSS。这个操作从你的工作文件夹(working folder)中复制被你修改的文档,并将它放回VSS数据库,以便其他用户能够及时看到文档的改动。VSS能够保存文档的所有改动,并显示最新版本,同时早期版本也会被跟踪记录下来。VSS对反增量技术的运用,仅需要用很少的磁盘空间就能使得用户获取文档的所有版本。

    如果你没有修改文档,你可以执行撤消签出(undo check out)命令,文档将被保存为被签出(check out)之前的状态。

    如果你只需读取某一文档而并不需要编辑它,你可以执行取出(get)命令,将文档放入你的工作文件夹,再选择查看文档(view),来查看你的文档的最新版本。

     

     

    12 VSS中的项目

    项目(project)是指用户存储在VSS数据库中的所有文件(file)的集合。用户可以在项目之间或项目内部实现文件的添加(add)、删除(delete)、编辑(edit)、共享(share)。一个“项目(project)”在很大程度上类似于一个普通系统的的文件夹,不同的是它能更好地支持文件合并(merge)、跟踪(archive)和版本控制(version control)功能。

    文件保存在VSS数据库中的项目(project)里。你无须管理存储在VSS 中的文件正本,除非你要检查或与其它拷贝进行比较。

    VSS为每一位用户提供了一份备份文件放入工作文件夹(working folder),供用户对文件进行查看与编辑。尽管没有工作文件夹也可以查看文件,但要想真正实现对文档的处理,必须建立工作文件夹。

     

     

    13 VSS的版本控制功能

    VSS能够保存文件的多个版本,包括文件版本之间每一处微小的变动。版本控制有以下几方面的内容:

    l 组内合作——在缺省的情况下,一般一个文件在某一时间只允许一个用户对其进行修改,这样可以防止文件意外地被其他用户改动或者覆盖。但管理员可以改动这种缺省的设置,允许文件多层签出。这种设置也能防止过多的、不必要的改动。

    l 版本追踪——VSS能够对源代码和其他文件进行存储和早期版本的追踪,从而实现重建文件早期版本等有关功能。

    l 跨平台开发——在多平台开发的情况下,版本追踪用于维护核心代码。

    l 代码的再使用—— 追踪程序基准使得代码可重用。

     

     

    14 文件的拆分和共享

    VSS中可以实现一个文件被多个项目共享(share)。在一个项目中对文件的改动可以自动反映到其他共享的项目中去。这正提倡了代码重用。在file菜单中的properties中,点击link,可以查看某一文件的共享情况。

    拆分(branch)是将文件从原来共享的项目中分离出来的过程。它使得VSS可以实现从不同的路径追踪文件。

    注:在其他版本控制系统中,分支是通过跟踪版本号来实现的。例如:版本“2.3.9.2”是版本2.3的第二个修订版本的第九个分支。而VSS通过明显不同的项目名称实现对文件分支的跟踪。

    拆分文件就断开了共享连接,使得本项目中的文件与其他原来共享的项目无关。对此文件的修改将不会再反映到其他项目上。拆分是这样被建立的:两个文件以前有着共同的历史记录,从实现拆分开始,他们的历史记录将被VSS分别追踪。

    拆分文件之后,link按纽将不再显示已断开的连接,但你可以用pathfile菜单中的properties项)按纽浏览拆分的历史记录。

    共享(share)文件就是在多个项目间建立文件的连接。拆分(branch)文件就是在项目之间建立了不同的文件路径。

     

     

    15 工作文件夹(working folder)

    VSS是存储和管理文件的工具,但是编辑和编译文件必须在VSS指定文件夹中进行。这个文件夹叫工作文件夹,它可以是现存的文件夹,也可以是VSS新建的文件夹。VSS浏览器在文件列表上方显示了文件的工作文件夹的路径。

    VSS系统中,工作文件夹才是你真正用于处理文档的地方。当你要编辑或修改某个文档时,必须对文档实施check out 操作(详见3.3.5修改和编辑文件),VSS将该文档从项目中拷贝出来,放入你的工作文件夹。当你修改完毕并check in 文件之后,VSS又将文件重新拷贝到数据库中以记录你的修改。

     

     

    一旦你将文件签出,VSS就开始在你的本地机上创建并管理你的工作文件夹。

    每一个用户、每一个项目或每一台微机都可以有自己的工作文件夹。如果Joe在项目$/SpreadSheet$/WordProcessor上工作,他就有相应的2个不同的工作文件夹。如果Hanna在同样的项目上工作,对于每一个项目她又有自己的工作文件夹。

    当你为某个项目设置了工作文件夹,你可以用它来放置你该项目中包括子项目再内的所

     

     

    2 VSS的客户端安装

     

     

    21 安装VSS的系统条件

    l 计算机/处理器: 处理器为486DX/66MHz或以上PC机推荐Pentium或更高级的处理器。

    l 内存:Windows 95或以后的版本要求16 MB RAM (推荐32 MB)Windows NT 4.0要求24 MB (推荐32 MB)

    l 硬盘:客户机:典型安装:59MB 72 MB;安装过程:66 MB

    l 服务器:典型安装:128 MB;最大安装:141 MB

    l 附加硬盘要求:Internet Explorer:典型为43 MB,最大59 MBMSDN:典型57MB,最大59 MB

    l 驱动器:CD ROM

    l 显示:VGA或更高级显示器,推荐Super VGA

    l 操作系统:Microsoft Windows 95或以后版本或者Microsoft Windows NT 4.0NT要求Service Pack 3或更高版本(包括Service Pack 3

    l 外围设备/其它: Microsoft Internet Explorer 4.01 Service Pack 1 (包含).

     

     

    22 从网络安装VSS客户端

    1 打开本地计算机的“网上邻居”属性对话框;

    2 点击“配置”按纽;

    3 将“MICROSOFT网络用户”的属性设置为:登录到WINDOWS NT 域,域名为PLANNING

    4 添加TCP/IPNETBEUIIPX/SPX协议;

    5 重新启动计算机,登录“planning”域;

    注:管理员为每位NT用户设置的登录密码为“111”,用户在第一次登录时,计算机会提示用户修改密码。

    6 从“网上邻居”的“planning”域中查找服务器“VSSDATA”;

    7 打开共享的“VSS”文件夹并双击“NETSETUP”;

    8 按照安装程序的提示开始安装。

     

     

    3 VSS的基本使用操作

     

     

    31 登录VSS

    点击VSS图标或从程序菜单中运行Visual SourceSafe 6.0,即可打开VSS浏览器。

    如果用户登录的VSS密码和登录PLANNING域的密码是一致的,系统将不再提示输入进入VSS数据库的密码;如果用户为VSS设置的密码与登录PLANNING域的密码不同,系统将提示用户输入VSS的登录密码。关于如何修改VSS用户密码,详见“3.2.14修改用户密码”。

     

     

    32 VSS浏览器

     

     

    当你一打开VSS,如果你设定了密码的话,它会提示你输入密码。如果你没有设定密码,你可以直接看到浏览器。在浏览器上,你可以浏览你的数据库、查看项目列表、显示文件统计信息、执行命令对文件和项目进行操作等。浏览器的最上方的标题栏是你当前连接的数据库。VSS使用符号来提供有关文件和项目信息。

    菜单栏的下面是常用工具栏,这里有许多常用命令的按纽,它可以帮你快速地执行对文件的操作。

    在项目栏中,显示有项目列表,包括特殊项目的有关信息。文件栏显示了当前项目的所有文件的列表。结果栏显示当前你所执行的操作的结果。

     

     

    33 VSS基本操作

     

     

    331创建新的文件夹

    1 选中要创建新文件夹的项目(上级文件夹);

    2 file菜单中选中creat project

    3 写入要添加的文件夹的名称,同时也可以在comment栏中为新建的文件夹添加备注;

    4 点击OK

     

     

    332添加文件夹

    1 选中你要添加文件夹的项目(上级文件夹);

    2 file菜单中选中add files

    3)在文件夹列表中选中要添加的文件夹;

    4)点击add,同时可以在comment栏为你添加的文件夹做一个简单备注;

    5)如果你要连同子文件夹一起添加,选择Recursive

    5 点击OK,成功添加了一个带有备注的文件夹。或者点击close,退出操作,返回add files对话框,点击close

     

     

    333添加文件

    3321使用add命令添加文件

    1)选中你要添加文件的文件夹;

    2 fil 查看(571) 评论(0) 收藏 分享 管理

  • WinRunner和QTP的对比(转)

    2008-03-28 18:27:52

     

    2007-04-15 15:27:55 / 个人分类:理解性的东西

    很多初入行的朋友使用测试工具进行功能测试的时候,总是会遇到QTPWinRunner的选择问题,为什么同样一家公司会出两个功能类似的工具哪? 下面是一篇关于这两个工具的对比介绍,其实从我自己的经验来看,WinRunner虽然推出较早,但是因为一些功能的缺陷,导致后期很难推广,而Quick Test Professinal(QTP)虽然没有师兄WinRunner出道早,然后内功深厚,所以很受欢迎,而且Mercury公司以后的主要发展策略是QTP,虽然文章中说并没有计划Phase out WR,但是已经不再出新版本了. 针对这两个工具的3年左右的使用经验,我的感受是WR比QTP的逊色的地方主要是几点:

    1. WR的对象管理不如QTP那么有效

    2. WR的语言主要是基于类C的TSL,是Mercury发明的语言,明显不如基于VBscrīpt的QTP强

    3. WR的稳定性不行,而且无意人为的干扰可能导致回放的失败

    4. WR对Java的支持也不如QTP那么强

  • QTP 经常要用到的程序和函数:

    2008-03-28 18:25:55

     

    2008-03-23 10:41:37 / 个人分类:QuickTestProfessional

    1. 创建一个vbs文件:TestVbs.vbs
    内容如下:
    '##################################################################################
    '##################################################################################
    Sub CloseWeb()

    '         此处可以用到描述性编程,把先期打开的IE窗口全关闭
    Dim WinIe,Ie,i,m
    Set WinIe=descrīption.Create()
    WinIe("regexpwndtitle").value=" Microsoft Internet Explorer"  '所有页面的regexpwndtitle属性值都是" Microsoft Internet Explorer",也可以用
    其他属性
    Set Ie=desktop.ChildObjects(WinIe)
    m=Ie.count
    For i=1 to m
            Ie(i-1).close                 ' 0为最后打开的一个,可关闭打开的几个,,循环改成for i=1 to m
    Next
    End Sub
    '##################################################################################



    function TestVbs(format)
            msgbox "参数是" & format
    end function


    '#################################################################
    '#################################################################
    '往文件里面写内容
    '第一个参数 文件的路径
    '第二个参数:写入的内容
    '第三个参数:写入的格式("Appending/Writing")
    ' See also "FileSystemObject"
    Sub Write2File(FilePath,content,style)
       Dim fso,f
       Dim stl
            If Ucase(style)="APPENDING" Then
                    stl=8
            else
                    if Ucase(style)="WRITING" then
                                    stl=2
                    else
                                            reporter.ReportEvent 1,"参数错误","Writing <" & FilePath &">:<"& content &">With<" & style & ">"
                                    Exit Sub
                    end if
            End If  
       Set fso=CreateObject("scrīpting.FileSystemObject")
       Set f=fso.OpenTextFile(FilePath,stl,true)
       'content="写入的第一行内容"
       f.WriteLine(content)
       f.Close
       Set f=nothing
       Set fso=nothing

    End Sub
    '#################################################################




    '#################################################################
    '#################################################################
    ' 连接
    数据库子程序
    ' 第一个参数:根据数据库的类型,设计连接字符串(参见udl文件)
    ' 第二个参数:连接数据库之后,进行查询的相应语句
    ' 第三个参数:查询记录返回到res
    Sub OpenDB(conn,sql,res)
       Set cnn=CreateObject("adodb.connection")
       cnn.open conn
       Set res=CreateObject("adodb.recordset")
       res.open
    sql,cnn,1,1
       
    End Sub
    '#################################################################




    '#################################################################
    '#################################################################
    ' 关闭数据库的连接
    sub CloseDB
       Set res=nothing
            Set cnn=nothing
    end sub
    '#################################################################

    2. QTP导入这个TestVbs.vbs 文件:
    菜单:Test-->Setting-->Resource
    在“Associated Library Files” 添加入该文件
    这里建议可以使用 相对路径,如..\TestVbs.vbs

    3.
    测试封装的子程序:
    用“Run from steps”运行模式(专家视图 右键,第四个菜单项,脚本从光标处运行)
    在QTP 中添加测试代码:

    CloseWeb()    '实现关闭当前所有的IE窗口
    stop


    ' 调用外部函数 Write2File
    Write2File "c:\File.txt","Writhing a Line","Writing"
    Write2File "c:\File.txt","Appending a Line","Appending"
    Write2File "c:\File.txt","Appending a Line","Appending!"   ' 参数不正确
    Write2File ".\vbs\File.txt","Appending a Line","Appending"
    stop


    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' 设置连接数据库所需要的初始值,包括:
    ' conn :数据库连接字符串
    ' sql:查询的SQL语句
    ' res:查询的返回记录

    Dim conn,sql,res
    conn="Provider=MSDASQL.1;Persist Security Info=False;Data Source=QT_Flight32"
    sql="select * from Orders"
    Set res=nothing

    ' 调用外部子程序 OpenDB 进行连接数据库
            OpenDB conn,sql,res
                    'msgbox res.RecordCount&"行," & res.fields.count & "列"
                    res.MoveFirst
               ' res.MoveNext    没有它的话,记录就成了死循环
              
                    'reporter.ReportEvent 2,"测试连接数据库","数据库获取数据:" & res.fields(0)

            RowCount=res.RecordCount
            ColumnCount=res.fields.count
            While not res.eof
                    Record=""
                    For i=0 to ColumnCount-1
                            Record=Record & ":" &res.fields(i)
                    Next
                            Record=mid(Record,2)
                            reporter.ReportEvent 2,"数据库记录:",Record
                    res.MoveNext
            Wend
      
    ' 调用外部子程序 CloseDB关闭数据库
            CloseDB
  • QTP与winrunner的比较

    2008-03-28 18:20:24

     

    2007-06-09 20:46:13 / 个人分类:技术

    QTP,全称为Quick Test Professional,它与WinRunner同为MI公司开发的功能强大的功能测试工具。从时间上来看,WinRunner在1995年便已经推出,远早于QTP,而QTP直到2002年才正式推出。从MI公司提供的一些官方资料来看,虽然他们宣称暂时不准备淘汰WinRunner,但他们的宣传资料上又明确表示,QTP已经具备了WinRunner中几乎所有的特性,同时具备了一些独有的特性,并且总体来说,使用更简单、更易扩展和维护,推荐新用户使用QTP,并建议已使用WinRunner的老客户逐渐实现转换。由此看来,MI公司实际上已经有使用QTP逐步取代WinRunner的计划。更重要的是,QTP对J2EE,.NET架构的应用程序支持得比WinRunner要好(从我实际的试用过程中,也感到确实是如此),因此我认为,从我们公司的实际情况出发,针对产品综合部今后将逐步开展自动化测试的计划,QTP应该是一个比较好的选择。
    不论是WinnRunner还是QTP,它们都是功能十分强大的测试工具,加上目前国内关于测试工具的培训和文档资料,实在是少之又少,因此要完全了解和掌握它们,绝不是一朝一夕的事情。在这里我只能就目前对它们的理解程度粗略地介绍一下二者的两点主要不同之处。
    1、使用的脚本语言不同。WinRunner使用的是TSL语言,这是MI公司独有的语言,有特殊性,因此在学习上会有一定难度,不过好在它与C 语言比较类似,如果测试人员有一定的C语言编程基础,会相对容易一些。而QTP使用的则是微软的VBscrīpt语言,比较通用,而且也相对简单易学。从语言上的比较上来看,我个人觉得在编程能力上,WinRunner更胜一筹,因为它拥有相当丰富的C语言函数库,而相对而言,QTP则更大众化,它面向的是没有太多技术背景和编程经验的测试人员。
    2、QTP8.0具有的一大特性:关键字驱动测试(keyword-driven testing)。它的具体操作方法我将有另外的文档详细说明,这里只是简单介绍一下。通过“关键字驱动测试”,测试人员不需要“录制”测试脚本,而可以改成“设计”测试脚本。即:先将应用程序的GUI对象添加到QTP的对象仓库(Object Repository)中,然后针对每一个需要操作到的对象设计每个测试步骤。我个人感觉,这的确是一个很酷的特性,它使我们可以不必实际去操作应用程序,就可以编写出测试脚本,这样做既节省了时间,而且还有一个更大的好处就是可以在应用程序还没有设计完成,或者由于出错无法正常执行的时候仍然可以编写我们的测试脚本。应用程序只需要有使用界面(UI),而不必实际运行,测试人员就可以开始建立测试脚本,为我们实施自动化测试赢得更充足的时间。而在 WinRunner中,虽然也可以采用先学习对象,然后编写代码的方式来完成测试脚本,但这样做要求测试人员对TSL语言比较熟悉才做得到,远不如QTP 来得简单。在实际的操作中我还发现,有些时候采用录制的方法无法捕获对应用程序的操作,此时改用关键字驱动测试却可以收到不错的效果。
    3、相对WinRunner,QTP还具有很多优点,例如“数据表整合”,“Active Screen”,“point and click”,更容易参数化等等,但对于这几点我还没有深入的做过比较,如果今后我对此有了更多的体会和了解,我将再作整理。

  • 为客户化对象创建GUI 检查

    2008-03-28 18:11:51

     


    默认情况下,Winrunner将不属于任何WR标准GUI对象类识别为generic object class.此时,可以通过为它们创建客户化检查点类提高检查这些对象的能力。可以为新的客户化类开发属性检查和GUI 检查点对话框。创建客户化对象检查时,可以使用标准的WR GUI 检查点对话框。按照实际需要,往标准对话框中添加客户化属性检查。对于WR的非标准对象而言,使用标准的GUI检查点对话框,仅能显示generic "object" class的标准检查,也可以显示用户自己添加的客户化检查。但是,除了使用标准的Gui 检查点对话框外,也可以创建用户自己的UI Check界面。而且对于客户化检查,可以执行用户自己的结果显示配置。
    要添加新的GUI对象类并开发客户化用户界面和客户化结果显示配置,步骤如下:
            1)定义新的客户化GUI对象类,并开发带有客户化用户界面的GUI检查点对话框;
            2)创建捕获功能,以便确立检查的预期结果和实际结果;
            3)创建比较功能,以便比较预期结果和实际结果;
            4)注册由捕获功能和比较功能定义的检查属性;
            5)为新类设置默认检查;
  • 使用TestDirector8的测试步骤

    2007-11-20 21:37:55

    1、检查应用程序,以确定测试范围包括测试目标,测试策略。

    2、构建Requirements Tree以定义全部的测试需求。

    3、为需求树中的每个需求创建详细的测试需求列表。描述每一个需求,为之分配优先级,必要时添加附件。

    4、生成报告和图表以助于分析测试需求。复审需求以确保该需求适宜测试范围。

    5、检查应用程序、系统环境和测试资源以确定测试目标。

    6、将应用程序划分为模块或功能以备测试。构建Test Plan Tree,将应用程序层次性的划分为测试单元或主题。

    7、为每个模块确定你所需要的测试类型。向Test Plan Tree中的每个测试添加基本定义。

    8、每一个测试连接到相应的一个或多个需求。

    9、在TestPlan Tree中,通过为测试添加测试步骤开发手度。测试步骤描述了每一个测试的测试操作、需要检查的点和预期结果。然后确定哪些测试需要被自动化。

    10、通过使用Mercury Interactive的测试工具或者定制的测试工具、第三方测试工具为你所决定的需要自动化的测试创建测试脚本。

    11、生成报告和图表以助于分析测试计划数据。复审测试以确定该测试适宜测试目标的程度。

    12、定义多个测试集以用于在项目中达到各种各样的测试目标。确定在每个测试集中包括哪些测试 。

    13、确定测试执行的时间并给测试人员分配任务。

    14、在相应的测集中自动或手式执行测试。

    15、查看测试运行的结构以确定是否在应用程序中发现了缺陷。生成报告和图表以且于分析测试运行结果。

    16、报告在应用程序中检测到的缺陷。项目相关人员可以在测试过程中的何意阶段添加缺陷。


    17、复审新缺陷并且确定哪些缺陷应当被修复。


    18、改正那些需要修复的缺陷。

    19、测试新创建的应用程序。继续以上过程直到被修复。


    20、生成报告和图表以助于分析缺陷修复的过程,还可以帮助确定何时发布相应的程序。

  • QTP处理定时运行程序的办法

    2007-11-20 21:32:25

    在不用TD或者QC的情况,很难精确控制QTP脚本运行的时间,我的办法是增加等待时间。

    Function DiffADate(theDate)
       DiffADate = DateDiff("s", Now, theDate)
       wait(DiffADate)
    End Function
    Call DiffADate("2006-12-18 17:25:00")

  • 性能测试的方法论

    2007-11-20 21:30:08

    -SEI 负载测试计划过程

    SEI 负载测试计划过程(SEI Load Testing Planning Process)是一个关注于负载测试计划的方法,其目标是产生“清晰、易理解、可验证的负载测试计划”。SEI 负载测试计划过程包括6 个关注的区域(Area):目标、用户、用例、生产环境、测试环境和测试场景。

    SEI 负载测试计划过程将以上述6 个区域作为负载测试计划需要重点关注和考虑的内容,其重点关注以下几个方面的内容:

    1.生产环境与测试环境的不同:由于负载测试环境与实际的生产环境存在一定的差异,因此,在测试环境上对应用系统进行的负载测试结果很可能不能准确反映该应用系统在生产环境上的实际性能表现,为了规避这个风险,必须仔细设计测试环境。

    2.用户分析:用户是对被测应用系统性能表现最关注和受影响最大的对象,因此,必须通过对用户行为进行分析,依据用户行为模型建立用例和场景。

    3.用例:用例是用户使用某种顺序和操作方式对业务过程进行实现的过程,对负载测试来说,用例的作用主要在于分析和分解出关键的业务,判断每个业务发生的频度、业务出现性能问题的风险等。

    SEI 负载测试计划过程的描述中可以看到,SEI 负载测试计划过程给出了负载测试需要关注的重点区域,但严格来说,其并不能被称为具体的方法论,因为其仅仅给出了对测试计划过程的一些关注内容,而没有能够形成实际的可操作的过程。同功能测试一样,性能测试也必须经历测试需求、测试设计、测试执行、测试分析等阶段,但由于性能测试自身的特殊性(例如,需要引入工具,分析阶段相对重要),性能测试过程又不能完全套用功能测试过程。

    SEI 负载测试计划过程在负载测试需要关注的具体内容上提供了参考,但其并不是一个完整的测试过程。

    -RBI 方法

    RBIRapid Bottleneck Identify)方法是一种用于快速识别系统

    性能瓶颈的方法。该方法基于以下一些事实:

    1. 发现的80%系统的性能瓶颈都由吞吐量制约;

    2. 并发用户数和吞吐量瓶颈之间存在一定的关联;

    3. 采用吞吐量测试可以更快速定位问题。

    RBI 方法首先访问服务器上的“小页面”和“简单应用”,从应用服务器、网络等基础的层次上了解系统吞吐量表现;其次选择不同的场景,设定不同的并发用户数,使其吞吐量保持基本一致的增长趋势,通过不断增加并发用户数和吞吐量,观察系统的性能表现。

    在确定具体的性能瓶颈时,RBI 将性能瓶颈的定位按照一种“自上而下”的分析方式进行分析,首先确定是由并发还是由吞吐量引发的性能表现限制,然后从网络、数据库、应用服务器和代码本身4 个环节确定系统性能具体的瓶颈。

    RBI 方法在性能瓶颈的定位过程中能发挥良好的作用,其对性能分析和瓶颈定位的方法值得借鉴,但其也不是完整的性能测试过程。
  • 谈谈LoadRunner中Pacing的设置

    2007-11-20 21:28:27

     在 LoadRunner 的运行场景中,有一个不大起眼的设置,可能经常会被很多人忽略,它就是 Pacing 。具体设置方式为: Run-Time settings à General à Pacing ,这个设置的功能从字面上就很容易理解,即在场景的两次迭代 (iteration) 之间,加入一个时间间隔(步进)。设置方法也很简单,这里就不赘述了,我在这里想说明的是,这个设置到底有什么作用?为什么要进行这个设置?说实话,虽然我在以前做过的一些性能测试中,偶尔会对这个步进值进行一些设置,但其实对它的真正含义和作用,我还并不十分清楚。
      前段时间,我在对X银行招聘信息系统进行性能测试的时候,发现这个值的设置对于测试的结果有着很大的影响,很遗憾当时没有深入研究这个问题,而只是简单地认为它同脚本中的 thinktime 一样只是为了更真实地模拟实际情况而已。最近在网络上看到一篇题为《调整压力测试工具》的文章,读完之后,再用之前我的测试经历加以印证,真有种豁然开朗的感觉。以下就将我的一些体会与大家分享:
      通常我们在谈到一个软件的“性能”的时候,首先想到的就是“响应时间”和“并发用户数”这两个概念。我们看到的性能需求经常都是这样定义的:
    “要求系统支持 100 个并发用户”
      看到这样的性能需求,我们往往会不假思索地就在测试场景中设置 100 个用户,让它们同时执行某一个测试脚本,然后观察其操作的响应时间,我们都是这样做的,不是吗?我在实际实施性能测试的过程中,也往往都是这样做的。可惜的是,我们中的大多数人很少去更深入地思考一下其中的奥妙,包括我自己。
      事实上,评价一个软件系统的性能,可以从两个不同的视角去看待:客户端视角和服务器视角(也有人把它叫做用户视角和系统视角),与此相对应的,又可以引出两个让初学者很容易混淆的两个概念:“并发用户数”和“每秒请求数”。“并发用户数”是从客户端视角去定义的,而“每秒请求数”则是从服务器视角去定义的。
      因此,上面所描述的做法的局限性就是,它反映的仅仅是客户端的视角。
      对于这个世界上的很多事情,变换不同的角度去看它,往往可以有助于我们得到更正确的结论。现在,我们就转换一下角度,以服务器的视角来看看性能需求应该怎么样定义: “要求系统的事务处理能力达到 100 个 / 秒” ( 这里为了理解的方便,假定在测试脚本中的一个事务仅仅包含一次请求 )
      面对以这样方式提出的性能需求,在 LoadRunner 中,我们又该如何去设置它的并发用户数呢?千万不要想当然地以为设置了 100 个并发用户数,它就会每秒向服务器提交 100 个请求,这是两个不同的概念,因为 LoadRunner 模拟客户端向服务器发出请求,必须等待服务器对这个请求做出响应,并且客户端收到这个响应之后,才会重新发出新的请求,而服务器对请求的处理是需要一个时间的。我们换个说法,对于每个虚拟用户来说,它对服务器发出请求的频率将依赖于服务器对这个请求的处理时间。而服务器对请求的处理时间是不可控的,如果我们想要在测试过程中维持一个稳定的每秒请求数( RPS ),只有一个方法,那就是通过增加并发用户数的数量来达到这个目的。这个方法看起来似乎没有什么问题,如果我们在测试场景中只执行一次迭代的话。然而有经验的朋友都会知道,实际情况并不是这样,我们通常会对场景设置一个持续运行时间(即多次迭代),通过多个事务 (transaction) 的取样平均值来保证测试结果的准确性。测试场景以迭代的方式进行,如果不设置步进值的话,那么对于每个虚拟用户来说,每一个发到服务器的请求得到响应之后,会马上发送下一次请求。同时,我们知道, LoadRunner 是以客户端的角度来定义“响应时间”的 ,当客户端请求发出去后, LoadRunner 就开始计算响应时间,一直到它收到服务器端的响应。这个时候问题就产生了:如果此时的服务器端的排队队列已满,服务器资源正处于忙碌的状态,那么该请求会驻留在服务器的线程中,换句话说,这个新产生的请求并不会对服务器端产生真正的负载,但很遗憾的是,该请求的计时器已经启动了,因此我们很容易就可以预见到,这个请求的响应时间会变得很长,甚至可能长到使得该请求由于超时而失败。等到测试结束后,我们查看一下结果,就会发现这样一个很不幸的现象:事务平均响应时间很长,最小响应时间与最大响应时间的差距很大,而这个时候的平均响应时间,其实也就失去了它应有的意义。也就是说,由于客户端发送的请求太快而导致影响了实际的测量结果。
      因此,为了解决这个问题,我们可以在每两个请求之间插入一个间隔时间,这将会降低单个用户启动请求的速度。间歇会减少请求在线程中驻留的时间,从而提供更符合现实的响应时间。这就是我在文章开头所提到的 Pacing 这个值的作用。
      最后再补充一句话:虽然性能测试通常都是从客户端活动的角度定义的,但是它们应该以服务器为中心的视角来看待。请注意这句话,理解它很重要,只有真正理解了这句话,你才会明白为什么我们一直强调做性能测试的时候要保证一个独立、干净的测试环境,以及一个稳定的网络,因为我们希望评价的是软件系统真正的性能,所以必须排除其它一切因素对系统性能造成的影响。
      花了几天的时间才完成这篇文章,如果它能够帮助大家对性能测试多一些理解或者多一些思考,那就是我的荣幸了。
  • 如何在loadrunner中进行关联

    2007-11-20 21:25:52

    最近有很多朋友在软件测试的QQ群中问我关联如何做,我就在这里简单的说一下. ?盅;'醌? 
    loadrunner中关联可以分为自动关联与手动关联,关联函数为web_reg_save_param: ?譡 T砿?  
      1.自动关联,在tools-recording options的correlation中,选中enable correlation during recording的复选框,在下面list中选择你需要自动关联的协议。这样在录制脚本时,在可关联处会弹出一个dialog进行选择是否对该处进行关联,这样,在你脚本录制好之后,关联已经自动生成了,十分方便。
      另一种自动关联的方法是,你在tools-recording options的correlation中,不选中enable correlation during recording的复选框的情况下进行自动关联,你可以先录制一个脚本,然后选择vuser-scan action for correlation或者直接ctrl+f8来运行一下脚本,这样也能自动找到不同的地方而进行自动关联,此时你只需要钩选你需要关联的地方后点击关联即可。 ?lt;?3>團V  
      2.手工关联,需要录制2个相同业务流程的虚拟用户脚本,然后通过tools-compare with vusers来打开wdiff.exe对2个脚本进行比较,找到需要关联的部分,然后指定左右边界,然后将脚本中原来的值替换成参数即可.
     
  • QTP脚本扩展之QTP连接MS sql server数据库

    2007-10-22 10:28:56

    不想吃天鹅肉的癞蛤蟆不是好癞蛤蟆!~

     

    2006-12-07 14:01:58 / 个人分类:原创

      在QTP中,我们可以通过复制数据库数据到databable中,实现数据的参数化.但这样的做法往往比较烦琐.换一种思路,在Expert View中直接添加连接数据库代码如何?接下来,我们就来完成这个工作.

      对于MS sql server数据库的连接,我们首先要知道所用的MS sql server数据库的连接字符串.这里告诉大家一个轻松获取连接字符串的方法: 新建.txt文件,修改文件名(包括后缀)为XX.udl,双击打开XX.udl文件,在"Provider"选项中选择"Microsoft OLE DB Provider for SQL Server",在"Connection"中,选择相应的server name和database,有用户名和密码的输入用户名和密码,点击右下方的"Test Connection"验证数据库是否连通.点击"OK".把XX.udl文件用记事本方式打开,以"Provider"开始的部分就是你的数据库连接字符串.

      知道了连接字符串,接下来我们来完善代码部分.

      Dim Cnn //定义变量

      Dim Rst //定义变量

      Dim strCnn //定义变量

      strCnn="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=test;Data Source=SIMONVM" //将获得的连接字符串赋值到

      strCnn Set Cnn=CreateObject("ADODB.Connection") //生成数据库连接对象

      Cnn.Open strCnn //打开数据库 Set Rst=CreateObject("ADODB.Recordset") //生成记录集对象 

      Rst.Open "select OrgName from Organization",Cnn //书写SQL语句

      Rst.MoveFirst //将焦点定在第一行

      还可以通过Rst.Field( )函数取出对应行的值(参看QTP Tutorial Help).

      对于以上代码,我只是完成了MS sql server数据库的连接和执行命令部分.后续对表格的应用还未涉及.希望大家指点和补充.

  • QTP中Wait与同步点的区别

    2007-10-22 10:26:40

    QTP中Wait与同步点的区别

    2006-12-06 17:19:27 / 个人分类:QTP

        先说wait函数,当脚本走到wait函数时,就开始执行这个函数.如:wait(10),就等待10秒种后再继续执行下面的语句.wait函数的这个等待的时间,那相对来说是比较固定的.如上例子,一定要等待完10秒后再执行.所以写脚本的时候要自己估算一下时间.不然可能造成时间的浪费,或者等待时间的不足.
    VaE&{K$? hxd w8Q146439
    H ~ \'j-Xz146439那同步点呢.等待时间就比较灵活了,它的等待时间是不固定的.设置同步点后,当脚本执行到这句话后,脚本就开始执行等待.脚本会在规定时间内不断的去检查,所同步的对象有没有出现,一但出现,脚本就继续往下执行.不需要等完所有规定时间.如果在规定的时间内,所要同步对象还没有出现,那就提示超时的错误信息.51Testing软件测试网7v4mA }d|7QC[;e:G
    例如:
    `ld PZ d a146439Window("Flight Reservation").ActiveX("Threed Panel Control").WaitProperty "text", "Insert Done...", 10000
    cNb1\Q*D4A146439当脚本执行到这句话时,就开始执行同步等待时间.这里设置超时时间为10000.在这个时间内,脚本会不断去查看该对象的text属性的属性值Insert Done...,有没有出现.一但同步到这个属性值,就开始执行下面的脚本了.而不需要再继续等待,直到1000秒结束为止.那这样的话,这个等待时间不用自己去控制,设置好后由程序自己去判断,就比较灵活,也不会出现浪费时间的情况.能提高脚本的执行

  • QTP中的测试对象和运行时对象

    2007-10-22 10:23:59

     

    2006-12-15 17:32:11 / 个人分类:QTP

         相信大家在QTP中肯定都看到过这些方法,GetROPropertyGetTOPropertySetTOProperty .

    GetROProperty:可以取到运行时对象属性的值.

    GetTOProperty:可以取到测试对象属性的值.

    SetTOProperty:可以修改测试对象的属性值

        那这里的运行时对象和测试对象又是什么呢?他们之间又存在着什么样的关系呢?

    测试对象(TO):是QTP在脚本中创建的用于描述应用程序实际对象的对象.QTP存储这些信息用来在运行时识别和检查对象.简单的说,我们就可以把对象库中所保存的对象就看做为测试对象.

    运行时对象(RO):是应用程序中的实际对象,对象的方法将在运行时被执行.

    两者之间的关系:测试对象是为了识别运行时对象而存在的.在《QTP的录制回放过程》中,我也阐述了QTP的整个工作原理。所以这里我也就简单的再提一下。QTP在录制的时候会把所操作的对象的一组属性及属性值,保存到对象库中,就是所谓的测试对象。在回放的时候,QTP 就会根据对象库里的该对象的属性及属性值去匹配实际在应用程序中的运行时对象。一但完全匹配正确就执行相应的操作。否则就会报“找不到该对象”的错。

  • 集成test

    2007-10-22 10:19:56

    在当前SOA环境下,代码开发和架构形态的出现,这些是否是构成集成(integration)的原因?什么时候应该着手去做呢?在开发过程的早期还是晚期呢?

      Rami Jaamour

      Web服务和SOA给IT界带来了一个十分重要,而又保守的趋势:复杂性。它是从应用代码慢慢衍生变为架构的。服务被重用,事务在信息层整合,运行时策略操作信息中的元数据,有时按相应的路线发送这些数据。这些是我们从中看到各个单独的应用所表现出来的复杂性的所有的因素。这个趋势加强了“架构第一“的开发典范,即先创建系统,再进行应用代码编制。

      集成已经是问题的主要来源,并将一直持续到开发周期的末尾。因此,以一和生产环境尽可能一样的开发环境来开始是很重要的,以一规则的(一般是每晚)基础建立和部署模型,集成到开发系统中去。当这完成时,就有可能对系统建立和维护回归测试用例,那么测试就可以随着系统的进展而被创建,发展和维护。这样的测试是可以和真实用例尽可能的一样的,因为他们是运行在一个和最终产品很相近的预先部署环境上的,它使得这些测试在确定没有产生bug和在整个生命周期中保证功能的正确性方面更为强大。

      完成这个过程的一个主要挑战是在一个类似于产品上下文的环境上下文中从开发中分离出一个应用。这里需要清除和仿真,这些需要做些初始化工作。但是这样的初始化工作是会在这整个周期中获得回报的,因为你最终获得了一个可以做改动并且模型被立即测试和验证的灵活的,连续的过程。这个系统事实上变得易于测试,这是部署之前的很重要的一个特点。只有这个方法使得过程可预测和控制,以便你可以继续进行这个项目,同时知道最后不会有什么大的意料之外的事情发生。

      总之,集成测试应该及早的进行,和其他测试(例如单元测试)并行,如果采用了这种方法后应用是不可测的,那么就是出错了。应该在一开始就做一个投入使得它是可测的。如果系统不是可集成测试的,那么开发团队会发现他们浪费大量的时间在手动建模和部署活动上。如果发生了这种情况,那么在项目结尾的时候情况将变得更加糟糕。


  • (一)QTP关键技术

    2007-10-18 12:18:02

     

    字体:        | 上一篇 下一篇 | 打印  | 我要投稿

    一 对象识别及存储技术基本常识

    1)测试对象模型(Test Object Model)
            测试对象模型是QTP用来描述应用程序中对象的一组对象类。每个测试对象类拥有一系列用于唯一确定对象属性和一组QTP能够录制的方法
     
    2)测试对象(Test Object)
            用于描述应用程序实际对象的对象,QTP存储这些信息用来在运行时识别和检查对象
     
    3)运行时对象(Run-Time Object)
            是应用程序中的实际对象,对象的方法将在运行中被执行
     
    4)QTP的录制过程
            A.确定用于描述当前操作对象的测试对象类,并创建测试对象
            B.读取当前操作对象属性的当前值,并存储一组属性和属性值到测试对象中
            C.为测试对象创建一个独特的有别于其他对象的名称,通常使用一个突出属性的值
            D.记录在对象上执行的操作
     
    5)QTP的回放过程
            A.根据对象的名称到对象存储库(Object Repository)中查找相应的对象
            B.读取对象的描述,即对象的属性和属性值
            C.基于对象的描述,QTP在应用程序中查找相应的对象
            D.执行相关的操作
     
    二 对Check Point的较为深入理解

    1. 定义:
            将特定属性的当前数据与期望数据进行比较的检查点,用于判定被测试程序功能是否正确
            Check Point可以分两类:QTP内置验证点和自定义验证点
     
    2. QTP内置验证点实现原理及优缺点
            A.录制时,根据用户设置的验证内容,记录数据作为基线数据
            B.回放时,QTP捕获对象运行时的数据,与脚本中的基线数据进行比较
            C.如果基线数据和运行数据相同,结果为PASS,反之为Failed.
            D.优点是 操作简单方便
            E.缺点是 QTP默认的检查的属性有时不符合自己的要求,如希望得到检查的属性没有在里面, 而默认的属性不需要检查等。
     
    3. QTP内置验证点结果的应用
            A.录制的验证点在没有进行调整前,仅仅是给出了检查结果是通过还是错误的
            B.实际的测试过程中,可以根据验证点的结果进行不同的操作
           If Window("Flight Reservation").WinEdit("Name:").Check(CheckPoint("Name:")) = True then
                  msgbox "oh, success!"
    Else
                  msgbox "oh, failure!"
    End If
     
    4. 自定义验证点的应用及优缺点
            A.使用条件语句对实际值和期望值进行对比,然后用Reporter对象报告结果
           '检查Ticket Number
    If CStr(dbTicketNumber) = CStr(DataTable("oTicketNumber", dtLocalSheet)) Then
           Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
    Else
           Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
    End If
            B.优点是 非常灵活,前者实现的所有检查都可以用此方法来实现;
            C.缺点是 代码量大,对测试人员的要求高。
     
    5. 对Check Point的深入理解

            A.个人认为在比较简单的和有Active Screen的情况下可以使用QTP内置的Check Point,在比较复杂的情况下可以通过编程和使用Reporter来完成.
            B.在使用check方法时,必须先在Keyword View或者Active Screen中新建CheckPoint。否则无法对该对象进行check,系统报错说无法在对象仓库中找到此对象。如果插入检查点,系统会自动把相关的对象添加到对象库中。
            我认为检查点并不是一个实实在在的对象。因为你可以对同一个对象设置不同的检查点,可以把它的某个属性既设定成True,也可以设定为False。而对象库中的对象的属性值是必须依赖于对象的实际属性值的。如果随意更改有可能无法识别。还有就是可以针对同一个对象设定多个检查点。在测试窗口中可以看到这两个检查点的名称是区分开来的。所以我认为检查点并不是实际存在的对象,而是一些类似映射的东西。
            尽管检查点并不是对象库中的实在的对象,但是它必须对应到对象库中的某个实实在在的对象,好像它的一个映像一样,而且在实际的操作过程中,QTP还是把它作为一个对象来处理的。
            因为我们无法像其他对象一样把“检查点对象”添加到对象库中,而QTP又认为它是个对象,所以我们无法在专家视图中直接添加检查点脚本。但是我们可以采用编成描述的方式来实现检查点的功能。
            CheckPoint 是一个依赖于Object Repository(对象库)中的某个对象的“虚拟对象”。其具体含义是:如果它所依赖的QTP 对象库中的对象没有了,那么此CheckPoint 也就不存在了;这个“虚拟对象”的属性是从它所依赖的对象的属性中“抽取”出来的,它具有它所依赖的对象的一个或几个属性,但不能增加它所依赖的对象没有的任何属性。
            CheckPoint 是一个“虚拟对象”的重要原因是:每个Object都能在Object Repository找到它的Name、Class Properties,而CheckPoint 在Object Repository中就根本不存在。选择脚本中的某个对象后,在Object Property 的对话框里面有个Respository按钮,点击它后,你会看到此对象在Object Respository 的Name、Class 和 Properties。
            选择一个CheckPoint后,在CheckPoint Properties 的对话框里没有 Respository 按钮,在Object Respository中也找不到此CheckPoint的Name、Class 和 Properties(因为它在对象库中根本就不存在!)。

  • QTP与回归测试

    2007-10-18 12:12:43

     

    字体:        | 上一篇 下一篇 | 打印  | 我要投稿

    最近有不少朋友在论坛里问到"QTP如何做回归测试?"的问题,这里我们有必要来探讨一下.首先这个问题中存在一个误区,事实上回归测试怎么做,跟自动化工具没有必然的联系.所以这里的如何做回归测试并不是一个QTP的问题,而是一个回归测试的策略的问题.

         我们先来了解一下回归测试的概念和策略以及一般大致会采用的流程.

         那么什么是回归测试呢?简单的说,回归测试是贯穿在整个测试的各个阶段的一个测试活动.它的目的是检验已经被发现的缺陷有没有被正确的修改和修改过程中有没有引发新的缺陷.软件在测试或者其他活动中发现的缺陷经过修改后,都要进行回归测试的验证.

        我们在做回归测试的时候可以采用不同的策略.

    策略(1) 可以选择完全重复测试.把所有的测试用例,全部再完全的执行一边,以确认问题修改的正确性和修改后周边是否受到影响.缺点是由于要把用例全部执行,所以会增加项目成本,也会影响项目进度.所以很难来完全执行,所以引出了回归测试策略(2) 选择性重复测试.

    策略(2) 可以选择性重复测试.可以选择一部分进行执行,以确认问题修改的正确性和修改后周边是否受到影响.那么我们怎样去选择用例呢?这里有三个方法:1.覆盖修改法 针对发生错误的模块,选取这个模块的全部用例进行测试.这样只能验证本模块是否还存在缺陷,但不能保证周边与它有联系的模块不会因为这次改动而引发缺陷.所以引出第2个方法,即2.周边影响法.除了把出错模块的用例执行之外,把周边和它有联系的模块的用例也执行一边,保证回归测试的质量.当然我们还可以用量化的角度去分析模块的质量,比如:经过上面的一系列回归测试后,看看遗留的缺陷率是否已经在允许的范围之内了,那么我们以此为标准可以结束本次回归测试.也就是我要提到的第三个方法 3.指标达成法.

       回归测试的流程

    1.在测试策略制定阶段,制定回归测试策略

    2.确定回归测试版本

    3.回归测试版本发布,按照回归测试策略执行回归测试

    4.回归测试通过,关闭缺陷跟踪单

    5.回归测试不通过,缺陷单返回开发人员.等重新修改,再次做回归测试.

        那么我们为什么会把工具和回归测试联系起来呢?原因是在回归测试中我们会去做大量的重复的执行测试用例的操作.为了让测试员能够从这种重复的工作中解放出来,去测试更多新的用例,我们所以可以选用一些自动化测试工具,来录制脚本,代替一部分手工操作.但事实上并不是这些工具只能用在回归测试中,在其他操作上也可以应用.但有一点是工具不能完全代替手工测试,它只是手工测试的一种补助.所以QTP作为一款功能测试工具,可以运用到回归测试中

  • QTP虚拟对象的使用

    2007-10-18 12:10:17

     

    2007-03-24 15:18:13 / 个人分类:QTP

    1:QuickTest 不支持用于模拟或低级录制的虚拟对象
    2:录制和运行测试或组件时,网页或应用程序窗口的大小和位置必须和定义虚拟对象时的大小和位置相同。
    3:仅当录制和运行测试或组件时,才能使用虚拟对象。您不能在虚拟对象上插入任何类型的检查点,也不能使用“对象探测器”来查看其属性
    4:虚拟对象管理器中显示的虚拟对象集合存储在您的计算机中,而不是随包含虚拟对象步骤的测试或组件存储。这意味着如果您在测试或组件步骤中使用虚拟对象,则仅当在包含正确的虚拟对象定义的计算机中运行时,该对象在运行会话过程中才能被识别。要将您的虚拟对象集合定义复制到另一个计算机,请将您的 <QTP安装文件夹>\dat\VoTemplate 文件夹的内容(或该文件夹中的单个 .vot 集合文件)复制到目标计算机上的相同文件夹中。
    5:您只能为可以在其上单击或双击并录制 Click 或 DblClick 步骤的对象定义虚拟对象。否则,将忽略虚拟对象。例如,如果您在 WinList 对象上定义一个虚拟对象,录制 Select 操作,则虚拟对象被忽略。
    6:不要使您的应用程序或网页中的虚拟对象相互重叠。如果虚拟对象与另一个虚拟对象重叠, QuickTest 可能无法正确地在虚拟对象上录制或运行测试或组件。
    7:在“标识对象使用”框中,选择您希望 QuickTest 标识和映射虚拟对象的方式。
    7.1 如果您想要 QuickTest 标识所有出现的虚拟对象,请选择“仅父类”。QuickTest 仅通过其直接父类标识虚拟对象,而不考虑整个父层次。 例如,如果虚拟对象是使用 Browser("A").Page("B").Image("C") 定义的,则即使层次更改为 Browser("X").Page("Y").Image("C"), QuickTest 仍将识别该虚拟对象。
    7.2 如果想要 QuickTest 仅标识一次出现的虚拟对象,请选择“整个父层次”。QuickTest 将仅标识具有准确的父层次的虚拟对象。 例如,如果虚拟对象是使用 Browser("A").Page("B").Image("C") 定义的,则如果层次更改为Browser("X").Page("B").Image("C"), QuickTest 将无法识别该虚拟对象。

  • QTP参数化实例

    2007-10-18 11:58:55

     

    2006-12-04      在自动化测试当中,有时为了模拟真实效果 ,或者为了达到某种操作效果,那么势必要把脚本参数化.那么一般的针对输入值的参数化或者select选择值的参数化,操作也比较容易,这里也不多说了,直接把固定值换成变量就可以.鉴于上个星期有两个朋友都问到了针对某个对象的参数化,那么就来探讨一下针对对象的参数化.

    例:51Testing软件测试网1GI.v3KH$nGF6?(yftn
    Browser("软件测试专业网站:51Testing软件测试网").Page("百度——全球最大中文搜索引擎").WebEdit("wd").Set "111"
    ]t/C:QXn5RK#cONs/i146439Browser("软件测试专业网站:51Testing软件测试网").Page("百度——全球最大中文搜索引擎").WebButton("百度搜索").Click
    }RQ\7i3o146439Browser("软件测试专业网站:51Testing软件测试网").Page("百度搜索_111").Link("菜111 的QQ家园").Click

        在这个例子中,我们的目的是把这个link对象给参数化掉.这里直接把对象名参数化掉,肯定是不行的.因为我们知道QTP识别对象依靠是这个对象在对象库中的属性和属性值.而如果我们这里参数化成一个新的对象名,那么这个对象名是不存在于对象库中的,那么势必会造成在回放过程中不通过,报对象库中没有这个对象的错误.所以我第一个想到的是先让这个link对象脱离对象库,让它不用通过对象库就能识别这个link对象,那么接下来只要直接换成变量就成功了.相信大家都看到过帮助里对描述性编程的说明,通过把脚本改写成描述性编程的形式,可以让QTP在执行脚本时不要再去依赖对象库.直接把一些付有特征的属性和属性值放到脚本中,就能执行相应的操作.所以我们可以先把上面脚本改写成:

    Browser("软件测试专业网站:51Testing软件测试网").Page("百度——全球最大中文搜索引擎").WebEdit("wd").Set "111"51Testing软件测试网;[)S3BLV7F
    Browser("软件测试专业网站:51Testing软件测试网").Page("百度——全球最大中文搜索引擎").WebButton("百度搜索").Click51Testing软件测试网/x$l4?f&f9iz xe v
    Browser("软件测试专业网站:51Testing软件测试网").Page("百度搜索_111").Link("text:=菜111 的QQ家园").Click

        这样表示后,再把这个对象在对象库中的记录给删掉.重新运行脚本后,脚本依旧能正确执行.那么接下来的操作就方便了,直接把相应的固值换成一个变量即可.我们来这么操作:

    Dim i51Testing软件测试网o.eY6BZR,Mr\
    i="菜111 的QQ家园"
    51Testing软件测试网wCWbuj
    Browser("软件测试专业网站:51Testing软件测试网").Page("百度——全球最大中文搜索引擎").WebEdit("wd").Set "111"51Testing软件测试网V%A'F c-_.~ E5}2f
    Browser("软件测试专业网站:51Testing软件测试网").Page("百度——全球最大中文搜索引擎").WebButton("百度搜索").Click
    G_4MA!s/\146439Browser("软件测试专业网站:51Testing软件测试网").Page("百度搜索_111").Link("text:="&i).Click

        到这里整个操作过程就完成了.其实这只是一个方法,相信大家肯定还有其他方法,希望大家能留言说说自己的看法.当然如果这个对象的对象名有一定规律的话,我们还可以考虑运用正则表达式的方法,也可以达到预期的效果.

  • 测试计划--进度表

    2007-10-18 11:54:04


    测试进度应该围绕着包含在项目计划中的里程碑(比如各种文档和模块的交付日期、资源、接口的可用性等)来构造。然后,需要添加测试中的所有里程碑。测试中的这些里程碑的详略程度各不相同,它取决于正在构造的测试计划的等级。在总体测试计划中,里程碑将围绕着主要的事件,比如需求与设计评审、代码交付、用户手册的完成,以及接口的可用性来构造。在单元测试计划中,绝大多数的里程碑是建立在各种软件模块完成的基础之上的。
        在项目的初期,通常是采取构造一个没有规定日期的普通进度表的形式;也就是说,确定各种任务所需要的时间、各种任务的依赖关系,但是并不指定任务具体的开始和结束日期。通常,该进度表是用甘特图来表示的,以便显示各种任务的依赖关系。为制订进度表,我们必须对时间和资源进行非常精确的估计,如果时间进度的安排十分紧张,那么估计工作就显得尤为关键,以便能够为测试确定计划风险和应急措施,以及优先级。以估计值为基础记录的进度表,还为测试经理提供了一个审核线索:估计数据为何获得了或者没有获得通过,并且为在未来进行更好的估计工作奠定了基础。
  • qtp脚本语言

    2007-10-11 12:16:31

    QTP的一些小知识

    2006-12-01  个人分类:QTP

    1.GetCellData函数 

      作用:获取单元格的值

      例:  rowCount = Browser("xxx ").Page("xxx ").Frame("xxx").WebTable("xxx").RowCount
    For counter = 1 To rowCount
      text = Browser("xxx").Page("xxx").Frame("xxx").WebTable("xxx").GetCellData(counter,1)
      If (text = "xxx") Then
        counter = counter - 1
        selectNO = "#" & counter
        Browser("xxx").Page("xxx").Frame("xxx").WebRadioGroup("xxx").Select selectNO
        Exit For
      End If
    Next

    2.把值插入datatable里

      例:   datatable.setcurrentrow(i)
            datatable.value("name","Global")="name"
            datatable.value("passwd","Global")="passwd"

    3.用代码来启动浏览器

      Browser1 = "IE"
      StartURL = "www.51testing.com"
      IF Browser1 = "IE" THEN
         set IE = CreateObject("InternetExplorer.Application")
         IE.Visible = true
         IE.Navigate StartURL
      END IF
     

    4.ExecuteFile函数

      作用:ExecuteFile 可以直接执行vbs文件,而不需要将其导入resource中 
           ExecuteFile FileName 
      说明:where FileName is the absolute or relative path of your VBscrīpt file.

      例:ExecuteFile("F:\test.vbs")

    5.Strcomp函数 

      作用:比较文本

      例:dim strtext1,strtext2,str ,str1,comp1
         strtext1 = "xxx"
         strtext2 = "xxx"
         str = VbWindow("xxx").VbWindow("xxx").VbLabe1("xxx").GetTOProperty("text")
         str1= VbWindow("xxx").VbWindow("xxx").VbLabel("xxx").GetTOProperty("text")
         comp1=strcomp(strtext1,str,0)
         If  comp=0 Then
              msgbox “这两个串相等”
         else
           msgbox str
         End If 

    6.CaptureBitmap 

      作用:捕获屏幕

    7. GetROProperty

      作用:取对象属性值

      例:VbWindow("xxx").VbWindow("xxx").VbWindow("xxx").ActiveX("xxx").GetROProperty("TextMatrix(1,0)") 

    8.ExitAction - 退出当前操作,无论其循环属性如何。
      ExitActionIteration - 退出操作的当前循环。
      ExitRun - 退出测试,无论其循环属性如何。
      ExitGlobalIteration - 退出当前全局循环。


    9.如何使用Excel对象处理数据?
      Dim xl
      打开excel文件
      Function OpenExcelFile(strFilePath)
      Set xl = CreateObject("Excel.Application")
      xl.Workbooks.Open strFilePath
      End Function
      获得指定单元格数据
      Function GetCellData(strSheet,rwIndex,colIndex)
      GetCellData = xl.WorkSheets(strSheet).Cells(rwIndex,colIndex)
      End Function
      填充单元格数据
      Function PutCellData(strSheet,rwIndex,colIndex,varData)
      xl.WorkSheets(strSheet).Cells(rwIndex,colIndex) = varData
      End Function
      保存并推出
      Function SaveAndQuit()
      xl.Activeworkbook.save
      xl.Quit
      Set xl = nothing
      End Function

    10.连接sql数据库

      例:Dim res,cmd,sql
         Set Res=createobject("adodb.recordset")
         Set Cmd=createobject("adodb.command")
         Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  '这句话是连接数据库的数据源,要做修改
        Cmd.CommandType = 1
        sql="selec t * from 表 where name=username"
        Cmd.CommandText = sql
        Set res = Cmd.Execute()
        Set res = nothing
        Set cmd.ActiveConnection = nothing
        Set Cmd= nothing

数据统计

  • 访问量: 15352
  • 日志数: 20
  • 建立时间: 2007-10-11
  • 更新时间: 2008-03-28

RSS订阅

Open Toolbar