IBM System i(又名AS / 400)-我们如何进行绿屏应用程序自动测试

你好 我叫Anton Vorobyov,我在Alfa Bank负责开发集中式银行系统的应用程序。

在这篇文章中,我将向您介绍什么是绿屏应用程序,为什么需要它们以及我们如何通过为此编写自己的解决方案来对其进行自动测试,这使我们可以将自动测试速度提高11倍。



AS / 400平台(Application System / 400)诞生于1988年。 该平台的第一个OS是OS / 400,后来更名为i5 / OS,甚至后来更名为IBM i。 不久前,她庆祝了她的三十岁生日。

深入IBM i操作系统下的开发世界,您了解这实际上不是传统意义上的“旧版”。 这是一个完全不同的环境,与通常的Windows或Unix系统几乎没有相似之处。 该OS的主要任务是在与其一起使用的设备上尽可能地提高生产力,并且不方便用户使用。

恕我直言,此操作系统会让您疯狂,通常的编写C ++代码的方法对它无效(多达数十倍的CPU损失),教科书中展示的某些反模式是有效代码的最佳实践,并且带有撰写日期。 1978年不仅可以毫无问题地组装,而且可以按设计工作! 所有这些使我们重新审视了软件开发的现代方法。

引言


改善开发中的软件质量的问题激发了每个开发团队的思想。 我们的一个信贷团队(其任务是为Misys Equation自动银行系统开发和开发模块的后部)也没有绕过这一刻。 该ABS的特点是:

  • ABS的第一个版本在CPF OS的“控制程序工具”下的前身AS / 400-IBM System / 38平台(于1978年出现)下工作;
  • 它是从20世纪70年代开始开发的,您可能会遇到出生前编写的代码(很多旧代码)。
  • 使用ABS的功能是由于与IBM i的紧密集成,以及由于后者的巨大的向后兼容性,因此您似乎是在大金字塔的发掘中担任考古学家的工作。



IBM i(徽标)

此ABS的应用程序开发(ABS选件)是根据Misys ITP集成商技术包的标准进行的,该标准规定,该选件应包括一个交互式程序,用于与最终用户进行终端交互,并使用已安装的接口来实现API以进行后台执行。

在IBM i操作系统下开发的此类交互式程序在历史上被称为绿屏应用程序,并且是此ABS用户与之交互的唯一UI。

什么是绿屏应用程序?


一个简单的答案是一个看起来像这样的应用程序:



大概:



为什么要使用绿屏应用程序?


从历史上看,运行在AS / 400系列中低端系统和其他IBM大型机上的唯一允许您请求任何用户输入的交互式应用程序是绿屏应用程序。 在IBM i操作系统(及其先前的i5 / OS和AS400)上的安装,管理,配置和开发仅使用绿屏应用程序进行(并且仍在某处进行)。

绿屏应用程序图像具有两种尺寸-24x80和27x132字符以及16种可能的颜色。 在此规模内,将执行该操作系统的开发人员和用户的大部分工作。

如此大的屏幕尺寸是从IBM System / 32,System / 34,System / 36和System / 38的商用计算机的低端和中端段连接到AS400祖先的“工作站”演变的结果。 这些工作站称为终端,由一个金属外壳的屏幕和一个键盘以及一个光笔形式的附加设备组成。 最初,仅支持两种屏幕颜色-绿色和亮绿色,这就是为什么使用已建立的短语“绿色屏幕应用程序”(英语文献中的绿色屏幕应用程序)的原因。 在1970年代,支持的颜色数量增加到16。


5251显示站型号11

最常见的终端选项是5251 Display Station Model 1(在屏幕上显示960个字符)和Model 11(在屏幕上显示1920个字符),其宽度/深度/高度分别等于530/400/400 mm,重34 kg。 Model 1的屏幕分辨率为12x80,Model 11-24x80。 终端直接连接到主机系统。

具有大型尺寸和45 kg重量的5251型显示站型号2(在屏幕上显示960个字符)和型号12(在屏幕上显示1920个字符)的终端也很常见。 它们与Model 1和Model 11的不同之处在于,它们可以通过便宜的客户端,通过带有台式打印机或独立地面打印机的Model 1(或11)终端的形式,通过上游自身将上游连接“转发”到主机。 因此,模型2和12充当集线器,从需要直接连接到主机的设备代理到主机的连接,并且成本更高。

5252 Dual Display Station系列的终端对于现代的外行人来说似乎也不寻常。


IBM System / 38设备和程序手册的宣传图片(5252 Dual Display Station)

一个带有打印机的终端套件的价格可能达到几千美元。

终端通过双轴电缆通过总线拓扑以半双工模式连接到主机,传输速度高达1 Mbps。 双轴支持的最大终端数为6个,距离主机最远的终端应位于不超过1500米的位置。

