Perl多进程技术在自动化测试脚本中用法指导

开发 架构 自动化
Perl 语言是一种非常强大的脚本语言,一个Perl多进程的系统不会由于其中一个进程的状态不良而崩溃,每个进程都相对独立地运作,很少会相互影响。

Perl多进程的用户接口是 fork() 函数以及对系统 fork 函数封装的一些 module,本文向大家介绍一下应用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 平台上,对于进程间大量信息的交互情况,最常用的是文件;这在用户空间进程和系统内核空间进程之间的通信中的最为常用。在谈起 Perl Perl多进程的时候,不可避免的要说说它与 Perl 多线程的关系。

应用Perl多进程技术到自动化测试脚本

在自动化测试中,利用RationalBuildForge作为测试管理和监控工具,90%以上的测试脚本都采用Perl脚本。采用了模块化编程,并大量使用CPAN提供的module。由于很多module都不是线程安全的,同时为了提高脚本开发效率,也会在一个脚本中直接调用另外一个脚本,所以选择在自动化测试框架中应用Perl多进程。

自动化测试脚本使用Perl多进程大致分为两种情况。一种是Testconsole需要同时操作十几个设备,例如用于主机和存储互连的光纤交换机,用于光纤物理层断开测试的交换机APCON等。这类测试的特点是需要同时操作10几个或者20几个的测试对象,对它们的操作是配置操作,而且配置脚本都会成功,主进程只需要所有子进程执行完毕就认为所有子任务已经完成,然后可以进行后续的操作。因此采用一种较为简单的Perl多进程编程方式。下面是针对这种情况的Perl多进程处理的代码示例。

清单1.Perl多进程处理的代码
    
 

  1. our@cmd=("./apcon_2052.exp119.11.217.27A15B15",  
  2. "./apcon_2058.exp119.11.217.65adminteamw0rkA05A06",  
  3. "./apcon_2052.exp119.11.217.27B09D09");  
  4. our$zombies=0;  
  5. our$kid_proc_num=0;  
  6.  
  7. $SIG{CHLD}=sub{$zombies++};  
  8.  
  9. for(my$i=0;$i<@cmd;$i++){  
  10. my$pid=fork();  
  11. if(!defined($pid)){exit1;}  
  12. unless($pid){  
  13. system"$cmd[$i]";  
  14. exit0;  
  15. }  
  16. $kid_proc_num++;  
  17. }  
  18.  
  19. while(1){  
  20. if($zombies>0){  
  21. $zombies=0;  
  22. my$collect;  
  23. while(($collect=waitpid(-1,WNOHANG))>0){  
  24. $kid_proc_num--;  
  25. }  
  26. }  
  27. if($kid_proc_num==0){last;}  
  28. else{next;}  
  29. }  
  30.  

 以上的代码采用Perl多进程方式同时处理了对3个测试设备的配置操作,然后主进程等待所有配置操作完成,再进行后续的测试。

另外一种情况较为复杂,就是经常需要针对数百个主机和存储进行配置、状态查询等,而且配置结果和查询状态需要返回主进程处理,然后根据结果数据再决定如何继续。对于这种情况,主进程需要生成数百个子进程,而且每个子进程都有大量的信息返回给主进程来处理。这样处理数百个子进程的生成:由于Perl多进程方式占用系统资源较多,因此设定一个允许主进程同时运行的最多子进程数目,然后在有子进程结束时,主进程再生成新的子进程至所有的子任务完成。这样处理主进程和子进程的通信和信息交互:由于测试Perl脚本运行平台为Linux,它是带有BSD风格的POSIX兼容的系统,会提供可靠的信号,所以仍然使用系统提供信号的来获取子进程结束的消息;对于子进程的返回信息,采用为每个子进程产生一个临时文件用于存储返回的所有信息,最后主进程来处理这些文件从而获取每个子任务的结果信息。如下是为这种情况设计的Perl多进程处理方式的软件流图。


图3.软件流图


