自动化测试软件QIWI终端

哈Ha!

今天,我们将讨论一个特定的主题:QIWI自助终端的软件测试自动化。

测试自动化主题中的某些区域需要上下扫描多次,例如,测试Web服务。对于此类领域,有单独的工具,模式和最佳实践。您不需要做任何事情,承担的风险很小。

有相反的情况。主题领域是特定的,没有人可以窥见现成的解决方案,没有工具,产品的技术堆栈是独特的。您必须深入研究主题领域,从木棍和呃...其他即兴创作的材料到为自己制作工具,同时收集许多不同大小和致命力的耙子。

我今天想谈谈这样的事情。本文适合从事银行终端机或自助机软件开发和测试的人员。对于那些想通过“但也发生这种情况”的示例扩大技术视野的人。QIWI终端将于2020年推出。在后台,您可以看到其填充物。




问题


第一个QIWI终端出现在2004年,然后能够补充手机帐户。从那以后,大量的水流了,ASO(自助服务机)发生了很大变化。现在,在他们的帮助下,您可以补充银行卡,进行转账,支付各种供应商(提供者)的服务-住房和公共服务,交警罚款,信贷组织,我们自己的QIWI产品(QIWI钱包,无息分期付款卡Conscience)。QIWI终端也可以以postamata(在线商店的自动交付点)模式进行操作。

终端是什么样的?


从铁的角度来看,ASO终端是具有特定外围设备的普通台式机,例如票据接收器和硬币接收器,票据打印机,分配器,POS终端(接收塑料卡)等。

这是第一个问题。


这张著名的照片是在加利福尼亚州索诺玛县拍摄的。他们说这些是自然色,未经任何处理。顺便说一句,在美国最南端的俄罗斯殖民地位于索诺玛县的领土上。

是的,就是她。该操作系统于2014年停产,为Windows XP。 POSReady版本已被推迟到2019年,但是...并不是那么简单。

事实是终端不是QIWI的财产。他们属于伙伴,所谓的与QIWI签订协议的代理商,个体企业家和法人购买终端,在购物中心租用空间并获得几乎被动的收入。

因此,QIWI终端机群的90%(俄罗斯和其他国家/地区有超过10万个)在各种硬件上运行Windows XP-从512 MB到4 GB的RAM,各种CPU(从Pentium 4深零年级到更多)不太现代的Core i5)和不同的互联网质量和速度。不同年龄的终端机,其中一些会定期升级,而有些则有很长一段时间没有升级(有效-请勿触摸!)。我们的任务是定期向终端软件(称为MarATL)提供最新更新,并保持与所有这些浇头和外围设备的兼容性。

过期的支持操作系统


想象一个简单的测试自动化电路。我们有一个CI服务器,例如TeamCity或Jenkins。我们的终端软件是按事件(提交或堆)从原始数据中收集的,收集的二进制文件被放置在某个地方。该软件会自动安装,夜间功能自动测试会启动...呃,停下来!软件安装到哪里去?如何?

就像我在上面说的那样,90%的终端都运行Windows XP,该操作系统于2014年结束。这意味着该OS不再长期符合安全策略,没有为其发布任何更新,也没有为其提供任何新的工作软件,甚至本机Microsoft Visual Studio也仅在使用铃鼓或MSBuild收集器的工具链版本后才为其编译C ++。

通常,在使用Windows XP的终端机或虚拟机上运行测试和某种软件是一个非常糟糕的主意。您不能在XP上启动Buildagent TeamCity,也不能在Ansible剧本中配置这样的机器,那里也没有容器。Windows XP的虚拟化模板也不是很多。在任何考虑信息安全的大公司中,Windows XP计算机都将远离公司网络,甚至更远离域。也就是说,与终端(或装作它的虚拟机)的所有交互都必须在远程进行,终端本身必须至少具有第三方软件。

决断


当有人听到一堆OpenSSH和Windows XP时,他们会感到惊讶。在现代版本的Microsoft中,OSH支持直接包含在系统中。在不太现代的版本(Windows 7)中,有些使用PowerShell的SSH安装程序。 C Windows XP,情况稍差一些,但只有一点。有一个古老版本的安装程序,无需其他软件即可在其上运行。

SSH是一种远程控制主机的古老,良好,可靠的方法,这是一项众所周知的技术。您需要实现可以并行执行多项操作的SSH连接器类。例如,在联机模式下,从终端加载新的日志,执行一些命令(复制文件,运行脚本,发行权限,获取进程列表,监视终端的系统时间等)。

监视系统时间特别有趣。通过标准命令行工具,Windows XP仅以小时,分钟,秒等格式显示时间,而没有UNIX时间显示。例如,伏击是XP很长时间没有收到时区更新,而我们的俄罗斯政府以取消夏季或冬季时间的持续运动而闻名。

例如,莫斯科时区中的标准Windows XP SP3显示的时间比真实莫斯科时间早一小时。因此,在任何情况下,终端日志的时间戳都与测试电路上的时间不一致。

付款-付款-付款...


