目錄

名稱

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,
);

給定「測試」和選擇性的「規則」作為輸入,傳回新的 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 物件,或在沒有可用的工作時傳回 未定義。如果排程器仍有待處理的工作,但目前沒有可用的工作,則傳回 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'