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

Mar*_*erg 15 testing parallel-processing perl automated-tests

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

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

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

  1. 证明可以修补以支持一些非并行准备的测试
  2. Jenkins被用来管理测试套件运行.我可以将非并行测试分解为自己的运行.换句话说,放弃并使用两次测试运行.
  3. 也许有一种方法可以将两个TAP我尚未恢复的结果流合并在一起.

我不太关心如何管理例外列表.要么我可以将列表作为测试工具基础结构的一部分保存在文件中,要么我可以在每个测试标题中放置一些标记它的内容,并且我们的测试工具可以动态地确定异常列表.

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

Mar*_*erg 10

我找到了解决方案.它位于TAP :: Harness的aggregate_tests()文档中.它包含一个代码示例,用于说明如何为此目的编写自己的线束:

...例如,在某些测试应并行运行但其他测试不适合并行执行的情况下,这很有用.

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);
Run Code Online (Sandbox Code Playgroud)

从那里看起来我可以:

  • 子类App::Prove和覆盖_runtests(),这是上面的新功能可以合并的地方.
  • 叉,prove以便它My::App::Prove而不是App::Prove.

现在我可以更好地理解这些部分是如何组合在一起的,我可以看到我如何创建一个补丁,prove这将添加一个选项--exclude-from-parallel FILE,这将允许您指定一个文件,其中包含要从并行测试中排除的测试文件列表.

更新2012-08-16:prove现在有一个补丁,并提交了审查.您可以查看和评论Pull请求.运行输出后没有生成摘要.目前尚不清楚为什么.


Mar*_*erg 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=**'
Run Code Online (Sandbox Code Playgroud)

我有一个新的pull请求,为此功能添加了文档,并开始讨论可能为基本异常提供更简单的语法.有关详细信息,请参阅pull请求.