QIWI终端界面本质上是一个运行在浏览器引擎上的Web,该引擎通常很老。根据websocket协议它与MarATL(实际上是一个终端软件)进行交互。当使用一系列命令在终端上选择付款(例如,为蜂窝通信付款)时,选择付款提供商,确定佣金金额,接受钞票的限制,为特定提供商创建付款,然后通过付款终端处理将其发送至付款。

与Web界面进行远程交互是一个一般的想法,尤其是界面测试-这是另一项任务。您可以创建一个基于测试时间而不是标准index.html的测试网页。该页面运行一个与终端软件一起使用的JS脚本,另一方面,创建了一个Web套接字客户端,该客户端面向运行测试的主机。

在自动测试方面,您需要实现一个Web套接字服务器,该服务器在从客户端启动客户端连接时等待,并将通过测试页未更改的命令发送到终端软件。软件响应也会发送到测试Web套接字服务器。

也就是说,您可以以JSON的形式描述用于支付测试的命令集,该命令顺序描述了您需要发送哪些命令以及等待它们的响应方式。


接口测试页。显示通过它的命令。

钱在哪里?


最阴险的技术任务是模拟终端的外围设备。对收据打印机进行了简单的模拟,在OS中创建了一个虚拟打印机,将数据打印到文件中。您可以从终端(或由终端软件本身形成的副本)中获取该检查,并对其进行解码,例如,同时检查该检查中是否存在所有必需的字段。

接受货币的设备-纸币接收器和硬币接收器更加复杂。显然,如果我们要测试付款方案,则需要以某种方式模拟终端上的纸币接收器,支持接收纸币,退货,模拟各种问题(例如退回折皱的账单)的功能。

大多数收款设备都使用CashCode NET协议进行操作。该协议定义了票据接受者和控制者之间的交互场景(在我们的例子中,控制者是我们的终端软件)。


使用CashCode协议的钞票控制器和验证器交互作用的示例。控制器以一定的频率请求设备的状态。


CashCode命令的最小大小为6个字节。有关命令的说明,请参见CashCode NET协议规范。

标准票据接收器通过COM端口连接到终端。有第三方实用程序可让您在计算机上创建虚拟串行端口,例如VSPE。甚至支持通过TCP连接转发此端口的脚本。

我们的情况比较简单,我们需要一个可以使用WinAPI绑定到端口并具有任意便捷接口的工具,例如,最简单的stdin / stdout,可以使用SSH进行连接。

图拉在单独的流中通过串行端口与控制器进行通信,并且如有必要,可以模仿接收所谓“钱”的情况。也有必要建立某种类型的测试帐户或提供者池,其付款将不会被真实处理,但在某些时候会被拒绝。或者,对于更复杂的情况,这笔钱确实经过了实际处理,但进入了特殊帐户,然后又从这些帐户中扣款以进行付款测试。

这就是自然界中的货币循环。


收据打印机(上方)和票据接收器(下方)。

24/7


终端和ATM的软件应具有极强的抵抗各种紧急情况的能力-缺乏互联网,承兑汇票的问题等。由于此类软件在具有很高优先级和权限的终端上运行,因此它实际上拦截了所有OS控制。您不仅可以折叠它,也不能使用Alt-F4将其关闭。软件可以自行重启,也可以重启终端。在一个循环中。还必须检查这种压力很大的情况,例如,与付款处理之间缺乏沟通。终端通过定期重新启动来对此做出响应,您需要在每次加载终端软件时检查它是否正确正确执行。

从头开始安装并更新


已安装的终端软件使用付款处理进行集中更新。处理计划更新一个特定的终端并确定它的更新配置文件,即什么文件以及从何处加载。要进行更新,必须在处理数据库中执行许多过程,然后监视终端。通过日志检查是否已开始下载必需的文件,并且更新已成功完成并且终端软件已启动。

从头开始进行干净安装比较困难。通常,人们可以通过简单地将安装文件复制到终端,然后将设置和授权数据输入到安装程序表单中来完成此操作,该表单通常是带有标准Windows控制器(TextBox,CheckBox等)的WinAPI应用程序。

在我们的干净安装脚本自动测试中,Python脚本附加到终端,安装程序将启动该脚本,并使用pywinauto库与控制器进行交互并编写其自己的安装日志。在安装的第一阶段完成之后,脚本结束,并且终端软件通过处理授权,接收安装概要文件的路径,并下载所有必需的文件。在这里,您需要实时通过SSH监视终端上的日志。将安装过程中的所有异常情况(例如,错误的授权数据)写入其中,您需要在线阅读这些日志,并在必要时认为全新安装测试失败。


从头开始全新安装MarATL

结论


我们简要介绍了为终端软件创建自动测试的主要技术方面。在没有深入研究技术的情况下,我们将重大任务分为不同的方面。如果您对该主题感兴趣,请在评论中提出问题,您可以在另一篇文章中更详细地强调一些要点。感谢您的关注!

Source: https://habr.com/ru/post/undefined/


All Articles