我们在使用 Perl 语言编程时,如果一个任务的某一个段可以或者需要并发很多执行,那么我们就会使用 Perl 的Perl多进程编程,例如同时向数据库递交多个记录的查询,同时完成多个系统信息的收集等等。
Perl多进程
Perl 语言是一种非常强大的脚本语言,其广泛应用于系统维护,CGI(Common Gateway Interface)编程,数据库编程和自动化测试中。
多任务和并发处理一度被看作是判定优异操作系统的一个特性;同样任何优秀从而流行的编程语言都会有并发的应用,而且都有各自的实现方法。Perl 最开始在并发方面的应用就是Perl多进程。
Perl多进程的用户接口是 fork() 函数以及对系统 fork 函数封装的一些 module。我们在使用 Perl 语言编程时,如果一个任务的某一个段可以或者需要并发很多执行,那么我们就会使用 Perl 的Perl多进程编程,例如同时向数据库递交多个记录的查询,同时完成多个系统信息的收集等等。
Perl 的Perl多进程是这样实现的:主进程每 fork 一个子进程,会把当前(主进程的)内存空间的所有变量都复制一份传到新的进程里面,达到数据共享的目的。此外,主进程和子进程可以通过信号、管道等来通信。
在处理并发的方案中,Perl多进程依靠内存空间独享提供了优秀的容错性和健壮性。一个Perl多进程的系统不会由于其中一个进程的状态不良而崩溃,每个进程都相对独立地运作,很少会相互影响。
内存空间独享也造就了Perl多进程不可避免的劣势:资源负荷以及通信复杂,对于 Perl 来说,每个子进程都可以看作主进程的拷贝,这多少有些内存浪费,而且主进程的关键变量如果是“浅复制”到子进程的话,将会带来一些意想不到的错误。另外,进程的创建和回收会带来许多额外的负载,因此应当尽量避免频繁地创建进程。
Perl多进程之间的通信方式有 socket,管道,信号量等。在 Linux 平台上,对于进程间大量信息的交互情况,最常用的是文件;这在用户空间进程和系统内核空间进程之间的通信中的最为常用。
在谈起 PerlPerl多进程的时候,不可避免的要说说它与 Perl 多线程的关系。
自动化测试场景介绍
很多大型IT公司都以版本控制来发布一系列的企业级系统产品,为此,周期性地更新产品的每个新版本和已有产品版本间的兼容性和互操作性测试结果,对客户而言,尤为重要。而这类测试由于重复性强,工作量大,所以经常采用自动化。下面举一个自动化测试中的常见场景例子。
假设有一个团队从事企业级产品系统之间的兼容性和互操作性测试,需要在以1个月为周期的时间内完成一组配置的兼容性测试,团队成员很少,但是负责的设备却很多,往往每个人需要负责数十台甚至数百台机器,那么就必须采用多任务并发处理的自动化测试。该团队测试存储网络中的服务器,交换机和存储之间的互操作性。服务器包括很多个硬件平台,操作系统包括Linux,Unix,Windows和VMware等,光纤交换机、主机总线适配器卡和存储产品都涵盖多个厂商品牌。这个团队就需要建立一个端到端的自动化测试流程来支撑其测试任务。
下面是一个典型测试环境的简化图示。
图1.测试硬件环境概览图
其中,服务器有不同CPU架构的众多品牌;它们上面运行的测试操作系统有Linux、Windows、VMware和各类虚拟机。物理层的光纤交换机(FCPhysicalLayerSwitch)是测试工具仪器,用于控制光纤的链路通断等异常测试。
下面是Perl多进程自动化测试环境框图。
图2.自动化测试环境框图
用一台运行RedHatEnterpriseLinux系统的xServer作为Testconsole,上面安装IBMRationalBuildForge用于测试的执行和管理。Testconsole通过以太网络与各个server,switch,physical-layerswitch和storage进行通信,包括测试脚本的传送,测试命令的信息交互。
这里说明一个测试用例,从而讲述一个典型测试过程。“主机和光纤交换机之间的光纤断开测试”:
Testconsole发命令到所有的主机,让每个主机发现存储磁盘,分区,格式化文件系统,mount或者分windows盘符,配置IO程序等;然后检查各个被测应用程序以及系统的运行状态,把结果返回Testconsole;
Testconsole发命令到所有的光纤交换机,让每个光纤交换机检查自身当前的运行状态,然后返回结果到Testconsole;
Testconsole发命令到所有的存储,让每个存储机器检查自身当前的运行状态,然后返回结果到Testconsole;
Testconsole在保证所有主机,交换机和存储设备都进入要求的测试状态后,开始进入测试,否则退出;
Testconsole发命令让每个physical-layerswitch开始进行相关的光纤连接的断开,然后等待一定的时间,再合上;
Testconsole发命令到所有的主机,检测它们的状态,等待所有的主机都恢复正常;
重复5、6两步,测试持续24小时,完成。
可见,在这样的自动化测试过程中,很多次需要Testconsole和几十个或者几百个机器进行命令交互,检查状态或者执行任务。这些操作当然可以是一个系统接着一个系统的执行;但是大多数任务是可以并发的,或者是可以同时进行从而提高测试效率的,比如同时访问多个主机去启动IO程序、检查机器状态,在登录存储上执行一个脚本的同时在多个主机上面执行一些应用程序,同时登录所有的光纤交换机执行一些配置命令等。
另外,Testconsole和被测系统(Server、Switch、Storage等)之间的命令交互操作,需要使用PerlExpect模块,或其它基于Expect的模块例如Perl::SSH::Expect,Perl::Telnet::Expect等。很可惜,Expect模块并不是线程安全的。
显然,这就需要应用Perl的Perl多进程技术到自动化测试中。
【编辑推荐】