QTP浅谈(一)

2010-12-26  唐彧 

      通常我们所搜索到的QTP教程都会告诉你,使用QTPRecord功能记录下我们的操作,然后使用回放功能来实现自动化。这样的方式能够让你快速了解到QTP是如何实现自动化的,但是在实际生产过程中,我们是不会使用这种方式的。我们使用另一种,也就是这次将要谈到的描述性编程。

       下面我们来看一个例子,下面是使用QTPRecord功能所获取到的代码片段:

Browser("首页 - 唐彧 - 测试窝").Page("首页 - 唐彧 - 测试窝").Link("随便看看").Click

这段代码表示在名为“首页 - 唐彧 - 测试窝”的浏览器窗口的“首页 - 唐彧 - 测试窝”页面上,点击名为“随便看看”的连接。很简单。事实上,在传统的web页面中,元素简单,层次结构也并不复杂。下面我们来看一个flex实现的页面中用record功能所获取到的代码片段:

Browser("xxxx").SparkApplication("QTPShell").FlexApplication("https://xxxxxxx").FlexBox("a").FlexBox("index:2").FlexPanel("Event").FlexComboBox("eventComboBox").Open

Flex所实现的web中,层次结构相比传统的web来说就显得复杂很多,上面的代码实现的功能是“打开浏览器xxxxflex页面中标识为abox中的标识为index2的子box中的标识为eventpanel中的标识为eventComboBoxCombobox”,复杂的嵌套层次结构让我们的描述语言也显得极其别扭。

那么上述代码片段我们用描述性语句来实现是怎样的呢?

Browser(“index:=0”).SparkApplication(“id:=QTPShell”).FlexApplication(“automationname:=https://xxxxxxx”).FlexBox(“id:=a”).FlexBox(“automationindex:=index:2”).FlexPanel(“automationname:=Event”).FlexComboBox(“id:=eventComboBox”).Open

使用描述性编程与使用Record所记录下来的代码相比最大的差异在于,明确的标识了出来我们在每个组件中所使用的标志性元素,也是我们经常使用的:id, automationname, automationindex,classname等元素。描述性编程让我们清楚的知道,我们使用的是这个组件的哪一个元素来识别这个组件,而record所记录下的代码将其隐藏了起来。

也许你会问,这样实现的优势的在哪儿?

在大规模的自动化实施过程中,使用Record功能所记录下的代码不具备最重要的功能:可重用性。同时,代码的可读性和可维护性也变得极差。一个极端的例子就是一个经常被使用的元素属性一旦被更改,面临的将是重写所有相关使用到该属性的TestCase代码。

依然以此为例,如果我们要实现打开这个eventComboBox,选中其中的某个元素的功能,Record记录下的代码如下:

Browser("xxxx").SparkApplication("QTPShell").FlexApplication("https://xxxxxxx").FlexBox("a").FlexBox("index:2").FlexPanel("Event").FlexComboBox("eventComboBox").Open

Browser("xxxx").SparkApplication("QTPShell").FlexApplication("https://xxxxxxx").FlexBox("a").FlexBox("index:2").FlexPanel("Event").FlexComboBox("eventComboBox").Select “tesewo”

在实现对同一个组件多次操作的过程中,所产生的重复代码让整个TestCase结构臃肿,可读性变得非常的差。

而在描述性编程中,我们引入了一个非常重要的元素:function

和其他语言一样,我们使用function来将那些可重用的代码封装起来,让它能为每个使用者服务。代码结构将变得更清晰,更具有可读性,并且不会在action中暴露出属性信息。同时,由于大家都使用的同一个function来驱动,即便元素属性产生变更,我们也只需要修改这个相关的function

下面我们使用描述性编程来将上面的代码封装成function

‘***************************************

该方法用于在XX页面中选择Event

‘strName: 想要选择的event的名称

‘blnReport: 是否报告该元素缺失

‘created by: chris.tang

‘created date: 12/24/2010

‘***************************************

Function Select_Event(strName, blnReport)

       使用With来声明可重用的属性描述

With Browser(“index:=0”).SparkApplication(“id:=QTPShell”).FlexApplication(“automationname:= https://xxxxxxx”).FlexBox(“id:=a”).FlexBox(“automationindex:=index:2”).FlexPanel(“automationname:=Event”).FlexComboBox(“id:=eventComboBox”)

         判断这个combobox是否存在, 使用”.”来引用with中的描述

If .Exist(5) Then

              .open ‘打开这个comboBox

              .select strName ‘选择传入的名为strName的元素

              Select_Event = true ‘返回true,表示操作成功

          Else

              Select_Event = false ‘返回false,表示失败

              判断是否报告元素缺失

If blnReport Then

               Reporter.ReportEvent micFail,”名为XXXcomboBox不存在”,” 名为XXXcomboBox不存在

              End If

           End If

       End With

End Function

Function写完后,我们创建一个.vbs文件,把写好的function放在里面,然后在setting中引入这个vbs文件,我们便可以在action中使用其中的function了。这样我们在action中就只需要输入:

Option Explicit

Select_Event(“abc”,true)

这样我们便回归到了熟悉的编码风格当中,实际实施过程中我们便是使用这样一个一个的function来驱动TestCase。使用描述性编程使代码的可重用性,可读性,可维护性都变得更高。

273°/2723 人阅读/1 条评论 发表评论

杨柳风  2011-01-01

写的不错!


登录 后发表评论
唐彧
访客 3347