TAP::Parser::Scheduler - 并行测试期间安排测试
版本 3.44
use TAP::Parser::Scheduler;
new
my $sched = TAP::Parser::Scheduler->new(tests => \@tests);
my $sched = TAP::Parser::Scheduler->new(
tests => [ ['t/test_name.t','Test Description'], ... ],
rules => \%rules,
);
给定 'tests' 和可选的 'rules' 作为输入,返回一个新的 TAP::Parser::Scheduler
对象。@tests
中的每个成员应该是一个测试文件名,或者是一个包含两个元素的数组引用,其中第一个元素是测试文件名,第二个元素是测试描述。默认情况下,我们将使用测试名称作为描述。
可选的 rules
属性提供关于哪些测试应该并行运行以及哪些应该顺序运行的指示。如果未提供规则数据结构,则使用默认数据结构,该结构使每个测试都有资格并行运行。
{ par => '**' },
规则数据结构将在下一节中详细介绍。
“rules
” 数据结构是调度器的核心。它允许您表达简单的规则,例如“按顺序运行所有测试”或“并行运行所有测试,除了这五个测试”。但是,规则结构还支持 glob 样式的模式匹配和递归定义,因此您也可以表达任意复杂的模式。
规则必须只有一个顶级键:要么是 'par' 代表“并行”,要么是 'seq' 代表“顺序”。
值必须是包含可能的 glob 样式匹配的字符串,或者字符串数组引用或哈希引用,它们递归地遵循此模式。
直接位于 'par' 键下的数组引用中的每个元素都有资格并行运行,而直接位于 'seq' 键下的值必须按顺序运行。
以下是一些示例
# All tests be run in parallel (the default rule)
{ par => '**' },
# Run all tests in sequence, except those starting with "p"
{ par => 't/p*.t' },
# Run all tests in parallel, except those starting with "p"
{
seq => [
{ seq => 't/p*.t' },
{ par => '**' },
],
}
# Run some startup tests in sequence, then some parallel tests then some
# teardown tests in sequence.
{
seq => [
{ seq => 't/startup/*.t' },
{ par => ['t/a/*.t','t/b/*.t','t/c/*.t'], }
{ seq => 't/shutdown/*.t' },
],
},
默认情况下,所有测试都有资格并行运行。指定任何您自己的规则都会删除此规则。
“先匹配先赢”。与测试匹配的第一个规则将是适用的规则。
任何不匹配规则的测试都将在运行结束时按顺序运行。
规则的存在并不意味着选择测试。您仍然必须指定要运行的测试。
指定允许测试并行运行的规则不会使运行并行。您仍然需要在 Harness 对象中指定并行 jobs
的数量。
我们实现了我们自己的 glob 样式模式匹配。以下是它支持的模式
** is any number of characters, including /, within a pathname
* is zero or more characters within a filename/directory name
? is exactly one character within a filename/directory name
{foo,bar,baz} is any of foo, bar or baz.
\ is an escape character
get_all
获取所有剩余测试的列表。
get_job
将下一个可用作业作为 TAP::Parser::Scheduler::Job 对象返回,如果不可用则返回 undef
。如果调度器仍然有待处理的作业,但目前没有可运行的作业,则返回 TAP::Parser::Scheduler::Spinner。
as_string
返回一个可读的调度树表示。例如
my @tests = (qw{
t/startup/foo.t
t/shutdown/foo.t
t/a/foo.t t/b/foo.t t/c/foo.t t/d/foo.t
});
my $sched = TAP::Parser::Scheduler->new(
tests => \@tests,
rules => {
seq => [
{ seq => 't/startup/*.t' },
{ par => ['t/a/*.t','t/b/*.t','t/c/*.t'] },
{ seq => 't/shutdown/*.t' },
],
},
);
产生
par:
seq:
par:
seq:
par:
seq:
't/startup/foo.t'
par:
seq:
't/a/foo.t'
seq:
't/b/foo.t'
seq:
't/c/foo.t'
par:
seq:
't/shutdown/foo.t'
't/d/foo.t'