下面以登录每个主机检查运行状态的例子给出Perl多进程处理数百个子任务的代码。

清单2.Perl多进程处理数百个子任务    
 

  1. usestrict;  
  2. usewarnings;  
  3. usePOSIX":sys_wait_h";  
  4.  
  5. our@IP=&getAllHostIP();  
  6. our$TOTAL_TASK=@IP;#assumewehave300hosts  
  7. our$MAX_LIVE_PROC=24;#MaximumnumberofsubProcessallowedtoco-exist  
  8. our@result_filename=();  
  9. our$zombies=0;  
  10. $SIG{CHLD}=sub{$zombies++};#handlemessagefromkernel  
  11.  
  12. our$handled_task=1;  
  13. our$cur_live_proc=1;  
  14. my$pid=fork();  
  15. unless($pid){  
  16. my$filename=&getUniqueFilename();  
  17. push@result_filename,$filename;  
  18. system"./checkHost$IP[$handled_task-1]$uid$psw$filename";  
  19. exit0;  
  20. }  
  21.  
  22. while($cur_live_proc>0){  
  23. if($zombies>0){  
  24. $zombies=0;  
  25. my$collect=0;  
  26. while(($collect=waitpid(-1,WNOHANG))>0){  
  27. $cur_live_proc--;  
  28. }  
  29. }  
  30. if(($cur_live_proc<$MAX_LIVE_PROC)and($handled_task<$TOTAL_TASK)){  
  31. $handled_task++;  
  32. $cur_live_proc++;  
  33. my$pid=fork();  
  34. unless($pid){  
  35. my$filename=&getUniqueFilename();  
  36. push@result_filename,$filename;  
  37. system"./checkHost$IP[$handled_task-1]$uid$psw$filename";  
  38. exit0;  
  39. }  
  40. }else{  
  41. next;  
  42. }  
  43. }  
  44.  
  45. &checkResults();  
  46.  

 小结

根据常见的设备系统测试自动化平台的特点和要求,把Perl的Perl多进程技术应用到了测试脚本中,极大地提高了测试效率。

Perl多进程已经很长的发展历史,而且应用广泛,技术成熟。Perl多进程在健壮性和容错性方面表现更好,每个进程都拥有独立的内存空间,并行的几个进程一般来说不会相互干扰;当然,相应的,Perl多进程的系统开销也比较大,而且进程间通信也变得复杂一些。妥善地处理Perl多进程生成和进程间的通信,会很好地改善自动化测试的运行效率以及稳定性。

【编辑推荐】

  1. 术语汇编 Perl多进程概念详解
  2. 常用Perl命令行参数应用介绍
  3. 实例解析Perl多进程技术的应用
  4. Perl多进程在自动化测试场景中应用
  5. Perl多进程及其和多线程的关系解析
责任编辑:佚名 来源: ibm.com
相关推荐

2010-07-15 13:21:46

Perl多进程

2010-07-14 11:14:48

Perl多进程

2010-07-26 09:53:08

Perl多进程

2012-03-30 15:52:51

ibmdw

2010-08-10 14:25:42

SilkTestFlex

2010-08-10 14:34:37

QTPFlex

2010-07-15 12:51:17

Perl多进程

2010-07-26 09:45:09

Perl多进程

2010-07-15 13:13:21

Perl多进程

2010-07-26 14:45:17

Perl Hash

2010-07-23 14:12:14

Perl Hash

2010-07-26 15:17:51

Perl解析XML文件

2010-07-20 13:02:08

Perl数组

2010-12-24 14:46:31

Perl脚本

2011-05-31 17:35:45

测试自动化QTP

2024-01-08 13:31:00

Rust自动化测试

2010-07-21 10:32:05

Perl函数返回值

2010-07-26 16:23:23

Perl语言

2010-07-26 10:09:01

Perl split函

2011-04-18 12:52:37

自动化测试功能测试软件测试
点赞
收藏

51CTO技术栈公众号