3

.t在一个文件夹中有几个文件。每个测试脚本都会启动自己的 Selenium 实例,因此会打开自己的浏览器。然后它们将它们的指令传递给单独模块中的页面对象。页面对象是大多数测试断言发生的地方,唉。

我使用并行运行它们prove -j2 testfolder。当我这样做时,我看到两个浏览器打开,响应 Selenium 调用,但测试结果和浏览器操作表明第二个脚本仅在第一个脚本第一次调用之前Test::More运行,然后它挂起直到第一个脚本有完成的。

页面对象模型是一个红鲱鱼。我已经尝试将裸pass()调用放在每个.t文件的顶部,并确认在整个第一个脚本完成之前不会尝试第二个脚本中的测试用例。

每个testX.t文件最终看起来像这样:

use strict;
use warnings;
use Test::More tests => 40;
use Selenium::Remote::Driver;
use MyPage::Object; # test execution module

my $sel = new Driver( 'browser_name' => $browser,'
                      'remote_server_addr' => $host,
                      'port' => "80", );

pass("Debug test case - let's see when this passes");

my $user = new MyPage::Object( text => "test string", sel => $sel);
$user->verify_text;
.
.

如下Object.pm所示:

use strict;
use warnings;
use Selenium::Remote::Driver;
use Selenium::Remote::WebElement qw(get_text);

package Object;

sub new {
    my $class = shift;
    my $self = bless { @_ }, $class;
    return $self;
}

sub verify_text {
    my ($self, $text_to_verify) = @_;
    my $webElement = $self->{sel}->find_element("//*$xpath") or warn $!; 
    my $returnedtext = get_text($webElement) or warn $!;
    Test::More::ok($returnedtext =~ /\Q$text_to_verify/, "text matches");
}

1;

这是输出。当第一个测试运行时,我看到了这个:

===(       4;12   4/40  0/? )===========================================

当第一个脚本的测试用例得到验证时,第一对数字和第二对左边的数字会上升。在此之后,当第二个脚本启动时,输出变为:

testfolder\test2.t .. 4/35

随着测试用例的执行,左边的数字会增加。

不应该并行运行它们导致它们中的断言同时运行吗?这是不寻常的还是并行作业应该如何工作prove

我在 64 位 Windows 7、ActiveState Perl v5.16.1 中从命令行运行它。CPAN 显示 Prove 是最新的 (3.28)。

4

1 回答 1

1

我想出了一个解决方法,尽管这并不是根本问题的解决方案。我在 Sauce Labs 博客Freddy Vega 的解决方案中使用了这个解决方案的组合来提出这个:

#!usr/bin/perl
use strict;
use warnings;
use File::Find::Rule;
use Thread::Pool::Simple;

my $count = 0;

my @files = File::Find::Rule->file()
    ->name( '*.t' )
    ->in( 'C:\path\to\tests\' );

sub worker() {
    my $file = shift;
    system("prove $file");
    print "Executing Test: " . $file . "\n";
}

my $pool = Thread::Pool::Simple->new(
    min =>  5,
    max =>  25,
    do  =>  [\&worker],
);

foreach my $test (@files) {
    $pool->add($test);
    print "Added $test to pool..\n";
    $count++;
}
$pool->join();

exit(0);
于 2014-03-21T18:43:09.060 回答