Categories
程式開發

人力投入少10倍、一年节省五千个工时:苏宁Web应用与Client应用系统的自动交互实践


众所周知,日益复杂的系统和日渐严格的用户体验,使得软件测试人员的任务愈发繁重,人工测试投入随之增加,也由于测试技能水平差异,导致软件质量输出不稳,故而,在实际工作中,我们经常会考虑如何把人为驱动的测试行为转化为机器自动执行,做到一定程度上的节流提效,保障测试覆盖度和质量。

苏宁一直致力于自动化测试能力建设,苏宁自动化测试工具(Suning Automation Tester),简称“SAT”,基于JAVA语言实现,采用自动化测试架构中的关键字驱动(Keyword)思想,使测试设计和测试实现分离,将实现不同公共组件类、业务类Keyword集成到一个用例中运行,也最大限度地实现Keyword共享,降低测试组重复开发的工作量;从13年开始逐步实现集WEB页面、HTTP协议、手机终端应用、数据库操作、LINUX操作等方面的测试能力支持,产品已相当成熟。

本文涉及到的技术实现不再依赖SAT工具,而是基于Python语言实现的Web应用与Client应用的交互,主要结合数据驱动、结构化、关键字驱动等脚本技术思想,进而设计的完整交互方案。

该方案根据我们实际产品框架的情况定制设计了自动化测试框架,主要实现了业务数据交互,执行指令交互,任务执行交互,终端调用管理,脚本版本管理等,在脚本复用、迭代及代码健壮性上都有极大提升;除实际业务数据外,其他均实现配置化,更容易维护,也可根据业务变化自由配置规则。以下就具体阐述我们的实现过程。

一、我们的目标及现状分析

1.1我们的现状和目标

在介绍我们的目标之前,先通过图1了解简化版产品应用框架(实际产品框架远比此图呈现的复杂)、人工测试及自动化测试平台之间的关系,特别说明SYSTEM-A和B均是无UI界面的底层应用系统。

人力投入少10倍、一年节省五千个工时:苏宁Web应用与Client应用系统的自动交互实践 1

因为产品应用架构中存在一些系统是属于B端底层应用服务器的应用和C端的SAP系统,根本无可视化UI界面提供,测试人员只能被动接收这种无UI界面的底层应用和C端的测试,测试的入口是某个数据接收的接口,但测试结果检查过程复杂且繁琐,人工测试要花费大量的时间在底层应用上测试。

所以,我们的目标是要实现B端Web应用系统与C端客户端应用两套系统之间的交互,以解决底层应用检查繁琐以及与C端交互数据的处理等问题,实时监控测试数据处理过程和结果,具体来说,Web应用与SAP系统之间自动化调用和检查。

1.2 我们在用的系统

自动化测试平台系统(testingland),是测试开发团队完全自研的Python语言编码实现的B/S架构系统,为重要产品线提供定制的自动化测试框架及服务,为B端和C端系统间自动调用交互搭建了桥梁,也作为测试入口进行自动化测试实施。

SAP,众所周知,既是全球企业管理软件与解决方案的技术领袖的公司名称,又是其产品—企业管理解决方案的软件名称;而我们团队所对接的是SAP R/3系统,涉及财务FI、CO模块的账务处理。

1.3我们的调研结果、验证和分析

现将C端SAP系统部署在OS为Windows系统上,如何实现B端Web应用调用C端客户端的自动化操作呢?

调研结果

基于1.1提出的目标,经过调研,当前业内有两种常用的方案:

  • 方案一:通过IE的ActiveX直接调用本地客户端,无需配置注册表,但只仅限支持IE;
  • 方案二:通过Url Protocal协议调用本地客户端,支持大多数常用浏览器(Chrome,IE,FireFox等),但需要配置一系列的注册表信息;

验证
经验证,这两种方案进行直接调用客户端软件,都只是简单的打开本地软件而已,是不能让软件自动执行后续操作的,例如:让SAP自动记个账,并把结果返回给Web端。除非SAP“成精”,否则单单是打开SAP,它是不知道你要干什么并自动操作自己的。

分析

从以上两种方案来看存在的一些问题,首先,缺乏可持续性的执行,其次,不灵活,只支持本地,不支持远程Agent终端,也就是说,要打开客户端,必须先在同一台机器上打开某个浏览器。

