如何做好SAP自动化测试
如何做好SAP自动化测试
作者:卢晨之
本文出自51testing网杂16期
本文主要研究了如何使用脚本语言或主流自动化测试工具QTP在SAP GUI上展开自动化的自动化测试。探讨了它们的弊端与优势,还有如何结合。
前言:
SAP GUI编写的语言是ABAP(Advanced Business Application Programming),一般情况下外部公司会购买SAP的部分模块并在原来SAP GUI的基础上做二次开发,所以大部分的SAP程序都是由原始版本放射出来的子版本,同样它也继承了SAP的大部分基层类、方法。
当然,如何对一个GUI程序做自动化测试,我们需要了解的还有很多,还包括了它的构成,类对象,方法等等。
了解SAP GUI的结构
SAP GUI主要分成2层,一层是后台控件(Top level administrative objects),另一层是前台控件(Top level user interface objects)。在后台控件中,存在着一个层次鲜明的关系,正如下图所示:
透过上面图片我们可以看到,后台控件的关系分别:GuiApplicaiton,GuiConnection,GuiSession;前台控件包括了:GuiMainWindow,GuiModalWindow,GuiSession等等。而这些层次关系也是非常重要,因为我们需要靠它来得到我们需要操作的对象,下面是VBS脚本片段(GetSession.vbs):
Dim SapGuiAuto
Dim Application
Dim connection
Dim session
If Not IsObject(application) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
Set connection = application.Children(0)
End If
If Not IsObject(session) Then
Set session = connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject application, "on"
End If
上面的代码片示例了获取GuiApplicaiton,GuiConnection,GuiSession。了解完了后台控件的关系图后,我们需要了解多一个前台控件的关系,就是我们所见到的SAP GUI,它们的关系如下图罗列的:
在SAP GUI中,一般情况下每个Session下面就只有一个GuiMainWindow,而在这个对象下面,就都是我们能看到的对象,包括了GuiMenuBar,GuiToolBar,GuiUserArea等等。如何获取到它们?后面我们将再做介绍。
SAP GUI对象模型
SAP GUI的对象模型是面向对象的设计模式,它主要包括了4大个基类:GuiComponent,GuiContainer,GuiVComponent,,GuiVContainer。大部分对象继承了其中的一个或者多个类,但有小部分的对象是没有继承的,例如GuiScrollBar,GuiComboBoxEntry,GuiSessionInfo等等。
纯脚本与SAP GUI
有了前面对SAP了解的基础上,我们再使用SAP自带的SAPGUIScripting API为我们服务(SAPgui\SAPguihelp\SAPGUIScripting.chm),透过这个文档,我们能够获取到这些对象的方法,属性,以便展开我们的自动化测试工作。在实际自动化过程中,我们的操作主要都是针对对象,所以获取对象自然是我们一项非常重要的工作之一。因此,如何获取到SAP GUI的前台对象,也是我们需要学习的。
________________________________________________________________________
获取对象的几个主要方法:
- 1. findById 这是获取SAP对象中,一个比较重要和常用的方法,传递进去的参数是对象的ID,而这里的ID我们也需要注意的是,这个对象的ID其实是一个路径,所以在不同父对象中使用findById时候,ID会有所不同,就好比下列代码中,同样是获取GuiToolBar,但ID却是不同。
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
Set connection = application.Children(0)
Set session = connection.Children(0)
session.children(0).findById("tbar[0]")
session.findById(“wnd[0]/tbar[0]”)
- 2. FindAllByName与FindAllByNameEx这2个方法是通过传递进对象名称与类型来查找当前对象下面的子对象,并返回一个对象的集合GuiComponentCollection。其中的FindAllByName与FindAllByNameEx的区别是传进去的对象类型名称或类型码(SAP中每个对象类型都有自己对应的类型码,例如GuiToolBar是101,GuiCheckBox是42),而这2个参数中,类型可以为空。
- 3. FindByName与FindByNameEx区别于第2中的2个方法,第3的这2个方法是直接返回了符合条件第一个对象,是一个GuiComponent而非GuiComponentCollection。如果通过代码去了解它,就是FindAllByName().Item(0)是一样的。
- 4. Children与Parent属性无论是在SAP或者Web或者.net与VB,Children与Parent这2个属性都是极为常见,它们获取到的分别是GuiComponentCollection与GuiComponent,也就是一个集合与一个对象,我们同样可以通过它们去获取我们想要的对象并做操作。
________________________________________________________________________
打开SAP脚本录制开关:
SAP公司是一家非常人性化与具有远瞩的公司,它同时考虑到SAP GUI的自动化在项目中的设施,所以SAP GUI后台就已经提供了简单的脚本生成工具,就如同微软的宏录制一样。而这个脚本录制之前,我们需要把开关打开,并且设置好录制完毕后脚本的名字。
这个开关就放在了GuiSession下面,属性分别是Record与FileRecord。它们的操作顺序是先把FileRecord设置好(这里只需要设置文件名字,路径是默认为Documents and Settings\XXXX\SapWorkDir),再把Record设置为1并开始录制,到最后再把开关关闭。
TestRecord.Vbs
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
Set connection = application.Children(0)
Set session = connection.Children(0)
session.Recordfile="LuchenzhiTest.Vbs"
session.Record="1" ‘关闭需要设置为0
________________________________________________________________________
录制与修改脚本:
录制完毕后,我们把开关关闭,在文件夹下可以看到如下代码片(LuchenzhiTest.Vbs):
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "Test"
WScript.Sleep 100
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctx").Text = “LuchenzhiTest”
WScript.Sleep 100
session.findById("wnd[0]/usr/ctxt").caretPosition = 14
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[1]/usr/sub/ctxtZ").Text = "2"
WScript.Sleep 100
session.findById("wnd[1]/usr/sub/ctxtZ").SetFocus
session.findById("wnd[1]/usr/sub/ctxtZ").caretPosition = 1
WScript.Sleep 100
session.findById("wnd[1]/tbar[0]/btn[0]").press
但透过上面录制的方法,我们会看到我们的操作都被转化成为VBS的脚本,它的优点就是生成速度快,文件小,运行简单快捷。但它存在着下面的几点缺点:
1, 缺乏稳定性 这点是所有脚本与自动化测试所需要面临的。我们需要更多的判断处理,事务等待,对象查找操作等等。
2,方法单一,维护量大 生成的脚本中,都是使用了FindById的方法去查找对象,而会导致如果程序的对象发生变化,或者ID发生变化,都需要人员维护与修改。自然,我们可以结合上文中提到的其他方法去获取对象,来确保脚本运行顺畅。
但尽管如此,缺乏良好的对象管理模式是非常吃力的。
3,VBS缺乏强大的IDE支持