我有一个基于Perl的测试套件,有10,000多个测试,我想让它运行得更快。我已使用-j
标志对prove
进行了测试,我发现大多数但并非全部的测试都准备好并行运行。
虽然我可以努力使其余的测试“并行友好”,但我希望总会有一些测试没有。管理这个的好方法是什么?我希望能够有效地运行整套测试,并且如果需要,可以很容易地将测试标记为“非并行就绪”。
以下是我看到的一些选项:
TAP
结果流合并到一起,我还没有恢复。我不太关心如何管理例外列表。我可以将一个列表保存在文件中作为测试工具基础结构的一部分,或者我可以在每个测试头中放置一些标记它的东西,并且我们的测试工具可以动态地确定异常列表。
(测试套件部分基于Test :: Class,我也会看一下Test :: Class :: Load来加速它。)
答案 0 :(得分:10)
我找到了解决方案。它位于aggregate_tests() for TAP::Harness的文档中。它包含一个代码示例,用于说明如何为此目的编写自己的线束:
...例如,在某些测试应该的情况下,这很有用 并行运行,但其他不适合并行执行。
my $formatter = TAP::Formatter::Console->new;
my $ser_harness = TAP::Harness->new( { formatter => $formatter } );
my $par_harness = TAP::Harness->new(
{ formatter => $formatter,
jobs => 9
}
);
my $aggregator = TAP::Parser::Aggregator->new;
$aggregator->start();
$ser_harness->aggregate_tests( $aggregator, @ser_tests );
$par_harness->aggregate_tests( $aggregator, @par_tests );
$aggregator->stop();
$formatter->summary($aggregator);
从那里看起来我可以:
App::Prove
并覆盖_runtests()
,这是上述新功能可以合并的地方。prove
,以便拨打My::App::Prove
而不是App::Prove
。现在我更好地理解这些部分是如何组合在一起的,我可以看到如何为prove
创建一个补丁,它会添加--exclude-from-parallel FILE
之类的选项,这将允许您指定一个文件,包含要从并行测试中排除的测试文件列表。
更新2012-08-16:我现在有prove
的补丁,并已提交以供审核。你可以view and comment on the Pull Request。运行输出后没有生成摘要。目前尚不清楚为什么。
答案 1 :(得分:5)
到目前为止,我已经找到了解决这个问题的最佳解决方案。事实证明prove
已经没有文档支持标记一些测试要自2008年以来顺序运行而不是并行运行。它由TAP :: Parser :: Scheduler中一个相当奇特的“规则”系统支持,允许复杂并行和顺序测试运行的订购安排规范。
以下是prove
的基本当前配方:
# All tests are allowed to run in parallel, except those starting with "p"
--rules='seq=t/p*.t' --rules='par=**'
我有一个新的pull request,它为此功能添加了文档,并开始讨论可能为基本异常提供更简单的语法。有关详细信息,请参阅pull请求。
答案 2 :(得分:1)
我找到了另一个宣传此功能的解决方案,但我只能处理琐碎的案例。这是使用Test::Steering。它允许我这样做:
include_tests( { jobs => 4 }, @parallel_tests );
include_tests( @serial_tests );
使用此解决方案,请注意:
答案 3 :(得分:0)
Test :: Parallel还提供了一种更简单的并行运行测试的方法 看看https://metacpan.org/pod/Test::Parallel
中的样本答案 4 :(得分:0)
另一种选择:使用TAP::Harness的规则文件。
您可以在YAML文件中构建自定义规则(默认情况下称为testrules.yml)。我需要类似于你所描述的内容,我可以使用看起来像这样的testrules.yml文件:
--- seq: # tests that are not parallel-ready (will run in isolation) - seq: - t/test1.t - t/test2.t # tests that can run in parallel - par: # wildcard for everything else - **
在我的情况下,我使用的是直接调用App :: Prove的代码,而不是命令行prove
。但我认为它也适用于prove
?