每个端子的编号是在安装过程中通过三个开关设置的,因此在总线内确定唯一的地址。 在存在现有同轴网络的情况下,可以使用从双轴电缆到同轴电缆的适配器,以及用于压接的一组合适的电缆端子。 通过这种方案,可以仅在总线上连接两个设备,最大段长不超过30米。 连接的设备总数从十几个到几十个不等,具体取决于型号。

随着台式机系统和访问网络的发展,笨重的终端被工作站所取代,在工作站中,第三方公司的各种扩展卡被用作访问主机的方式,从而支持通过双轴的直接连接。 在1984年IBM开发Token Ring技术之后,出现了用于访问机器的软件解决方案,包括通过此接口进行访问。


5250适配器到ISA总线(制造商未知)


Blackbox 5250适配卡(PC470C,PC471C,PC472C,PC473C,PC478C)

用于MS-DOS和MS Windows的仿真器同时出现在IBM和第三方制造商(包括OpenSource实现)中(例如tn5250j.sourceforge.net),在90年代中期,TCP / IP堆栈进入了世界范围和低端商务机。 为了支持通过新协议的主机访问,IBM正在开发5250系列终端仿真器。

为了创建主机协议,IBM正在开发
Telnet协议扩展(RFC 854,RFC 855,RFC 856,RFC 860,RFC 885,RFC 1091,RFC 1205,RFC 1572,RFC 2877)统称为Telnet5250(TN5250),它描述了接收和传输流的过程通过标准Telnet协议提供5250个数据流(5250个数据流)。


IBM Client Access / 400 for Windows 3.1安装程序

IBM 5250有什么特别之处?


与常规的* nix终端( 面向符号)相反,IBM 5250终端(以及相应的TN5250协议)的一个功能是其块方向 。 这意味着,主机与终端进行通信的5250数据流由数据块传输,并且其中没有传输块上下文的单独符号没有意义。

例如,主机向终端发送数据块,该数据块包含在屏幕上显示的静态信息以及输入字段的属性和坐标以及该块中的偏移量的指示,在此处将用户输入的结果写入字段。 在那之后,主机期望来自终端的消息,并且不参与用户输入过程。


IBM i主机RZKH.de(pub400.com)的登录屏幕

此外,终端仿真器的任务是解释机器中的数据块并为用户形成输入屏幕,在此用户有机会在允许的字段中输入任何信息。 而且,终端仿真器的任务包括对用户动作的反应。 F1-F24键(通过SHIFT + Fx模拟F13-F24),Enter,Home,End,PageUp,PageDn和现代键盘上不可用的其他一些特殊键被视为主机键。 这意味着,通过按下该键,带有来自输入字段的信息和屏幕上光标位置的流缓冲区(先前已填充有终端仿真器)将被发送到主机进行处理。


WIreshark 5250数据流登录尝试转储到pub400.com

主机接收缓冲区,对其进行解析,然后将输入结果传输到程序,该程序请求用户做出反应以进行进一步的数据验证,并且应用程序继续运行,而应用程序接收到按下的主机键的代码。

为什么要在这里进行自动测试


当我们面对测试已开发模块的数百个屏幕的需求时,我们考虑过自动进行绿屏应用程序的手动测试,其中一个屏幕上最多可以进行八十种不同的业务检查(验证)。

团队特别痛苦的是,除了专有的UIPath解决方案之外,2017年几乎完全没有绿屏自动测试工具。 直到今天,类似的解决方案还不多,作者意识到HelpSystems的Automate和BlazeMeter的JMeter扩展(我将很高兴知道其他类似产品)。

关于这个问题的第一个研究


安装在银行工作场所中的TN5250终端的标准仿真器是Windows 6.0(PCOMM 6.0)专用的IBM Personal Communications 。 同事发现,该产品具有通过多种API形式自动化其管理的常规方法,即:

  1. 高级语言应用程序接口(HLLAPI);
  2. 增强的HLLAPI;
  3. Windows HLLAPI
  4. 主机访问客户端库(HACL)。

自DOS和Windows的16位版本以来,前三个接口是最旧的并且已受支持。 通过根据以下原型调用单个函数来实现EHLLAPI接口上的工作:

long hllapi (LPWORD, LPSTR, LPWORD, LPWORD); 

其中第一个参数是指向要执行的函数的数字的指针,其他两个参数是与要调用的函数上下文相关的参数,最后一个是函数的结果。 也就是说,为了请求连接状态“ A”(仿真器中的会话用拉丁字母表示,范围从“ A”到“ Z”),您必须运行以下代码(摘自IBM文档):

  #include "hapi_c.h" struct HLDQuerySessionStatus QueryData; int Func, Len, Rc; long Rc; memset(QueryData, 0, sizeof(QueryData)); // Init buffer QueryData.qsst_shortname = 'A'; // Session to query Func = HA_QUERY_SESSION_STATUS; // Function number Len = sizeof(QueryData); // Len of buffer Rc = 0; // Unused on input hllapi(&Func, (char *)&QueryData, &Len, &Rc); // Call EHLLAPI if (Rc != 0) { // Check return code // ...Error handling } 

