写点什么

博文共赏:SAP 自动化准备测试数据:一个基于 AutoIt VBS XML 的实现思路

  • 2013-09-25
  • 本文字数:6163 字

    阅读完需:约 20 分钟

SAP 是当前知名且领先的 ERP 系统,在对与 SAP 有交互的软件系统进行测试时,经常需要使用 SAP GUI Client 完成一定的常规操作,例如创建测试数据等。这些操作具备如下特点:需要一定的 SAP 知识和技能;步骤冗长;耗时耗力;重复性强等。为了提高工作效率,降低测试人员和开发人员的工作量,通过自动化的方式来完成数据准备是我们首先想到的方法。Script Center 是我们自主开发的一款基于 AutoIt 的 SAP 自动化测试工具,通过它执行操作 SAP 的 VBS 脚本,可快速完成测试数据的准备。用户也可以通过 Script Center 方便的编辑要创建的数据值,以便创建若干不同的测试数据。

问题的提出

笔者所在的部门是负责开发和测试一个电子商务应用系统,这个系统和 SAP 交互频繁。我们往往需要在 SAP 中准备一些测试数据。以前,这些数据的准备工作,通常是手动的在 SAP GUI Client 中进行操作,参考帮助文档,一步一步执行完成。整个过程耗时耗力,且重复性强,很无趣。另外,这些操作往往比较复杂,通常是由熟悉 SAP 操作且了解电子商务应用系统的业务逻辑的少数人帮助大家来完成。在任务比较多的阶段,测试数据的需求也多,这些人本来的工作量就很大,所以对于其他人关于创建测试数据的请求有时会延迟处理。所以,项目组迫切需要一种方便、快捷的方式来在 SAP 中准备测试数据,减轻大家的工作压力,提高工作效率。

方案描述

自动化准备数据是我们首先想到的解决方法,SAP 自带了录制和回放功能。最后录制形成的脚本是 VBS 格式,双击这个 VBS 文件即可回放。但是单纯的回放脚本并不能满足用户对数据的要求,我们需要参数化这些数据,用户可以根据自己的需要来填写自己想要的数据。因为 XML 编辑起来没有对软件的特殊要求,可以很方便的进行编辑,最终决定用 XML 格式来保存这些数据。鉴于用户直接编辑 XML 可能会导致错误,我们用 AutoIt 研发出的 script center 可以对这些数据字段进行友好访问及编辑。Script center 还可以对脚本进行集中管理,使得用户有更易用的界面来运行自己需要的脚本。

总体架构设计

图 1. 架构图

从架构图可以看到我们 Script Center 的设计思路,下面从工作流的角度来解释该结构图:

  1. 用户的所有操作只需要在 Script Center 的 GUI 上完成;
  2. 通过 Script Center 查看所有自动化 SAP 的 VBS 脚本,并可以执行 VBS 脚本;
  3. 通过 Script Center 轻松查看和修改脚本所需的数据文件;
  4. 脚本读取对应数据文件,通过 SAP GUI Client 对 SAP 进行操作,完成 SAP 自动化;
  5. 为方便 SAP 登录用户的集中维护,Script 需要从 DB 中读取 SAP 登录信息,脚本执行完成后, 将记录保存到 DB,同时生成相应的日志文件。

系统实现

前提:

  1. 客户机需要安装 Script Center,SAP GUI Client,AutoIt
  2. DB2 server 上部署 Web Service,VBS 脚本通过 Web Service 和数据库进行交互

AutoIt 简介

AutoIt 是用以编写并生成具有 BASIC 语言风格的脚本程序的免费软件,用来在 Windows 下实现各种自动化任务(比如自动安装目标程序、完成各种自动化操作等)。 通过它可以组合使用模拟键盘按键,鼠标移动和窗口 / 控件操作等来实现自动化任务, 而且可以利用它开发自己的 GUI,以便获得更好的交互效果,另外,它可以把它的 Script 语言转换成 exe 可执行程序。

通过 AutoIt 建立 Script Center 用户界面

