1

我有一个在多个浏览器中并行执行的 perl 脚本。我需要设置这个脚本sub setup()继续执行。我遇到了一个问题,因为 setup() 遇到了 sub 的结尾}

代码如下:

    my @browser = ('*firefox','*iexplore');
   my $i = @browser;  
$pm = new Parallel::ForkManager($i);

    foreach $browser (@browser){

    $pid =  $pm->start and next;

    $sel = WWW::Selenium->new( host => $host , port => 4444, browser => $browser, browser_url => $url,);
    $sel->start();
    print("\n Execution : ".$browser."\n");
    $sel->open("/");


    $pm->finish();

    }
4

3 回答 3

0

那么并行运行测试需要什么?那么你所需要的只是一个并行测试运行器。对我们来说幸运的是,Perl 是互联网(以及自动化)的瑞士军刀。对于我们的实现,我们将使用一个模块和 perl 的 fork()。

第一个模块在此处可用:File::Find::Rule
第二个模块随您的 Perl 发行版一起提供

我们将使用 File::Find::Rule 解析目录并在此过程中创建文件列表(数组);并用于管理我们并行运行的多个测试 fork()。

1:  #!C:/Perl64/bin/perl  
2:  use strict;  
3:  use warnings;  
4:  use File::Find::Rule;  
5:    
6:  my $start_dir = shift || 'C:\Tests\';  
7:  my $count = 0;  
8:    
9:  my @subdirs = File::Find::Rule->directory->in($start_dir);  
10:    
11:  my @files = File::Find::Rule->file()  
12:                ->name( '*.pl' ) # Get only perl files  
13:                ->in( $subdirs[0] );  
14:    
15:  foreach my $test (@files) {  
16:    my $pid = fork;  
17:    die "fork failed" unless defined $pid;  
18:      
19:    if ($pid == 0) { # We Got a Child  
20:      print "Executing Test: " . $test . " Sequence #: " . $count . "\n";  
21:      my $exit_code = system($test);  
22:      print "Done Executing Test: " . $test . " Sequence #: " . $count . "\n";  
23:      print "Exit Code: " . ($exit_code >> 8) . "\n";  
24:      exit ($exit_code >> 8);  
25:    }  
26:    $count++;    
27:  }  
28:  exit(0);  

如果您使用 C:\Temp\ 目录中的两个 .pl 文件运行上述脚本,您将获得以下输出:

 Executing Test: C:\Temp\test1.pl Sequence #: 0  
 Executing Test: C:\Temp\test2.pl Sequence #: 1  
 Done Executing Test: C:\Temp\test2.pl Sequence #: 1  
 Exit Code: 2  
 Done Executing Test: C:\Temp\test1.pl Sequence #: 0  
 Exit Code: 1  

这就是上面的脚本正在做的事情:
1. 你传入一个目录,或者它使用 C:\Tests\ 作为默认值
2. 创建一个子目录列表
3. 进入每个目录并获取一个文件列表
4. fork 每个这些文件之一(确保它们退出)

于 2013-01-11T21:15:59.610 回答
0

这是另一个关于如何实现并行测试运行器(用于 Selenium 或任何其他类型的测试)的快速教程。

首先是代码:

1:  #!C:/Perl64/bin/perl  
2:  use strict;  
3:  use warnings;  
4:  use File::Find::Rule;  
5:    
6:  my $start_dir = shift || 'C:\Tests';  
7:  my $count = 0;  
8:    
9:  my @subdirs = File::Find::Rule->directory->in($start_dir);  
10:    
11:  my @files = File::Find::Rule->file()  
12:                ->name( '*.pl' ) # Only get perl files  
13:                ->in( $subdirs[0] );  
14:  foreach my $test (@files) {  
15:    system(1, $test);  
16:    print "Executing Test: " . $test . " Sequence #: " . $count . "\n";  
17:    print "My Father Is: " . $$ . "\n"; # process that started me  
18:    $count++;  
19:  }  
20:  exit(0);

这里的魔法由第 15 行执行。使用这种特殊形式的 perl 函数系统,我们可以强制它在继续之前不等待它启动的进程,从而有效地允许我们[几乎]同时产生多个测试。

来自 Perl 文档:

system(1, @args)

spawns an external process and immediately returns its process designator, without waiting for it to terminate.

上面的脚本将输出以下内容:

 Executing Test: C:\Temp\test_template.pl Sequence #: 0  
 My Father Is: 8692  
 Executing Test: C:\Temp\test_template2.pl Sequence #: 1  
 My Father Is: 8692  
 Executing Test: C:\Temp\test_template3.pl Sequence #: 2  
 My Father Is: 8692  
 Executing Test: C:\Temp\test_template4.pl Sequence #: 3  
 My Father Is: 8692  

下图显示了在我的调试器中,测试运行程序如何停止但 4 个衍生进程仍在运行(理论上正在运行自动化测试),正如我的 Windows 任务管理器中正在运行的 perl.exe 进程所指示的那样。

在此处输入图像描述

这就是使用 Perl 的系统函数同时启动多个自动化测试所需的全部内容。

于 2013-01-11T21:20:47.897 回答
0

我们可以使用启动和关闭的方法。供参考检查。

将参数传递给 Test::Class Setup 方法

于 2012-05-22T05:53:44.397 回答