在Perl中为Selenium Grid执行并行测试

时间:2012-05-21 08:29:54

标签: perl selenium parallel-processing

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

的结尾

代码如下:

    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();

    }

3 个答案:

答案 0 :(得分:0)

我们可以使用启动和关闭方法。如需参考,请查看此内容。

Passing Parameter to Test::Class Setup method

答案 1 :(得分: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.分叉每个文件(确保它们退出)

答案 2 :(得分: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进程所示。

enter image description here

使用Perl的系统功能,只需同时启动多个自动化测试即可。