考虑到 Script Center 的主要功能比较简单,所以选择轻量级的 AutoIt 来开发主界面,而且 AutoIt 可以把脚本文件编译为独立的可执行文件,方便 Script Center 在不同客户机上运行。 Script Center 主界面主要是用于展示脚本文件,然后选择对应的脚本文件配置数据文件, 最后点击运行执行自动化脚本调用 SAP GUI Client 进行 SAP 自动化操作。

图 2. Script Center 主界面

Script Center GUI 创建的代码片段,前半部分完成控件的创建,后半部分通过消息循环机制实现操作部分。

清单 1. Script Center GUI 创建的代码片段
复制代码
Local $mainwindow = GUICreate("ScriptCenter", 900, 600)
GUISetIcon("Config/scriptcenter.ico")
$label_Title = GUICtrlCreateLabel("Script Center v1", 10, 20, 900, 50)
GUICtrlCreateTab(10, 70, 880, 450)
;;;;;;;;;;;;;;;;;;;;;;;;;;Tab1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$tab1 = GUICtrlCreateTabItem("Execution")
GUICtrlCreateLabel("Script Type", 30, 108, 60, 20)
$comb_tab1_type = GUICtrlCreateCombo("", 95, 105, 80, 20,0x0003)
GUICtrlSetData(-1, "SAP|Web|Other", "SAP")
$bt_tab1_EditDataSource = GUICtrlCreateButton("Edit Data Source", 740,
105, 100, 25)
$listview_tab1_Script = GUICtrlCreateListView("| Script Name| Key
Info| Last Run| Author", 30, 140, 830, 320)
GUICtrlListView_SetExtendedListViewStyle($listview_tab1_Script, BitOR
($LVS_NOCOLUMNHEADER, $LVS_SHOWSELALWAYS, $LVS_SINGLESEL))
$bt_tab1_Execute = GUICtrlCreateButton("Execute", 610, 470, 80, 25)
$bt_tab1_Refresh = GUICtrlCreateButton("Refresh", 740, 470, 100, 25)
;;;;;;;;;;;;;;;;;;;;;;;;;;Tab1 End;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; GUI MESSAGE LOOP
GUISetState()
LoadViewList()
While 1
$msg1 = GUIGetMsg()
Switch $msg1
Case $GUI_EVENT_CLOSE
Exit
Case $bt_tab1_Execute
Local $isselected = 0
;$typeitem = ControlCommand ("ScriptCenter",
" ",$comb_tab1_type,"GetCurrentSelection")
For $item = 0 To $count
$fielitem = $item + 1
$file = $FileList[$fielitem]
$path1 = GetDir()
IF $typeitem =="SAP" Then
_RunDos("wscript
"&$path1&"\script\"&$file)
EndIf
EndIf
Next
Case $bt_tab1_EditDataSource
For $item = 0 To $count
If _GUICtrlListView_GetItemState
($listview_tab1_Script, $item, $LVIS_SELECTED) Then
$xmlFile = $path1&"\xml\"&$filedatasource
$xmlNodePath = "data/"&$filename[1]
RunXMLEditor($xmlFile,$xmlNodePath)
GUISetState(@SW_ENABLE)
WinActivate("ScriptCenter")
EndIf
Next
If $isselected == 0 Then
MsgBox(0,"Message","Please select one item
before click button")
EndIf
Case $bt_tab1_Refresh
LoadViewList()
EndSwitch
WEnd

通过 SAP Client 自带工具录制脚本

SAP Client 自带脚本录制工具,读者可以通过该工具录制生成 vbs 脚本。

清单 2. 录制脚本范例
复制代码
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
session.findById("wnd[0]").resizeWorkingPane 156,25,false
session.findById("wnd[0]/usr/txtRSYST-BNAME").text = "UserName"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = "********"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").setFocus
session.findById("wnd[0]/usr/pwdRSYST-BCODE").caretPosition = 8
session.findById("wnd[0]/tbar[0]/btn[0]").press
session.findById("wnd[0]/tbar[0]/okcd").text = "va03"
session.findById("wnd[0]/tbar[0]/btn[0]").press

通过 AutoIt 启动 SAP Client

因为 SAP 录制的脚本只能在手动启动 SAP Client 以后才能通过脚本开始自动操作,所以我们需要利用 AutoIt 启动 SAP Client,封装 OpenSAP 方法。

清单 3. 封装 OpenSAP 方法
复制代码
Function OpenSAP720()
set autoIt = WScript.CreateObject("AutoItX3.Control")
set wsh = createobject("wscript.shell")
wsh.run Chr(34)&SAPPath&Chr(34)
Log1("Open SAP system list")
WScript.sleep 5000
autoIt.WinWaitActive("SAP Logon 720")
autoIt.ControlClick "SAP Logon 720","","[CLASS:Button;
INSTANCE:7]"
if testingEnv="LC0" Then
autoIt.ControlSend "SAP Logon 720","","[CLASS:Edit;
INSTANCE:1]","lc0"
end if
if testingEnv="LC2" Then
autoIt.ControlSend "SAP Logon 720","","[CLASS:Edit;
INSTANCE:1]","lc2[d"
end if
autoIt.send "{Enter}"
If IsObject(WScript) Then
WScript.sleep 8000
Set session = connection.Children(0)
WScript.ConnectObject session, "on"
WScript.ConnectObject application, "on"
End If
WScript.sleep 5000
session.findById("wnd[0]").maximize
End Function

调整 VBS 脚本分离数据

根据总体架构的设计,需要把录制好的脚本进行数据和 action 分离,数据文件独立存入 XML 中, vbs 脚本启动 SAP Client,并从 XML 获得参数执行自动化。

清单 4. 改进后的 vbs 脚本范例
复制代码
''' include common functions
Dim currentScriptDir
currentScriptDir=getDirOfCurrentScript()
include currentScriptDir&"\"&"CommonFunctions.vbs"
filename = Split(wscript.scriptname, ".")
' initialzie
Init(filename(0)) '开始执行脚本, 并创建和脚本同名的 log 文件
xmlNode_this = "/data/"&filename(0)&"/" '定义在 DataSource 中找相同名节点
''''''''''''''''''''' common for all scripts''''''''''''''''''''''''
{1}
'''''''''''''''''''''''' Login SAP''''''''''''''''''''''''''''''
CurrentRegion = GetTextFromXML(xmlNode_this,"CurrentRegion")
'读所选区域
Log1("CurrentRegion:["&CurrentRegion&"]")
AccountNode = "/data/Account/"&CurrentRegion&"/"
loginUser = GetTextFromXML(AccountNode,"Account1") '读对应用户名
'Log in
call Login(loginUser) '登录方法里 call 了 openSAP 方法
''''''''''''''''''''''''''''Login SAP''''''''''''''''''''''''''''
'''''''''''''''''''''''''''Specific part'''''''''''''''''''''''''
session.findById("wnd[0]/tbar[0]/okcd").text = "zvd01"
session.findById("wnd[0]/tbar[0]/btn[0]").press
session.findById("wnd[1]/usr/cmbRF02D-KTOKD").key = "ZCTR"
Sales_Org = GetTextFromXML(xmlNode_this,"Sales_Org")
Log1("Sales_Org:["&Sales_Org&"]")
session.findById("wnd[1]/usr/ctxtRF02D-VKORG").text = Sales_Org
Distribution_
Channel = GetTextFromXML(xmlNode_this,"Distribution_Channel")
Log1("Distribution_Channel:["&Distribution_Channel&"]")
session.findById("wnd[1]/usr/ctxtRF02D-VTWEG").text =
Distribution_Channel
''''''''''''''''''''''''''''Specific part'''''''''''''''''''''''''
'''''''''''''''''''' common for all scripts''''''''''''''''''''''
KillSAP()
ReleaseOjbects()
Function getDirOfCurrentScript()
Dim scriptName
scriptName = wscript.scriptfullname
dataDir= left(scriptName,instrrev(scriptName,"\")-8)
getDirOfCurrentScript = dataDir
End Function
Function include(file)
ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile
(file,1).ReadAll
End Function
'''''''''''''''''''' common for all scripts'''''''''''''''''''''

在 Script Center 读写数据文件

通过 AutoIt 生成数据文件 (XML) 的编辑界面,用户可以通过界面编辑脚本执行所需数据,通过 XML 的属性来决定在编辑界面上的显示风格。图 3 是 Script Center 的数据编辑页面,图 4 是对应的数据文件格式。

图 3. 编辑数据

图 4. 数据文件格式

XML 格式要求:

  • 根节点命名为 data。
  • 展示节点命名应和脚本名字一致,例如上图的 CreatePAE 节点。
  • 脚本所需用户节点为 Account,里面根据不同 region 创建不同节点,如果一个脚本中需要多个用户多次登录,可以在对应的 region 下再创建多个用户节点。
  • XML 中节点的值将会作为最终 SAP 脚本需要的值进行调入,完成自动化流程。

XML 节点属性值对应的意义:

  • type 属性: 如需在 Script Center 中展示为下拉选框,可以设置该属性值为 “type=combobox”,此属性必须附带 items 属性使用。
  • Items 属性: 下拉选框中的预选值,每个值需要用竖线隔开,例如 items=“JP|AM|EM|AP”
  • key 属性: key 值如果是 true,将会在 Script Center 的 list key info 中展示出来,方便用户清晰看到本次脚本运行,关键的 key 值都是哪些。
  • Required 属性: 设置 Required=“true”,页面展示会提示红星号,并且要求必填。
  • Disable 属性: 设置 disable=“true”,页面会把对应输入框置灰,不需要用户对此值再做任何修改时可用。
  • Help 属性: 设置 help 属性可以为该节点添加对应的 help 截图,会在页面上显示问号,点击问号查看截图。例如设置 help="CreatePAE\DisChannel.png"关联对应脚本的帮助截图, help="Common\Division.png"关联通用的帮助截图。

AutoIt 调用 SAP 自动化脚本

AutoIt 有丰富的函数库,其中包含 RunDos 的命令, 可以通过命令行直接执行 vbs 脚本,所以在 Execute 按钮中包含: _RunDos("wscript "&$path&$file)

在实际项目中的应用及其优势

根据该解决方案,作者开发了 Script center,并且在作者所在的项目组得到广泛的应用,到目前为止,使用状况良好,使用前后生产率的提高也是非常显著的。如下图所示:
图 5. 使用前后的效率对比

该解决方案的优势在于:

  1. 将原本手工执行的 SAP 操作自动化,节省用户大量的时间和精力,并提高了工作效率;
  2. 将常用的业务场景模板化,可以极大提高脚本的复用性;
  3. 可灵活应对新的业务需求:新的业务场景出现,仅需要创建相应的 VBSCRIPT 脚本并添加相应的用户数据输入 UI 即可;
  4. 提供友好易用的用户界面,以隐藏底层实现,改善用户体验;
  5. 用户可以轻松实现 SAP 操作而不用了解复杂的 SAP 系统知识和技能。

展望

目前 Script Center 已经实现了调用 VBS 脚本在 SAP 中完成数据创建的操作,使用方便,执行速度快,对笔者所在的项目来说,在 SAP 中准备测试数据变成了一个简单的工作,不再费时费力。当然,我们也意识到 Script Center 还有可以提升的空间,例如:一次创建多条类似的数据;可以设置多个脚本的执行顺序,然后依次执行;等等。相信在不久的将来,Script Center 会实现这些工作,给使用者带来更多的便利。

结束语

本文主要介绍了利用 AutoIt 开发出来的工具 Script Center,以及通过 Script Center 调用 VBS 脚本以在 SAP 中创建各种测试数据的过程,提出了在 SAP 中准备测试数据的一种新想法,期望对读者有所启发。

作者简介

兰艳 IBM 中国软件开发中心软件工程师。目前主要从事 Web Application 的自动化测试,功能测试等工作。

张俊 参与 IBM 软件产品的自动化测试和功能测试。

付荣 参与 IBM 软件产品的自动化测试和功能测试。


感谢侯伯薇对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013-09-25 02:463384

评论 1 条评论

发布
用户头像
很不错的分享
2022-03-15 11:15
回复
没有更多了
发现更多内容

有没有那么一瞬间,你也曾有过“失业焦虑”呢?| 社区征文

架构精进之路

技术创新 职业发展 三周年征文 三周年连更

大厂面试难?对标大厂“Java系统性能优化实战”二面阿里轻松搞定

Java你猿哥

面试 性能优化 SSM框架 Java性能优化

【数据中台商业化】数据中台微前端实践

京东科技开发者

数据中台 微前端 iframe 微前端框架

Android事件分发-基础原理和场景分析

京东科技开发者

android Activity View 企业号 4 月 PK 榜 ViewGroup

薪资结构重铸: Zebec将业务范围扩大到Web2薪资管理领域

威廉META

技术探讨 | YMatrix 如何将 TPC-H 性能提升 10 倍?

YMatrix 超融合数据库

数据库 开源数据库 性能提升 超融合数据库

企业微信接入系列-上传附件资源

六月的雨在InfoQ

企业微信 三周年连更 企业微信接入 企微上传附件

从原理聊JVM(一):染色标记和垃圾回收算法

小小怪下士

Java 程序员 后端 JVM

从原理聊JVM(一):染色标记和垃圾回收算法

京东科技开发者

Java JVM 三色标记 垃圾回收器 企业号 4 月 PK 榜

校企共建|阿里云与重庆大学人才培养交流会顺利举行

云布道师

阿里云

容易忽视的细节:Log4j 配置导致的零点接口严重超时

vivo互联网技术

问题排查 接口超时 线程block

求你看完再去面试!涨薪必备分布式事务小抄,狂怼面试官

程序知音

Java 分布式 后端 java架构 Java进阶

行业分析| 新的学习方式——在线自习室

anyRTC开发者

音视频 在线教育 视频直播 直播连麦 在线自习室

右键助手:MouseBoost PRO mac激活版

真大的脸盆

Mac Mac 软件 鼠标增强工具 鼠标辅助软件

跨平台应用开发进阶(五十二):安全合规之Android APP完整性校验机制探究

No Silver Bullet

android 安全合规 跨平台应用开发 三周年连更 APP完整性

Spring Boot过滤器实现项目内接口过滤

Java你猿哥

Java Spring Boot SSM框架

某程序员:被裁了要求公司足额补缴全部公积金,一次补二十多万!

Java你猿哥

Java 程序员 SSM框架

海通证券与易观千帆达成合作,构建优质客户生态圈

易观分析

金融 证券 经济

第二届中国国际软件发展大会|华为:构筑坚实软件根基,赋能数字经济高质量发展

Geek_2d6073

薪资结构重铸: Zebec将业务范围扩大到Web2薪资管理领域

西柚子

[杂谈]谷歌浏览器 XSwitch 插件 - 解决本地请求转发

alexgaoyh

浏览器 插件 请求转发 本地请求 xswitch

全栈开发实战|​人事管理系统的设计与实现(Spring Boot + Vue 3 + MyBatis)

TiAmo

Spring Boot mybatis Vue 3 全栈开发 三周年连更

搭建一站式OpenHarmony设备开发Windows开发环境。

坚果

OpenHarmony 三周年连更

解决90%的面试!GitHub新兴“java面试手册 2023” 一网打尽BAT大厂

Java你猿哥

Java MySQL Spring Boot JVM MySQL面试

《一文带你看懂:如何进行一次高质量CR》

后台技术汇

代码评审 三周年连更

Spring Boot如何使用Undertow容器?超级详细,建议收藏

bug菌

Spring Boot 三周年连更 Undertow

和 if else说再见,SpringBoot 这样做参数校验才足够优雅!

Java你猿哥

Java spring Spring Boot ssm if-else

微服务 Spring Boot 整合Redis分布式锁 实现优惠卷秒杀 一人一单

Bug终结者

redis 底层原理 三周年连更

什么是前端开发领域的 Cumulative Layout Shift 问题

汪子熙

typescript 前端开发 angular web socket 三周年连更

直播预告 | 时序数据处理的云端利器:TDengine Cloud 详解与演示

TDengine

tdengine 时序数据库 云服务

css实现瀑布流效果

格斗家不爱在外太空沉思

CSS 三周年连更

博文共赏:SAP自动化准备测试数据:一个基于AutoIt VBS XML的实现思路_软件工程_兰艳_InfoQ精选文章