内容

名称

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' },
    ],
},

规则解析

规则的 glob 样式模式匹配

我们实现了我们自己的 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'