草庐IT

windows - 为什么 Perl 应用程序 'prove' 并行启动我的脚本但不并行执行这些脚本中的测试用例?

coder 2024-06-06 原文

我有几个 .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)。

最佳答案

我想出了一个解决方法,尽管这并不是解决根本问题的真正方法。我使用了 this solutions at the Sauce Labs blog 的组合和 Freddy Vega's solution here想出这个:

#!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);

关于windows - 为什么 Perl 应用程序 'prove' 并行启动我的脚本但不并行执行这些脚本中的测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18897186/

有关windows - 为什么 Perl 应用程序 'prove' 并行启动我的脚本但不并行执行这些脚本中的测试用例?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  4. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  5. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  6. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  7. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  8. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  9. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  10. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

随机推荐