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

百家 作者:InfoQ 2020-06-19 19:58:43
作者 | 仲崇瑞
策划 | 蔡芳芳

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

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

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

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

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

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

因为产品应用架构中存在一些系统是属于 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 系统定制的自动化实现解决方案。

该方案不仅解决了自动启动 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 操作常规的客户端。

在本方案里,通过 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 终端都是支持自动调用的,服务调用内容和过程参照下图:

三、我们用哪些主要核心技术
3.1 Socket 服务

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

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

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

通过上图交互方案中可以看出,在连接时只要满足服务提供方与服务消费方是一致的 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 整体技术方案

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

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

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

4.1 人工测试所需工时

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

4.2 自动化实操

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

通过日志可以看到:

  1. 从开始连接 SAP 到执行生成 5 个凭证共耗时 97 秒;

  2. 分别执行 GXQ、TXQ 两套 SAP 系统;

  3. 涉及 SAP 操作有:数据接入检查、生成凭证操作、凭证结果校验、返回 Web 页面展示、凭证截图、过程 log 展示等。

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

图 1

图 2
4.3 结果分析
  1. 以上操作均可做到系统自动检查校验准确且完整,实际人力投入减少近 10 倍。

  2. SAP 自动化执行效率比人员手工执行检查提升 5 倍以上。

  3. 测试人员操作更简单直接,执行效率高;执行结果无需切换系统查看,查询更直观;让机器替代测试人员检查及整理执行结果,问题定位和反馈精准,人力资源消耗成本降低。


五、总结

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

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

作者介绍:

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

为你推荐

InfoQ Pro 是 InfoQ 专为技术早期开拓者乐于钻研的技术探险者打造的专业媒体服务平台。扫描下方二维码关注 InfoQ Pro即可在【充电计划】中获取技术 PPT 下载链接,每周更新哟~持续关注我们,还有更多技术分享活动与干货资料,就等你来!

点个在看少个 bug

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接