kunl 发表于 2015-9-19 14:34:26

如何做好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")
           session.findById(“wnd/tbar”)
  

[*]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").maximize
           session.findById("wnd/tbar/okcd").Text = "Test"
           WScript.Sleep 100
           session.findById("wnd").sendVKey 0
           session.findById("wnd/usr/ctx").Text = “LuchenzhiTest”
           WScript.Sleep 100
           session.findById("wnd/usr/ctxt").caretPosition = 14
           session.findById("wnd/tbar/btn").press
           session.findById("wnd/usr/sub/ctxtZ").Text = "2"
           WScript.Sleep 100
           session.findById("wnd/usr/sub/ctxtZ").SetFocus
           session.findById("wnd/usr/sub/ctxtZ").caretPosition = 1
           WScript.Sleep 100
           session.findById("wnd/tbar/btn").press
  
  
         但透过上面录制的方法,我们会看到我们的操作都被转化成为VBS的脚本,它的优点就是生成速度快,文件小,运行简单快捷。但它存在着下面的几点缺点:
  1, 缺乏稳定性 这点是所有脚本与自动化测试所需要面临的。我们需要更多的判断处理,事务等待,对象查找操作等等。
  2,方法单一,维护量大生成的脚本中,都是使用了FindById的方法去查找对象,而会导致如果程序的对象发生变化,或者ID发生变化,都需要人员维护与修改。自然,我们可以结合上文中提到的其他方法去获取对象,来确保脚本运行顺畅。
  但尽管如此,缺乏良好的对象管理模式是非常吃力的。
  3,VBS缺乏强大的IDE支持
页: [1]
查看完整版本: 如何做好SAP自动化测试