16

我有一个基于 Perl 的测试套件,其中包含 10,000 多个测试,我想让它们运行得更快。我已经使用-jto 标志进行了测试prove,我发现我的大多数但不是所有的测试都准备好并行运行。

虽然我可以努力使剩余的测试“并行友好”,但我希望总有一些测试不是。有什么好的方法来管理这个?我希望它可以轻松高效地运行整个测试集,并在需要时轻松将测试标记为“未准备好”。

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

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

我不太关心如何管理例外列表。我可以在文件中保留一个列表作为测试工具基础设施的一部分,或者我可以在每个测试标头中放置一些东西来标记它,我们的测试工具可以动态确定异常列表。

(测试套件部分基于 Test::Class,我还将查看 Test::Class::Load 以加快它的速度。)

4

5 回答 5

11

我找到了解决方案。它在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);

从那里看起来我可以:

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

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

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

于 2012-08-15T21:19:10.180 回答
6

到目前为止,我已经找到了解决这个问题的最佳解决方案。事实证明,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=**'

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

于 2012-08-20T11:46:50.220 回答
2

我找到了另一个宣传此功能的解决方案,但我只能让琐碎的案例起作用。这是使用Test::Steering。它允许我这样做:

include_tests( { jobs => 4 }, @parallel_tests );
include_tests( @serial_tests  );

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

  • 在它真正起作用之前,我目前必须修补代码以修复多年来一直未修补的基本错误。
  • 需要额外的代码来处理生成要运行的并行和串行测试列表。
  • 我实际上并没有得到我真实世界测试的综合总结......两个部分都发出了自己的总结报告,所以它并没有真正起作用。也许我错过了什么,或者它坏了。
于 2012-08-17T18:01:10.043 回答
0

Test::Parallel 还提供了一种更简单的方法来并行运行一些测试查看来自https://metacpan.org/pod/Test::Parallel的示例

于 2013-11-25T16:15:51.547 回答
0

另一种选择:使用TAP::Harness的规则文件。

您可以在 YAML 文件(默认称为 testrules.yml)中构建自定义规则。我需要类似于你描述的东西,我可以用一个看起来像这样的 testrules.yml 文件来做到这一点:

---
    序列:
        # 未准备好并行的测试(将单独运行)
        - 序列:
            -t/test1.t
            - t/test2.t
        # 可以并行运行的测试
        - 标准杆:
            # 其他所有内容的通配符
            - **

就我而言,我将它与直接调用 App::Prove 的代码一起使用,而不是 command-line prove。但我认为它也可以使用prove

于 2015-05-15T21:22:02.100 回答