发布新日志

  • 在QTP里面用CDONTS组件发送邮件

    2007-08-03 12:24:49

    今天查了一下QTP Code Samples里面用Outlook发送邮件的代码,发现在帮助文档里面提供了两段代码例子。很显然第一段代码是在QTP中用Outlook发送邮件,那第二段代码是什么呢?

    ' Example 2
    Function SendMail(SendFrom, SendTo, Subject, Body)
        Set ōbjMail=CreateObject("CDONTS.Newmail")
        ObjMail.From = SendFrom
        ObjMail.To = SendTo
        ObjMail.Subject = Subject
        ObjMail.Body = Body
        ObjMail.Send
        Set ōbjMail = Nothing
    End Function

    第3行语句中的CDONTS.Newmail比较可疑,好像不属于Outlook组件。会不会是系统内的其他可以发送邮件的组件呢?在QTP中运行这段代码,CreateObject方法报告创建CDONTS.Newmail对象失败。看来CDONTS这不是系统中现成的组件。

    用Google查了一下才明白,原来CDONTS EMail是IIS提供的组件。使用这个组件有两个前提:

    • 系统安装并启动了SMTP服务
    • CDONTS.dll被注册到系统中(系统默认没有注册这个组件,从网上下载该组件并RegSvr32命令注册即可)

    重新检查并保证系统符合上面两个条件,再次在QTP中运行这段代码。这次顺利通过了,邮件被成功的发送到了制定邮箱。

    回想一下刚才的操作以及查阅资料中的解释,其实通过CDONTS组件发送邮件的基本步骤就是:

    • 创建CDONTS.Newmail对象
    • 给Newmial对象的各个属性赋值用于创建一个邮件
    • 用Newmail.Send方法向本地SMTP服务器发送了邮件

    用这种方式发送邮件的好处是可以直接发送邮件,不需要配置发送邮箱。当运行QTP脚本的测试机器为公用的时候可以考虑。而它的缺点是必须在本地机器上安装并运行SMTP服务。

  • 描述编程中的Description对象

    2007-06-29 14:02:18

    在QTP Professional帮助文件中的Index页输入关键字"descrīptive programming",就可以找到主题为"Using Programmatic Descrīptions"的文章。这篇文章介绍了描述编程,并且提及描述编程的两种表现形式。
    There are two types of programmatic descrīptions. You can either list the set of properties and values that describe the object directly in a test statement, or you can add a collection of properties and values to a Descrīption object, and then enter the Descrīption object name in the statement.

    其中的第一种形式是在测试语句中直接列出描述对象的属性和属性值的集合,易于理解和使用。例如,描述某个页面上的CheckBox可以写成如下形式,其中Prop和Value集合是识别该对象的属性和值集合:
    Browser(**).Page(**).WebCheckBox("Prop01:=Value01","Prop02:=Value02",...).Set "ON"

    第二种形式则是把描述对象的属性和属性值的集合加入到Descrīption对象中,然后在测试语句中使用这个Descrīption对象。还是上面的例子,使用了Descrīption对象后语句变成了:
    Dim objDesc
    Set ōbjDesc = Descrīption.Create()
    objDesc("Prop01").Value = "Value01"
    objDesc("Prop02").Value = "Value02"
    ...
    Browser(**).Page(**).WebCheckBox(objDesc).Set "ON"

    其实这两种形式没有什么区别,但是各有特点。前者形式简洁但是可读性差些,后者形式复杂但是可读性好些。当识别对象的属性和值集合内容不多的时候,还是用前者比较方便。

    那什么时候用Descrīption对象比较好呢,就像某个帖子讨论过的,Descrīption对象和ChildObjects方法结合使用比较体现优点。下面的例子取自我们在项目中开发的测试脚本,目的是在一个Table中遍历样式为"actions.gif"且类型为"Image"的所有对象。
    Dim objDesc, objImgs
    Set ōbjDesc = Descrīption.Create()
    objDesc("micclass").Value = "Image"
    objDesc("file name").Value = "actions.gif"
    Set ōbjImgs = Browser("Browser").Page("Enterprise").WebTable("Detail View").ChildObjects(objDesc)
    Dim intCount, i, strHref, strHref
    intCount = objImgs.Count - 1
    For i = 0 To intCount
        strHref = objImgs(i).GetROProperty("href")
    Next

    其中的关键是Descrīption对象的创建
    Set ōbjDesc = Descrīption.Create()

    对象的属性-值集合,其实就是人为设定的QTP用来识别某类对象的属性和值特征。这个例子里面就是
    objDesc("micclass").Value = "Image" '对象类型为Image
    objDesc("file name").Value = "actions.gif" '对象使用的文件名为actions.gif
    这些属性-值都可以用SPY工具得到

    最后加上ChildObjects方法
    Set ōbjImgs = Browser("Browser").Page("Enterprise").WebTable("Detail View").ChildObjects(objDesc)
    将所有符合Descrīption对象描述的特征的那些对象从WebTable("Detail View")里面取出来。objImgs即包含在WebTable中的所有符合Descrīption描述的所有对象集合。
  • 编码规范和Action模版

    2007-06-15 13:19:07

    自动化测试项目的开发过程和普通的项目开发过程没有太大区别。抛开开发过程中产生的以及最终交付的制品,自动化测试项目的开发过程其实也经历了分析、设计、编码调试以及测试等几个阶段。因此在自动化测试项目(特别是多人参与的项目)中,也应该保证开发过程规范。
    编码规范是开发过程规范的重要保证,自动化测试项目也应该建立符合脚本开发语言特点的编码规范。以QTP脚本开发为例,考虑到QTP的编程语言是以VBscrīpt为基础的,编码规范可以在借鉴VBscrīpt编码规范的的基础上建立起来。这里是MSDN的VBscrīpt编码规范。

    下面的注释取自刚刚完成的一个QTP自动化测试项目的编码规范,它指定了每个Action开始位置应该包含的说明信息。
    '***********************************************************************
    'Action name:
    'Descrīption:
    'Input:
    'Output:
    'Associated test case(s):

    'Creation date:
    'Created by:
    'Revise date:
    '***********************************************************************
    当然,这仅仅是完整编码规范的一小部分。

    接下来的问题就是如何把这样的编码规范贯彻到开发组中了。如果脚本开发工程师想在每个Action的开头都手工输入或者拷贝+粘贴这样的注释块,那就太麻烦了。QTP支持Action模版,可以省去这样的操作,大大提高编码的效率。
    把上面的注释保存成名为ActionTemplate.mst,并且用它覆盖<QTP安装目录>\dat文件夹下的同名文件。今后再新创建的Action将直接包含该段注释。

  • 相对路径[1] - 调用Reusable Action

    2007-06-12 11:34:47

    假设在存放QTP测试脚本的根目录下有两个测试脚本,分别是Test1和Test2。
    其中Test1包含一个可重用Action,名为ReusableAction。Test2包含一个Action,名为MainAction。

    ScrīptsRoot\
               \Test1
                     \ReusableAction
               \Test2
                     \MainAction

    如果要从Test2的MainAction中调用Test1的ReusableAction,就意味着要从一个测试脚本中调用另外一个脚本的可重用Action。只要从QTP的Insert菜单中选择Call to Copy of Action...,并且从弹出的Select Action对话框中指定Test1和ReusableAction即可达到目的。如图:

    在QTP帮助中,可以通过如下位置查找到调用外部Action的原理和说明。
    Mercury QuickTest Professional User's Guide > Working with Advanced Testing Features > Working with Advanced Action Features > Inserting Calls to Existing Actions

    从上面的图可以看到,调用外部测试脚本和可重用Action时QTP默认使用了绝对路径。当QTP测试脚本根目录,即scrīptRoot发生变化的时候,这样的调用关系就会导致再次打开并运行Test2时被调用的ReusableAction找不到的错误。如果自动化测试组由多个脚本开发工程师组成,这种情况就比较容易发生在组内共享测试脚本的时候。
    相对路径就可以在这个时候派上用场,只需在Select Action对话框的From test:下拉框中手工输入相对路径,以本文为例是:\test1。然后点击Action下拉框,ReusableAction就会自动出现在下拉框中。如图:

    按确定按钮后保存测试脚本Test2,以后Test1和Test2的根目录再如何改变或者移动,只要Test1和Test2相对位置不变,调用关系就不会受影响了。

    [注意]
    虽然相对路径增强了测试脚本的可移植性,使用中需要注意QTP对外部调用Action的相对路径支持有限。对一个外部可重用Action调用操作的设置完成了,就没有机会再改动了。也就是说,如果第一次调用一个Action时,在Select Action中输入的是绝对路径,就没有机会再改为相对路径了。
  • 相对路径[3] - 引用函数库

    2007-06-12 10:34:34

    在测试脚本的设计开发过程中,应该将可以重复利用的Action设计成Resuable Action。此外,还应该将可以重复利用的函数或子过程封装成可以从外部引用的公用函数库。QTP使用的开发语言是VBscrīpt,因此把这种类型的函数库保存为*.vbs的文件形式就可以了。
    以封装改变QTP窗口的子过程为例,将如下脚本
    '******************************************************************************
    'Name: ChangeQTPState
    'Descrīption: This sub changes the QTP window to a designated state during run
    '             sesscion.
    'Param: State indicates what the QTP window will be changed to.
    '       Possible value for State: Minimized, Maximized, Restored
    '******************************************************************************
    Sub ChangeQTPState(State)
        Dim objQTPWin
        Set ōbjQTPWin = GetObject("" , "QuickTest.Application")
        objQTPWin.WindowState = State
        Set ōbjQTPWin = Nothing
    End Sub
    保存到func.vbs,以后就可以从测试脚本中引用func.vbs的ChangeQTPState方法了。

    引用函数库文件的方式有两种,分别是测试脚本中执行ExecuteFile方法和测试资源指向vbs文件。
    假设测试脚本Test1和func.vbs分别如下保存:
    scrīptRoot\
              \Testscrīpts\Test1
              \Lib\func.vbs
    [ExecuteFile方法]
    在测试脚本Test1中加入如下语句:
    ExecuteFile "scrīptRoot\Lib\func.vbs"
    在后面的语句中就可以直接调用func.vbs中已经定义的各个函数或者子过程了,比如ChangeQTPState。
    [指定测试资源]
    在QTP中打开测试脚本Test1,并且选择菜单File -> Settings。在打开的Test Settins对话框中选择Resources标签页。在Associated function libraries列表中浏览并添加func.vbs。

    使用上述的任一方法向测试脚本Test1添加函数库func.vbs的引用,func.vbs的绝对路径都会给测试脚本带来移植性问题。当测试脚本的根目录scrīptRoot发生变化,测试脚本Test1对函数库func.vbs的引用就失效了。只能重复编辑相应的位置,把func.vbs新的绝对路径信息更新到脚本中去,从而让测试脚本Test1找到func.vbs文件。其实只要用相对路径的方式稍加改进,这样的问题就可以避免了。根据Test1和func.vbs的相对位置,func.vbs对Test1的相对路径就是"..\..\Lib\func.vbs"。
    [ExecuteFile方法]
    在测试脚本Test1中加入如下语句:
    ExecuteFile "..\..\Lib\func.vbs"
    [指定测试资源]
    在Associated function libraries列表中把已经添加的func.vbs改成..\..\Lib\func.vbs。

    编辑完成并保存Test1,以相对路径方式引用func.vbs的关系就在脚本中保存下来。以后无论测试脚本的根目录如何变化,只要Test1和func.vbs的相对位置不变,他们之间的引用关系就不会发生变化了。

  • 相对路径[2] - 关联对象库

    2007-06-12 10:33:50

    如果测试脚本中需要关联公共的对象库,在设置关联关系的时候也可以考虑使用相对路径增加脚本的可移植性。
    比如,测试脚本Test1需要关联公共的对象库objects.tsr。它们分别保存如下:
    scrīptRoot\
              \Test1
              \objects.tsr
    在Test1中关联对象库objects.tsr时,应该在QTP中选择Resources菜单的Associate Repositories项。在关联对象库对话框中,通过浏览文件的方式找到objects.tsr并选择该文件。这时对象库列表中以绝对路径形式列出了objects.tsr。
    根据objects.tsr与Test1的相对位置,只要在列表中将objects.tsr文件的绝对位置改为..\objects.tsr,以后Test1就会以相对路径的位置关联这个对象库。只要Test1和objects.tsr的相对位置不变,当脚本的存放位置发生变化时都不会出现对象库找不到的错误了。


  • 在测试脚本中用相对路径调用外部资源

    2007-06-09 23:45:56

    自动化测试项目中的开发工程师一般不会很多,自动化测试的执行环境也相对固定。因此,自动化测试项目不必像应用程序开发项目那样对代码的可移植性有很高的要求。但是为了给测试项目生命周期中的脚本维护、测试环境变更提供方便,也应该适当考虑自动化测试脚本的可移植性。

    在自动化测试脚本中,用相对路径代替绝对路径可以增加测试脚本的可移植性。在QTP测试脚本中,一些调用外部资源的地方涉及路径问题:
    在这几个方面,都可以用相对路径代替绝对路径增强QTP测试脚本的独立性。
  • 用好QTP帮助文档

    2007-06-07 17:39:05

    安装了英文版的QTP9.*后,可以从启动菜单的QTP文件夹中看到它的自带帮助文档。
    在Start -> QuickTest Professional -> Documentation下面列出了4个主要的帮助文件:
    QuickTest Automation Reference(QTP自动化参考)
    QuickTest Professional Code Samples Plus(QTP代码范例)
    QuickTest Professional Help(QTP帮助)
    Tutorial(教程)

    Tutorial是QTP的入门教程,提供了一个QTP入门的学习曲线。初学者可以按部就班的学习Tutorial的内容,实现对QTP的直观了解;
    QuickTest Professional Help是QTP的全面帮助,是QTP测试脚本开发过程中最常用而且有效的文档。包括用户指南(QuickTest User's Guide)、业务过程测试用户指南(QuickTest for Business Process Testing User's Guide)、对象模型参考(Object Model Conference)以及VBscrīpt参考(VBscrīpt Conference)等;
    QuickTest Professional Code Samples Plus提供了一些常用的QTP代码。部分代码是可以直接Copy + Paste应用于测试脚本的,十分具有参考价值;
    QuickTest Automation Reference是QTP自动化模型的完整描述。QTP可以以自动化对象的形式被其他程序语言调用,这为批量测试执行、与其他工具集成以及软件开发过程中的持续集成都提供了很大便利;

    知道了这些帮助文件的内容,也就很容易根据自己的需要选择参考的文档了。
  • 调整IE浏览器窗口

    2007-06-05 09:21:46

    界面交互测试有时需要在一些测试脚本运行过程中调整IE浏览器窗口的尺寸和位置。QTP仅仅提供了浏览器窗口的最大化方法,即Browser("Web Testing").FullScreen,但是并没有提供其他的改变窗口尺寸和位置的方法。

    依靠QTP本身提供的有限方法是不够的,可以利用VBscrīpt语言和QTP的描述性编程实现对IE浏览器窗口的尺寸和位置的控制。代码如下:

    'Open an IE browser with the method CreateObject()
    Dim objIE, hwndIE
    Set ōbjIE = CreateObject("internetexplorer.application")
    objIE.Visible = true
    objIE.Navigate URL 'The parameter URL is the destination address for the IE browser

    'Wait a while till the page is fully loaded
    Wait(10)

    'Move and resize the browser
    hwndIE = objIE.HWND
    'Operate the IE browser as a window object with descrīptive programming
    'The window object can be uniquely identified by the parameter hwndIE, which is the window's handle of the browser
    Window ("hwnd:=" & hwndIE).Activate
    Window ("hwnd:=" & hwndIE).Move intPosX, intPosY 'intPosX and intPosY represent the new location for the IE browser
    Window ("hwnd:=" & hwndIE).Resize intSizeX, intSizeY 'intSizeX and intSizeY represent the new size for

    'Release the object after the adjustment
    Set ōbjIE = nothing

    除了IE浏览器之外,这样的代码同样适用于其他被测的应用程序,如Word、Excel等。只要将创建对象处的参数加以调整就可以了。
  • 测试运行过程中改变QTP窗口状态

    2007-06-01 14:56:06

    在测试脚本的运行过程中,QTP窗口可能会影响测试步骤。
    有时,QTP窗口挡住了测试对象的弹出窗口或者页面控件,造成对象不可见Object is not visible错误。

    在测试脚本的开头部分加入如下代码,就可以让QTP在开始运行时最小化QTP窗口。
    Dim objQTPWin
    Set ōbjQTPWin = GetObject("" , "QuickTest.Application")
    objQTPWin.WindowState = "Minimized"
    Set ōbjQTPWin = Nothing
    其中objQTPWin.WindowState还支持最大化"Maxmized"和恢复"Restored"状态,如果把上面的代码包装成一个函数,就是根据需要在测试运行中随时改变QTP窗口的状态了。

    除了最小化以外,还可以利用QTP窗口对象的Visible属性隐藏QTP窗口。
    Dim objQTPWin
    Set ōbjQTPWin = GetObject("" , "QuickTest.Application")
    objQTPWin.Visible = False
    Set ōbjQTPWin = Nothing
    和最小化窗口不同的是,隐藏窗口以后连Windows任务栏上也不看不到QTP窗口了。
    如果需要显示QTP窗口,应该把Visible属性设置为True。

我的栏目

数据统计

  • 访问量: 21149
  • 日志数: 17
  • 图片数: 1
  • 建立时间: 2007-04-26
  • 更新时间: 2007-09-06

RSS订阅

Open Toolbar