我有一个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();
}
答案 0 :(得分:0)
我们可以使用启动和关闭方法。如需参考,请查看此内容。
答案 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进程所示。
使用Perl的系统功能,只需同时启动多个自动化测试即可。