gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:40:54 25 4
gpt4 key购买 nike

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

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

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

  1. prove could be patched to support some tests as not-parallel-ready
  2. Jenkins 用于管理测试套件的运行。我可以将非并行测试拆分成它们自己的运行。换句话说,放弃并使用两个测试运行。
  3. 也许有一种方法可以将我尚未恢复的两个 TAP 结果流合并在一起。

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

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

最佳答案

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

...This is useful, for example, in the case where some tests should run in parallel but others are unsuitable for parallel execution.

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(),这是上面的新功能可以合并的地方。
  • Fork prove 以便它调用 My::App::Prove 而不是 App::Prove

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

2012 年 8 月 16 日更新:我现在有一个用于prove 的补丁,并已提交以供审核。你可以view and comment on the Pull Request .运行输出后不生成摘要。目前还不清楚为什么。

关于perl - 如何在 Perl 测试套件中并行运行一些但不是所有测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11977015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com