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' },
],
},
預設情況下,所有測試都有資格平行執行。指定任何您自己的規則會移除此規則。
「第一個匹配獲勝」。第一個與測試匹配的規則會是套用的規則。
任何與規則不匹配的測試會在執行結束時按順序執行。
規則的存在並不表示會選擇測試。您仍必須指定要執行的測試。
指定允許測試平行執行的規則並不會使執行平行化。您仍需要在您的 Harness 物件中指定平行 工作
的數量。
我們實作了我們自己的 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'