如何并行运行Perl测试套件中的一些但不是所有测试?

时间:2012-08-15 20:47:08

标签: perl testing parallel-processing automated-tests

我有一个基于Perl的测试套件,有10,000多个测试,我想让它运行得更快。我已使用-j标志对prove进行了测试,我发现大多数但并非全部的测试都准备好并行运行。

虽然我可以努力使其余的测试“并行友好”,但我希望总会有一些测试没有。管理这个的好方法是什么?我希望能够有效地运行整套测试,并且如果需要,可以很容易地将测试标记为“非并行就绪”。

以下是我看到的一些选项:

  1. prove could be patched to support some tests as not-parallel-ready
  2. Jenkins正用于管理测试套件运行。我可以将非并行测试分解为自己的运行。换句话说,放弃并使用两次测试运行。
  3. 也许有一种方法可以将两个TAP结果流合并到一起,我还没有恢复。
  4. 我不太关心如何管理例外列表。我可以将一个列表保存在文件中作为测​​试工具基础结构的一部分,或者我可以在每个测试头中放置一些标记它的东西,并且我们的测试工具可以动态地确定异常列表。

    (测试套件部分基于Test :: Class,我也会看一下Test :: Class :: Load来加速它。)

5 个答案:

答案 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  );

使用此解决方案,请注意:

  • 在它真正起作用之前,我目前必须patch the code to fix a basic bug使用它已经多年未修补。
  • 需要额外的代码来处理生成要运行的并行和串行测试的列表。
  • 我实际上没有得到我的真实世界测试的综合摘要......这两个部分都发布了自己的摘要报告,所以它并没有真正起作用。也许我错过了一些东西,或者它可能已经坏了。

答案 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