[i=s] 本帖最后由 crazypeter2005 于 2013-7-22 17:46 编辑
这是第一个系列的文章中弄掉了的一篇。我答应大家有空补充起来的,这个会慢慢的更新下去,希望对大家有些帮助:
我做过自动化测试好多年,也用过不少的测试工具,对自动化的测试理论也了解不少,研究生的论文就是写的自动化测试。现在看来那个论文真是的很稚嫩。
为了更好的提高重用性,需要引入自动化测试框架,让测试能更节省人力,让测试更加可靠。
先介绍我接触的第一个自动化测试框架,是一个测试界面的框架:
被测产品是一个C/S结构的程序,采用Rational Robot来做产品的自动化。
由于Robot对某些窗口支持不好,测试框架还采用了SAS的自动化前辈 [url=mailto:Carl.Nagle@sas.com]Carl Nagle[/url]的部分代码
整个ProductA有76个窗口,有800个Case。
整个架构是这样子的:
Test Framework.jpg
我来简单介绍一下子:ProductA是被测试的产品,ProductB是有时候和ProductA做集成的产品。
第一层是底层:包括Common Function以及产品给到的Property文件或者XML文件,这里面只有Product Specific List View Utilities和Product Related Properties File是和被测产品相关的,是为产品而定制的或者是被测产品开发的人提供的文件。
第二层是中间层:按照窗口来划分,每个Checkbook,每个EditBox,每个RadioButton都是一个独立的Item,每个Item都封装一个方法,我们叫Task。不同窗口的OK Button的点击被封装到不同的窗体的文件中,作为各自独立的Task。Task有时间需要调用Common Function里面读取Property文件的方法,总的来说,Task和被测产品关系不算大。
中间层还有一个叫做Wizard,就是调用一系列的Task,每个Wizard都是和被测产品的业务相关系的。
如何区分Task和Wizard我举个例子:
QQ登陆界面:
点击UserNmae,输入UserName,清空UserName,点击密码,输入密码,清空密码,点击登陆 这就是7个Task。
而一个Wizard就是
1 输入用户名,2 输入密码, 3 点击登陆,这就是一个Wizard。Wizard不做验证,只是调用各个小的Task。Wizard调用后验证的结果在TaskCase里面调用。
第三层是TestCase,调用Wizard,然后用Common Function的Verify系列方法去验证,Pass Or Not。
分为三层架构后,有有点也有缺点:
优点是:1 对产品进行了隔离,一般Case写好后就不需要修改,只是去调整底层的Task和Wizard。
想想Case有800个,而Task和Wizard写在一起才76个文件,每个窗体一个。
2 Task和Wizard起名有规范,直接读Case能够读懂,写Case的工作交给只会手工的人也能写,调试交给专职自动化的人来。
3 产品小规模调整的时候,只需要调整Task,甚至不动Wizard和Task。
4 便于做本地化,只修改properties文件就行。
缺点也是蛮明显的:1 产品不能大改动,界面如果是可配置的,我们就必须固定某种配置或者并行集中不同界面的配置,增加了复杂度。
2 先期写Common Function和Wizard比较耗时。
3 不熟悉Common Function的人调试得花费较长时间。
举简单的代码的例子吧。
1 Properties的例子
BEGIN
IDS_DIALOGS_TITLE_MessageDlg "Message"
IDS_DIALOGS_TITLE_WarningDlg "Warning"
IDS_DIALOGS_TITLE_ErrorDlg "Error"
IDS_DIALOGS_TITLE_DirPickerDlg "Select a Folder:"
IDS_DIALOGS_TITLE_SelectDocuments "Select Documents"
END2 Task 的例子
' [All]
Declare Sub APSrch_SelectView basiclib "A_PowerSearch" (ViewName as String)
Declare Sub APSrch_ClickClearALL basiclib "A_PowerSearch" ()
Declare Sub APSrch_ClickSave basiclib "A_PowerSearch" ()
Declare Sub APSrch_ClickLoad basiclib "A_PowerSearch" ()
Declare Sub APSrch_ClickSearch basiclib "A_PowerSearch" ()
Declare Sub APSrch_ClickDone basiclib "A_PowerSearch" ()
'# Sub APSrch_SelectView((ViewName as String)
'# DESCRIPTION:
'# [Task] Select view in power search.
'# EXAMPLES:
'# Call APSrch_SelectView("General")
'# Orig Author: XX
'# Orig Date: April 6, 2006
'# History:
'# April 5, 2006 Original Release
'############################################################################
Sub APSrch_SelectView(ViewName as String)
Dim cmbName As String
cmbName=A_GetKeyRC("IDS_DESKTOP_LABEL_SelectView")
Call A_CmbSelect(cmbName, ViewName)
End Sub3 Wizard的例子
Declare Sub APSrch_SearchByProperty basiclib "A_PowerSearch" (Property as String, Filter as String, Value as String)
Declare Sub APSrch_SerachByDocContent basiclib "A_PowerSearch" (words() as String, condition() as String)
Declare Sub APSrch_SearchByDate basiclib "A_PowerSearch" (Property as String, Filter as String, DYear as String, Aonth as String, DDay as String)
'# Sub APSrch_SearchByProperty(Property as String,Filter as String,Value as String)
'# DESCRIPTION:
'# Search by a property in general tab
'# PARAMETERS:
'# [In] Property e.g., "DocumentName"
'# [In] Filter e.g., "Contain"
'# [In] Value e.g., "Test"
'# ERRORS:
'# (none)
'# EXAMPLES:
'# Call APSrch_SearchByProperty("DocumentName","Contain","Test")
'# APSrch_SearchByProperty"DocumentName","Contain","Test"
'# Orig Author: XX
'# Orig Date: May 25, 2005
'# History:
'# May 25, 2005 Original Release
'# April 11, 2006 XX Modified "APSrch_General_ClickAdd" instead of "APSrch_ClickAdd" and
'# "APSrch_General_InputValue" instead of "APSrch_InputValue"
'############################################################################
Sub APSrch_SearchByProperty(Property as String,Filter as String,Value as String)
A_Focus A_GetKeyRC("CPN_DESKTOP")
Call ADesk_ClickTopPowerSearch()
A_Focus A_GetKeyRC("IDD_POWERSEARCH_TEMPLATE.CAPTION")
APSrch_SelectProperty Property
APSrch_SelectFilter Filter
APSrch_General_InputValue Value
Call APSrch_General_ClickAdd()
APSrch_ClickSearch
Call A_Delay(10000)
End Sub4 Test Case例子
'# Test if we can create a document and later search out
'# DESCRIPTION:
'#
'#
'#
'############################################################################
Sub Test_Search_By_Properties(Property as String,Filter as String,Value as String)
Call User_Login(NormalUser1, Password1)
Call A_CreateDoc(TestPath1, DocName)
Call A_Desktop_Focus()
Call A_Desk_ClickTopPowerSearch()
Call A_PowerSearch_Focus()
Call APSrch_SelectProperty Property
Call APSrch_SelectFilter Filter
Call APSrch_General_InputValue Value
Call APSrch_General_ClickAdd()
Call APSrch_ClickSearch()
Call A_Delay(10000)
Dim Count As Interger
Call Count = CommonUtil_GetListView_Count()
If Count = 1 then
Test_Log("Test_Search_By_Properties","Pass",CommonUtil_GetCurrenTimeStamp)
Else
Test_Log("Test_Search_By_Properties","Fail",CommonUtil_GetCurrenTimeStamp)
End If
Call A_DeleteFileAll()
Call A_Logout()
End Sub可以看到整个Case是可读可维护的,维护的成本也是比较小的。有编程基础的人通过写1-2个Case就能熟悉框架,通过Debug几次就能迅速定位错误。
这是接触到的第一个自动化的框架...
(后续缓慢更新中...)
这是第一个系列的文章中弄掉了的一篇。我答应大家有空补充起来的,这个会慢慢的更新下去,希望对大家有些帮助:
我做过自动化测试好多年,也用过不少的测试工具,对自动化的测试理论也了解不少,研究生的论文就是写的自动化测试。现在看来那个论文真是的很稚嫩。
为了更好的提高重用性,需要引入自动化测试框架,让测试能更节省人力,让测试更加可靠。
先介绍我接触的第一个自动化测试框架,是一个测试界面的框架:
被测产品是一个C/S结构的程序,采用Rational Robot来做产品的自动化。
由于Robot对某些窗口支持不好,测试框架还采用了SAS的自动化前辈 [url=mailto:Carl.Nagle@sas.com]Carl Nagle[/url]的部分代码
整个ProductA有76个窗口,有800个Case。
整个架构是这样子的:
Test Framework.jpg
我来简单介绍一下子:ProductA是被测试的产品,ProductB是有时候和ProductA做集成的产品。
第一层是底层:包括Common Function以及产品给到的Property文件或者XML文件,这里面只有Product Specific List View Utilities和Product Related Properties File是和被测产品相关的,是为产品而定制的或者是被测产品开发的人提供的文件。
第二层是中间层:按照窗口来划分,每个Checkbook,每个EditBox,每个RadioButton都是一个独立的Item,每个Item都封装一个方法,我们叫Task。不同窗口的OK Button的点击被封装到不同的窗体的文件中,作为各自独立的Task。Task有时间需要调用Common Function里面读取Property文件的方法,总的来说,Task和被测产品关系不算大。
中间层还有一个叫做Wizard,就是调用一系列的Task,每个Wizard都是和被测产品的业务相关系的。
如何区分Task和Wizard我举个例子:
QQ登陆界面:
点击UserNmae,输入UserName,清空UserName,点击密码,输入密码,清空密码,点击登陆 这就是7个Task。
而一个Wizard就是
1 输入用户名,2 输入密码, 3 点击登陆,这就是一个Wizard。Wizard不做验证,只是调用各个小的Task。Wizard调用后验证的结果在TaskCase里面调用。
第三层是TestCase,调用Wizard,然后用Common Function的Verify系列方法去验证,Pass Or Not。
分为三层架构后,有有点也有缺点:
优点是:1 对产品进行了隔离,一般Case写好后就不需要修改,只是去调整底层的Task和Wizard。
想想Case有800个,而Task和Wizard写在一起才76个文件,每个窗体一个。
2 Task和Wizard起名有规范,直接读Case能够读懂,写Case的工作交给只会手工的人也能写,调试交给专职自动化的人来。
3 产品小规模调整的时候,只需要调整Task,甚至不动Wizard和Task。
4 便于做本地化,只修改properties文件就行。
缺点也是蛮明显的:1 产品不能大改动,界面如果是可配置的,我们就必须固定某种配置或者并行集中不同界面的配置,增加了复杂度。
2 先期写Common Function和Wizard比较耗时。
3 不熟悉Common Function的人调试得花费较长时间。
举简单的代码的例子吧。
1 Properties的例子
CODE:
STRINGTABLE DISCARDABLEBEGIN
IDS_DIALOGS_TITLE_MessageDlg "Message"
IDS_DIALOGS_TITLE_WarningDlg "Warning"
IDS_DIALOGS_TITLE_ErrorDlg "Error"
IDS_DIALOGS_TITLE_DirPickerDlg "Select a Folder:"
IDS_DIALOGS_TITLE_SelectDocuments "Select Documents"
END2 Task 的例子
CODE:
' Tasks:' [All]
Declare Sub APSrch_SelectView basiclib "A_PowerSearch" (ViewName as String)
Declare Sub APSrch_ClickClearALL basiclib "A_PowerSearch" ()
Declare Sub APSrch_ClickSave basiclib "A_PowerSearch" ()
Declare Sub APSrch_ClickLoad basiclib "A_PowerSearch" ()
Declare Sub APSrch_ClickSearch basiclib "A_PowerSearch" ()
Declare Sub APSrch_ClickDone basiclib "A_PowerSearch" ()
CODE:
'############################################################################'# Sub APSrch_SelectView((ViewName as String)
'# DESCRIPTION:
'# [Task] Select view in power search.
'# EXAMPLES:
'# Call APSrch_SelectView("General")
'# Orig Author: XX
'# Orig Date: April 6, 2006
'# History:
'# April 5, 2006 Original Release
'############################################################################
Sub APSrch_SelectView(ViewName as String)
Dim cmbName As String
cmbName=A_GetKeyRC("IDS_DESKTOP_LABEL_SelectView")
Call A_CmbSelect(cmbName, ViewName)
End Sub3 Wizard的例子
CODE:
' Wizards:Declare Sub APSrch_SearchByProperty basiclib "A_PowerSearch" (Property as String, Filter as String, Value as String)
Declare Sub APSrch_SerachByDocContent basiclib "A_PowerSearch" (words() as String, condition() as String)
Declare Sub APSrch_SearchByDate basiclib "A_PowerSearch" (Property as String, Filter as String, DYear as String, Aonth as String, DDay as String)
CODE:
'############################################################################'# Sub APSrch_SearchByProperty(Property as String,Filter as String,Value as String)
'# DESCRIPTION:
'# Search by a property in general tab
'# PARAMETERS:
'# [In] Property e.g., "DocumentName"
'# [In] Filter e.g., "Contain"
'# [In] Value e.g., "Test"
'# ERRORS:
'# (none)
'# EXAMPLES:
'# Call APSrch_SearchByProperty("DocumentName","Contain","Test")
'# APSrch_SearchByProperty"DocumentName","Contain","Test"
'# Orig Author: XX
'# Orig Date: May 25, 2005
'# History:
'# May 25, 2005 Original Release
'# April 11, 2006 XX Modified "APSrch_General_ClickAdd" instead of "APSrch_ClickAdd" and
'# "APSrch_General_InputValue" instead of "APSrch_InputValue"
'############################################################################
Sub APSrch_SearchByProperty(Property as String,Filter as String,Value as String)
A_Focus A_GetKeyRC("CPN_DESKTOP")
Call ADesk_ClickTopPowerSearch()
A_Focus A_GetKeyRC("IDD_POWERSEARCH_TEMPLATE.CAPTION")
APSrch_SelectProperty Property
APSrch_SelectFilter Filter
APSrch_General_InputValue Value
Call APSrch_General_ClickAdd()
APSrch_ClickSearch
Call A_Delay(10000)
End Sub4 Test Case例子
CODE:
'############################################################################'# Test if we can create a document and later search out
'# DESCRIPTION:
'#
'#
'#
'############################################################################
Sub Test_Search_By_Properties(Property as String,Filter as String,Value as String)
Call User_Login(NormalUser1, Password1)
Call A_CreateDoc(TestPath1, DocName)
Call A_Desktop_Focus()
Call A_Desk_ClickTopPowerSearch()
Call A_PowerSearch_Focus()
Call APSrch_SelectProperty Property
Call APSrch_SelectFilter Filter
Call APSrch_General_InputValue Value
Call APSrch_General_ClickAdd()
Call APSrch_ClickSearch()
Call A_Delay(10000)
Dim Count As Interger
Call Count = CommonUtil_GetListView_Count()
If Count = 1 then
Test_Log("Test_Search_By_Properties","Pass",CommonUtil_GetCurrenTimeStamp)
Else
Test_Log("Test_Search_By_Properties","Fail",CommonUtil_GetCurrenTimeStamp)
End If
Call A_DeleteFileAll()
Call A_Logout()
End Sub可以看到整个Case是可读可维护的,维护的成本也是比较小的。有编程基础的人通过写1-2个Case就能熟悉框架,通过Debug几次就能迅速定位错误。
这是接触到的第一个自动化的框架...
(后续缓慢更新中...)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9562545/viewspace-769455/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9562545/viewspace-769455/