引言
SAP 是常用的 ERP 系统,在对与 SAP 有交互的软件系统进行测试时,经常需要使用 SAP GUI Client 完成一定的常规操作,例如创建测试数据等。这些操作具备如下特点:需要一定 SAP 知识和技能;步骤冗长;耗时耗力;重复性操作居多等。为了提高工作效率,降低测试人员和开发人员的工作量,通过自动化的方式来完成数据准备是我们首先想到的方法。Rational Functional Tester(RFT)是一款面向对象的自动化测试工具,支持 Html、SAP、Siebel 等,因此我们采用 RFT 作为自动化的引擎。不过如果只利用 RFT 进行自动化的操作,仍然不能满足我们的需求,我们希望有一个 Self-Serve 的系统,并且能够将准备好的数据集中保存,以便以后随时提取查看数据或者基于已有的数据创建新的数据,那如何设计这样一个系统呢?本文会详细阐述。
回页首问题的提出
作者所在的项目组负责开发和测试一个电子商务应用,SAP 是其中很重要的一个部分,因此不管是开发人员还是测试人员都需要在 SAP 中准备一些测试数据,这些数据准备的工作通常是手动的通过 SAP GUI Client 进行操作,耗时耗力,重复劳动较多,除此之外,这些测试数据的准备并不是每一个人都熟悉的,往往只有少数的几个具有专业的 SAP 知识并且熟悉商业逻辑的人帮助大家来准备数据,在测试或者开发的任务比较重的时候,准备数据的需求往往也会很大,那么这几个人的工作量就会很大,而且其他人的数据请求也会因此受到不同程度的延迟,因此如果能够找到一个解决方案来克服这些缺点,对于提高工作效率和减轻工作量都是非常有好处的。
回页首方案描述
自动化准备数据是我们首先想到的解决方法,纵观众多的自动化工具,我们决定使用 Rational Functional Tester 作为自动化引擎,RFT 是一款面向对象的自动化测试工具,它支持 Html,SAP,Siebel 等众多的测试领域。但如果只是开发自动化测试脚本来完成数据准备,那仍然有诸多问题,例如,每跑一次脚本就得换一次原始数据;当在测试人员或者开发人员的工作机上跑脚本的时候,就不能干别的工作了;每次脚本运行完毕,得到数据准备的结果没有一个集中保存的地方等等。因此只单纯的用 RFT 自动化数据准备不能完全解决我们的问题,我们希望能有一个 Self-Serve 的系统,让测试人员或者开发人员可以通过浏览器提交他们的数据请求,然后不用等多久,便可以收到一封包含数据请求结果的邮件,同时也可以在浏览器中查看已经提交的数据请求。
回页首总体架构设计
图 1. 架构图
从图 1 架构图中可以看到我们的架构设计是典型的 BS 结构,下面从数据流的角度来解释该架构图:
1)2)用户在 Web 表单中填写原始数据,然后向 Web Application Server 提交数据请求;
3)该数据请求被请求队列(Request Queue)接收,如果请求队列中有其他请求,则该请求会处于等待状态,如果请求队列中只有这一个请求,则立即处理;
4)请求队列将需要处理的请求发送给处理引擎(Handling Engine);
5)同时将该数据请求的数据插入到数据库中;
6)7)处理引擎根据数据请求的类型到 RFT 脚本模板库中选取合适的模板,并且将模板中的数据占位符替换成原始数据,生成实际执行的脚本;
8)处理引擎然后通过命令行的方式驱动 RFT 来执行自动化脚本;
9)10)RFT 脚本通过 SAP GUI Client 对 SAP 进行操作,完成数据准备的过程;
11)12)并且将数据请求的结果以及脚本执行过程中的信息返回给处理引擎;
13)同时在数据库中更新之前的数据请求记录;
14)15)16)将结果返回给用户,触发结果通知邮件。
回页首系统实现
前提:
1)安装 Application Server(WAS 或者 Tomcat)
2)在同一机器或者网内的某个机器上安装 DB2
3)在 Web Application Server 所在的机器上安装 SAP GUI Client 以及 RFT
我们项目组基于这种架构设计实现了 Data Request System,在此就以它为例来介绍实现的步骤,但只重点介绍处理引擎和脚本模板的设计以及 Web 系统如何驱动脚本执行。
一、利用 Struts 2 建立友好的用户界面
基于 Struts 2 建立整个 Web 应用的的结构。web 界面主要是用于收集用户的原始数据,然后将这些数据提交给脚本处理引擎,通过替换脚本模板中的数据占位符,从而利用生成的脚本驱动 SAP GUI Client 进行自动化操作,所以 web 界面是数据的入口,也是这个端到端自动化操作的起点。这里不赘述如何实现 web 用户界面。图 2 是 Data Request System 的主界面。
图 2. Data Request System 的主界面
二、设计数据库表
为了存储数据请求记录,系统用户信息,模板存储信息等,我们需要创建一个数据库。在设计数据库表的时候,我们要充分考虑系统的可扩展性以及数据的完整性等因素。
以数据请求记录表为例,这个表的目的是记录每条数据请求,如图 3 所示,由于每类数据请求所要输入的原始数据的个数以及内容都不尽相同,所以我们不能将其每个输入作为一个字段,而是将整体作为一个字段,而用分号分隔每个原始数据以形成这个字段的内容,在图 3 中 REQ_INPUT 正是这个字段。除此之外,我们要考虑所有数据请求的共同特征,以抽象出字段,例如每一个数据请求,都需要有 ID(REQ_ID)、数据请求类型(REQ_TYPE)、提交者(USERNAME)、提交时间(CREATIONTIME)、请求结果(REQ_OUTPUT1 或者 REQ_OUTPUT2)、数据处理状态(STATUS)、完成时间(FINISHTIME)等。
图 3. 数据请求记录表结构