针对以上分析结果,我们需要设计新的方案去解决以下问题:如何在Web端自动化操作Windows客户端,而不是单一启动?如何自动操作本地或远程Agent终端?

二、我们的解决方案

针对上述问题,设计了一个自动化应用框架(见下图),作为Web应用与SAP系统定制的自动化实现解决方案。

人力投入少10倍、一年节省五千个工时:苏宁Web应用与Client应用系统的自动交互实践 2

该方案不仅解决了自动启动SAP系统、后续的关联系统操作和检查,而且实现了用户自主配置Agent信息以及自主选择本地或远程操作Agent终端,还增加实现了持续迭代、管理、应用以及执行自动化脚本,同时也做到了对结果实现闭环检查和展示。

2.1 该方案具体实现过程:

  1. 用户从Web端选择执行终端,发起入参或数据处理请求作为开始;
  2. Web应用服务器接到请求后,判断终端类型:公共远程的Agent还是本地个人PC终端,并检查是否空闲,连接并锁定空闲终端;
  3. 按步骤2锁定终端后,从服务数据库的指令库里获取执行指令,通过Socket协议进行指令传输;
  4. 根据指令检查基础环境和待执行脚本/程序版本检测是否是最新,若不是,执行自动更新指令获取最新版本,更新后进入下一步骤;
  5. 在步骤4就绪后,执行传入待执行数据指令传输给C端并开始调用SAP自动化脚本;
  6. 将执行结果通过Socket服务传输给Web服务器和前端展示。

2.2 具体问题的解决方案

首先,解决SAP客户端启动和后续操作的问题。

在Python中,我们可以通过selenium操作浏览器,可以通过win32,SAP-API操作SAP(值得一提的是,SAP对自动化操作支持非常友好,比如session.findById的使用),也能通过pywinauto操作常规的客户端。

人力投入少10倍、一年节省五千个工时:苏宁Web应用与Client应用系统的自动交互实践 3

在本方案里,通过Python脚本代码实现对客户端的具体操作:使用Python os模块执行cmd命令和win32模块的方式打开并连接SAP,当获取到SAP窗口的session并进行连接后,使用SAP提供的API进行组件的定位、操作(对于未提供API的程序,可以使用Python的pywinatuo模块,通过title、control等方式定位其组件进行操作),这些操作是在OS为Windows系统上是可运行的,进而形成相应的脚本和执行指令。这些脚本代码(或已封装的可执行程序)也会自动部署到在脚本/程序版本库中进行管理和使用。

其次,解决远程操作Agent终端的客户端。

先准备若干台OS为Windows的机器作为专用的Agent终端,启动Windows代理机器上的Python Socket服务,根据Web下发的指令自动下载、更新、部署自动化执行程序或脚本代码到Agent机器本地,之后Socket服务继续监听后续指令的到来,根据不同的指令,自动执行后续的步骤,并将执行结果返回服务器直至在Web页面展示执行结果。

第三,远程Agent终端机器太少或太忙无空闲,怎么办?

在解决方案中完全支持个人本地PC来作为单体终端,只需要提前做一些初始环境准备工作,比如部署相应版本的Python软件及模块等。

有人就会有以下疑问:那不就和C/S架构没什么区别了吗?不还是要人工把代码/打包好的软件部署在本机上吗?项目的改动导致用户频繁变更自动化程序带来的弊端不还是存在吗?
放在个人PC本地的不是C端运行程序,而是一个已封装的Socket服务端,与远程Agent终端同理不同端而已。总之,无论是公共的远程Agent终端还是个人PC终端都是支持自动调用的,服务调用内容和过程参照下图:

人力投入少10倍、一年节省五千个工时:苏宁Web应用与Client应用系统的自动交互实践 4

三、我们用哪些主要核心技术

3.1 Socket服务

利用Python socket模块实现Socket两端服务启动和定制功能,并连接B端Web应用与C端SAP系统,使用pyinstaller进行打包封装。

Socket服务提供方(也称服务端)功能: 1.监听客户端请求并接收请求数据/指令;2.检测/下载/更新自动化执行脚本/程序;3.执行自动化脚本/程序并获取执行结果;4.返回执行结果给客户端;