通过这种方式可调用的功能数约为60。

WinHLLAPI接口通过一些附加功能稍微扩展了此功能,这些附加功能允许注册异步调用的回调函数,以便通知与主机建立连接,与主机断开连接,更改终端屏幕上的数据等事​​件。

主机访问客户端库(HACL)界面似乎更加用户友好,因为与调用“同名函数”相反,该类提供了面向对象类层次结构的变体,该变体完全模仿了任何用户操作。


HACL模拟器类库类层次结构(C ++)

有用于C ++,Java,LotusScript和Windows的COM自动化服务器(对于Visual Basic和.NET方便)的HACL实现。

第一个原型


由于5250数据流协议的复杂性以及有关其内部设备的极其稀少的信息以及与IBM封闭式有偿文献的链接,因此,很明显,开发自己的仿真器是非常不平凡且费时的。 在这方面,提出了使用中间件层的想法,这将使您可以在所需的最低功能范围内控制终端仿真器,特别是“在字段中输入值”,“将屏幕的一部分与标准值进行比较”或“按主机键F22”。

以前使用HACL接口的同事声称(并确认在StackOverflow上进行搜索)该COM对象存在稳定性问题,并且在执行一定数量的命令后可能会挂起。 只有重新启动自动化服务器过程才有帮助。 对Java版本的快速分析表明,通过JNI在C ++接口上使用了Wrapper。 因此,选择落在C ++接口上。 相应的头文件和.lib文件位于Personal Communications For Windows本身的安装目录中。

第一个原型基于Qt5,在那里可以通过QtScript执行JavaScript代码。 在可执行脚本的环境中,向对象注册了少量方法,这些方法允许在终端仿真器中执行命令,就像命令是由人执行一样(输入字段,按下主机键,等待一行出现在屏幕上)。 我们演示了一个实时“演示”,其中编写了一个用户案例,用于从ABS公式启动绿屏应用程序,并测试该应用程序对字段输入错误的反应。 演示表明原型已经成功,我们可以继续前进。

邻居的出现


在演示第一个原型的同时,另一个部门的同事将一堆Ruby + Cucumber + Quick3270 + Ruby模块( cheeze / te3270组合在一起 。 提议的选项使用Ruby模块,该模块通过其专用的COM对象(与HACL接口不兼容)与DN32 Computing Quick3270终端仿真器进行交互。 它是针对BDD式绿屏自动测试应用程序的完整解决方案,其中包含一些上述步骤。 但是,在提出的解决方案中,我们对以下情况感到震惊:

  1. 我们使用的不是来自IBM的第三方付费仿真器(所有仿真器的工作方式略有不同,但是我们需要检查银行使用的标准仿真器的工作,错误的代价高得令人难以置信)。
  2. Cucumber针对Quick3270的步骤的实现使用了大量的睡眠来等待机器的响应;这需要大量的睡眠来等待。
  3. 通过自动化接口,Quick3270的性能非常差(通过C ++接口在原型中使用HACL看起来更加动态)。


Quick3270终端仿真器

基于原型,我们决定尝试实现自己的自动化服务器,以将Cucumber连接到Windows个人通信并设计步骤,以使仿真器屏幕上的操作之间的停机时间最小化。

抒情离题 尽管事实上在所谓的“遗留” IBM周围存在大量技术问题,但对于中型和企业业务级别的系统来说,似乎应该已经解决了这些问题,但由于以下原因,适应和转让现有技术解决方案的相关性非常高他们不在平台上。 通常,缺失与该OS的功能有关,这与现代* nix,Windows或MacOS X根本不同,后者需要对该堆栈进行软件的重大优化。

自己决定


作为我们自己的解决方案,我们创建了一个自动化服务器,作为先前演示的原型的开发。 该服务器执行命令以自动通过RPC服务器(Qt5 WebSocket)与使用者进行交互。 它与Windows个人通信(它是公司Windows操作系统映像的一部分)进行交互,并允许您:

  • 启动/停止终端仿真器会话;
  • 执行屏幕抓取绿屏;
  • 在屏幕上搜索输入字段;
  • 控制光标并模拟击键(包括主机);
  • 和其他


启动自动化服务器

但是,尽管具有HACL API的所有优点,但它有一个缺点-它不知道如何与内置的DB2 for i DBMS一起使用,并且不允许执行对于构建将执行测试脚本的模拟环境至关重要的命令。 如果IBM提供了Ruby的DB2客户机,则远程命令和分布式程序调用服务器的客户机仅以JTOpen库的形式用于Java:IBM Toolbox for Java的开源版本(也称为jt400) ) 我们通过分析具有类似功能(特别是用于Windows数据传输的个人通信,从iSeries到PC的PC或从PC到iSeries的PC的PC等)的行为来“窥视” IBM自身针对此问题的解决方案。 事实证明,这些产品通过其实现可以运行IBM JRE 6或8,具体取决于应用程序的版本,并使用jt400库。

