通常我们所搜索到的QTP教程都会告诉你,使用QTP的Record功能记录下我们的操作,然后使用回放功能来实现自动化。这样的方式能够让你快速了解到QTP是如何实现自动化的,但是在实际生产过程中,我们是不会使用这种方式的。我们使用另一种,也就是这次将要谈到的—描述性编程。
下面我们来看一个例子,下面是使用QTP的Record功能所获取到的代码片段:
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来说就显得复杂很多,上面的代码实现的功能是“打开浏览器xxxx中flex页面中标识为a的box中的标识为index:2的子box中的标识为event的panel中的标识为eventComboBox的Combobox”,复杂的嵌套层次结构让我们的描述语言也显得极其别扭。
那么上述代码片段我们用描述性语句来实现是怎样的呢?
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,”名为XXX的comboBox不存在”,” 名为XXX的comboBox不存在”
End If
End If
End With
End Function
Function写完后,我们创建一个.vbs文件,把写好的function放在里面,然后在setting中引入这个vbs文件,我们便可以在action中使用其中的function了。这样我们在action中就只需要输入:
Option Explicit
Select_Event(“abc”,true)
这样我们便回归到了熟悉的编码风格当中,实际实施过程中我们便是使用这样一个一个的function来驱动TestCase。使用描述性编程使代码的可重用性,可读性,可维护性都变得更高。