如何做好SAP自动化测试

如何做好SAP自动化测试

作者:卢晨之

本文出自51testing网杂16期

 

    本文主要研究了如何使用脚本语言或主流自动化测试工具QTPSAP GUI上展开自动化的自动化测试。探讨了它们的弊端与优势,还有如何结合。

 

前言:

    SAP GUI编写的语言是ABAPAdvanced Business Application Programming),一般情况下外部公司会购买SAP的部分模块并在原来SAP GUI的基础上做二次开发,所以大部分的SAP程序都是由原始版本放射出来的子版本,同样它也继承了SAP的大部分基层类、方法。

     当然,如何对一个GUI程序做自动化测试,我们需要了解的还有很多,还包括了它的构成,类对象,方法等等。

 

了解SAP GUI的结构

     SAP GUI主要分成2层,一层是后台控件(Top level administrative objects),另一层是前台控件(Top level user interface objects)。在后台控件中,存在着一个层次鲜明的关系,正如下图所示:

 

 

透过上面图片我们可以看到,后台控件的关系分别:GuiApplicaitonGuiConnectionGuiSession;前台控件包括了:GuiMainWindowGuiModalWindowGuiSession等等。而这些层次关系也是非常重要,因为我们需要靠它来得到我们需要操作的对象,下面是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

 

 

 

上面的代码片示例了获取GuiApplicaitonGuiConnectionGuiSession。了解完了后台控件的关系图后,我们需要了解多一个前台控件的关系,就是我们所见到的SAP GUI,它们的关系如下图罗列的:

 

 

SAP GUI中,一般情况下每个Session下面就只有一个GuiMainWindow,而在这个对象下面,就都是我们能看到的对象,包括了GuiMenuBarGuiToolBarGuiUserArea等等。如何获取到它们?后面我们将再做介绍。

 

SAP GUI对象模型

SAP GUI的对象模型是面向对象的设计模式,它主要包括了4大个基类:GuiComponentGuiContainerGuiVComponent,GuiVContainer。大部分对象继承了其中的一个或者多个类,但有小部分的对象是没有继承的,例如GuiScrollBarGuiComboBoxEntryGuiSessionInfo等等。

 

纯脚本与SAP GUI

有了前面对SAP了解的基础上,我们再使用SAP自带的SAPGUIScripting API为我们服务(SAPgui\SAPguihelp\SAPGUIScripting.chm),透过这个文档,我们能够获取到这些对象的方法,属性,以便展开我们的自动化测试工作。在实际自动化过程中,我们的操作主要都是针对对象,所以获取对象自然是我们一项非常重要的工作之一。因此,如何获取到SAP GUI的前台对象,也是我们需要学习的。

________________________________________________________________________

 

获取对象的几个主要方法:

 

  1. 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]”)

 

  1. 2.        FindAllByNameFindAllByNameEx2个方法是通过传递进对象名称与类型来查找当前对象下面的子对象,并返回一个对象的集合GuiComponentCollection。其中的FindAllByNameFindAllByNameEx的区别是传进去的对象类型名称或类型码(SAP中每个对象类型都有自己对应的类型码,例如GuiToolBar101GuiCheckBox42),而这2个参数中,类型可以为空。

 

  1. 3.        FindByNameFindByNameEx区别于第2中的2个方法,第3的这2个方法是直接返回了符合条件第一个对象,是一个GuiComponent而非GuiComponentCollection。如果通过代码去了解它,就是FindAllByName().Item(0)是一样的。

 

  1. 4.        ChildrenParent属性无论是在SAP或者Web或者.netVBChildrenParent2个属性都是极为常见,它们获取到的分别是GuiComponentCollectionGuiComponent,也就是一个集合与一个对象,我们同样可以通过它们去获取我们想要的对象并做操作。

________________________________________________________________________

 

打开SAP脚本录制开关:

      SAP公司是一家非常人性化与具有远瞩的公司,它同时考虑到SAP GUI的自动化在项目中的设施,所以SAP GUI后台就已经提供了简单的脚本生成工具,就如同微软的宏录制一样。而这个脚本录制之前,我们需要把开关打开,并且设置好录制完毕后脚本的名字。

   这个开关就放在了GuiSession下面,属性分别是RecordFileRecord。它们的操作顺序是先把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支持

posted on 2013-05-16 17:12  ibelieve  阅读(3592)  评论(0编辑  收藏  举报

导航