对于自动化服务器,我们决定执行相同的操作。 JNI将启动随Windows个人通信一起提供的IBM JVM。 使用特殊的包装方法,来自RPC服务器的来自外部的命令通过将它们代理到对必要的jt400功能的调用中而执行。 由于后者还包含用于DB2的JDBC驱动程序,因此决定使用它来访问IBM i上的DBMS。

重要的是要注意,使用HACL时不能使用Oracle JVM。 如果运行终端仿真器会话,则尝试创建虚拟机实例将崩溃。 同样,如果在与HACL交互的进程的地址空间中运行Oracle JVM,则后者会挂起而没有任何解释。

随着时间的流逝,该解决方案在越来越多的工作上得以实施。 它的工作速度比Quick3270的解决方案快。 流行性以及自动测试的数量也在增加。 但是,在操作过程中,还出现了其他困难:

  1. 偶尔的终端冻结;
  2. 由于终端模拟器拒绝启动模拟器所在的用户桌面或阻止其RDP会话,因此终端模拟器拒绝启动,因此无法进行回归工作;
  3. 仅Windows;
  4. 安装,配置和更新工具的复杂过程(通过msi软件包);
  5. 我们进行130次自动测试(约4000步)的回归周期开始需要7-8个小时。

需要做的事情...


通过分析许多自动测试启动的跟踪日志,发现常用步骤的性能瓶颈,总的回归执行时间减少到4-5小时。 但是很明显,将自动化RPC服务器形式的中间件层与HACL接口结合使用(在整个系统的整个过程中也会累积“浮动”错误)不会帮助改善解决方案的特性。

另一方面,作为Windows个人服务的替代品,供应商提供了一个称为IBM i Access-客户端解决方案的跨平台解决方案。


IBM i Access-客户端解决方案

对周六和周日上午喝杯咖啡的内部结构的分析表明,其代码库基于IBM的另一种产品IBM Host on-Demand (IBM HOD)。 这是用于访问以Java 6开发的IBM i的完善解决方案,该解决方案不仅完全实现了IBM机器中使用的各种通信协议(TN3270,TN5250,VTxxx等),而且还具有高级java-swing UI组件,用于以构造函数的形式构建自己的终端仿真器,可以从很少的IBM 文档中进行组装。 对IBM HOD的更详细研究表明,UI组件基于HACL接口的Java实现,该文档的文档是开放的。 它们的行为与C ++ HACL文档仅稍有不同。


IBM Host On-Demand(徽标)

接下来,我们创建了一个供内部使用的Java库,该库实现与C ++ RPC自动化服务器相同的接口,但内部使用IBM HOD。 为了减少执行自动测试步骤的开销,我们通过重新实现所有与Ruby选项类似的步骤,从Ruby Cucumber迁移到了黄瓜jvm。 在存在类似于RPC服务器的软件接口的情况下,这并不是什么大不了的事情,特别是考虑到我们试图限制步数本身不受控制的增长,并且该值在30个单位左右。

结果如何


结果,我们无需更改即可实现所有自动测试的可操作性,并且工作速度变得如此之快,以至于我们不得不在各步骤之间引入人为的延迟,以便在开发自动测试时可以观察其工作,否则UI没有时间将屏幕拖到最后。

现有的180项自动测试具有16,000多个步骤,步骤之间的设置延迟为60毫秒,开始运行大约30分钟(相对于5小时30分钟),这相当于回归标准性能提高了11倍。

结果超出了所有预期。 我们已经接近TN5250协议的物理限制。

迄今为止,该决定已发布给整个银行,其他城市的同事也参与了改进。 在最近的变化中,同事正在将该解决方案与Jenkins集成在一起,在测试版本中,已经完成了使用Xvfb在Linux服务器上测试启动的过程,并开始了在其上运行自动测试的试验操作阶段。

感谢您阅读到底!
一切成功!

PS在2018年12月, 举行了下一次IBMi开发者大会,并在会议上就本文主题进行了报告。

到目前为止,我们每年仅针对银行员工举行一次大会。 从2019年开始,我们将邀请其他公司的参与者。 扩大专业和个人交流的圈子,分享情感,知识和经验非常有趣。

Source: https://habr.com/ru/post/zh-CN446332/


All Articles