Socket服务消费方(也称客户端)功能: 1.发送待执行数据/指令给服务端;2.接收服务端返回的执行结果;

人力投入少10倍、一年节省五千个工时:苏宁Web应用与Client应用系统的自动交互实践 5

通过上图交互方案中可以看出,在连接时只要满足服务提供方与服务消费方是一致的ip和port,再设置接发数据格式,就可以启动相应的消费方服务,最终实现B端的Web应用与C端SAP系统的连接。

3.2 进程指令调用

利用subprocess调用指令执行脚本,保证Socket服务与脚本相互独立;通过subprocess的PIPE管道进行传参以及结果/异常的获取。

3.3 适当运用终端系统的cmd或dos命令

利用Windows系统的cmd命令自动获取SAP安装路径/登录等操作,安装路径获取具体代码如下:

# 获取sap安装路径
os.system("start saplogon.exe")  # 打开进程
cmd = 'wmic process where name="saplogon.exe" get executablepath'  # cmd命令
sb = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)  # 执行命令

3.4 SAP脚本编写

使用win32进行连接SAP并调用SAP GUI Scripting API进行相关自动化脚本编写;SAP控件的定位路径可使用SAP录制的脚本查看,也可使用Scripting Tracker工具(Development Tool for SAP GUI Scripting工具)进行查看。

3.5 整体技术方案

可见下图,不再详细赘述。

人力投入少10倍、一年节省五千个工时:苏宁Web应用与Client应用系统的自动交互实践 6

四、我们对实际场景应用及分析

针对某记账场景进行实际对比。

4.1 人工测试所需工时

测试人员从打开SAP客户端并登陆开始生成1个凭证约2min,凭证结果检查约1min,生成多个凭证会按系统按订单成倍数增长,截图并保存整理成word文档约2min。

4.2 自动化实操

我们先看结果,实操部分日志如下:

人力投入少10倍、一年节省五千个工时:苏宁Web应用与Client应用系统的自动交互实践 7

通过日志可以看到:

  1. 从开始连接SAP到执行生成5个凭证共耗时97秒;
  2. 分别执行GXQ、TXQ两套SAP系统;
  3. 涉及SAP操作有:数据接入检查、生成凭证操作、凭证结果校验、返回Web页面展示、凭证截图、过程log展示等。

以下是我们对该记账场景的实践过程的展示,如图1 是涉及的前台WEB页面,发起执行请求,图2 是实现过程动态效果。

人力投入少10倍、一年节省五千个工时:苏宁Web应用与Client应用系统的自动交互实践 8

图1

人力投入少10倍、一年节省五千个工时:苏宁Web应用与Client应用系统的自动交互实践 9

图2

4.3结果分析

  1. 以上操作均可做到系统自动检查校验准确且完整,实际人力投入减少近10倍。
  2. SAP自动化执行效率比人员手工执行检查提升5倍以上。
  3. 测试人员操作更简单直接,执行效率高;执行结果无需切换系统查看,查询更直观;让机器替代测试人员检查及整理执行结果,问题定位和反馈精准,人力资源消耗成本降低。

五、总结

不得不说,自动化的初始成本非常高,从开始决定要解决这个交互问题,到实际框架落地和产品设计,再到最后代码实现和项目应用,我们测试开发团队共耗费60多人天,历时2个多月,但随之带来的收益也相当可观,经初步测算,近一年为我们团队节省近5000个工时。

从技术上来讲,单纯的通过Python代码实现SAP自动化并非难事,困难的是如何将B端与C端实现自动交互,并将Web应用的执行指令正确传达给SAP系统执行。在我们实现解决方案中,通过依赖socket通信自建接口和服务功能解决了最直接的交互调用问题,解决了本地或远程Agent终端调用问题,实现了建立指令库进行模块化管理,实现了持续迭代、自动部署脚本功能。

作者介绍:

仲崇瑞,苏宁科技集团员工平台研发中心高级测试经理,有多年的业务及产品设计经验和测试管理经验,负责苏宁财务核算、财务共享、税务会计及智能应用等产品的测试及管理工作,涉及功能、性能、自动化、安全等测试领域,带领团队多次出色完成财务系统变革和切换的测试工作,致力于构建苏宁财务类自动化测试产品解决方案,打造高效便捷的测试应用产品。