我用Test::More
和Test::Deep
寫了一個大測試。 該測試包含子測試。 當我運行的代碼,在最後一行我得到:使用Test :: More和Test :: Deep打印失敗的子測試
# Looks like you failed 3 tests of 25.
如何打印指定失敗的子測試的總結? (每個子測試都有一個標題。)
我用Test::More
和Test::Deep
寫了一個大測試。 該測試包含子測試。 當我運行的代碼,在最後一行我得到:使用Test :: More和Test :: Deep打印失敗的子測試
# Looks like you failed 3 tests of 25.
如何打印指定失敗的子測試的總結? (每個子測試都有一個標題。)
簡答:你不能。
稍微長一點的答案:您必須補丁Test::Builder或TAP::Harness。
Hacky回答:在子測試函數中包含名稱和結果(subtest(),與所有測試函數類似,在傳遞時返回true,在失敗時返回false),並在END塊中輸出額外的摘要信息。實施留給讀者。
TL; DR信息...
Test::Builder(從而對整個生態系統測試)不報告在摘要測驗。我不相信Test :: Builder的發佈版本(0.9x)存儲了子測試的結果。在Test :: Builder 0.9x中,子測試是一種可怕的黑客攻擊。 Test :: Builder 1.5可以更精美地處理子測試,所以如果你想做一個補丁,我會對1.5測試。
TAP::Harness(並因此證明)不瞭解子測試,就其涉及的垃圾而言被忽略。爲了解決這個問題,每個子測試都會在Test :: Harness所能理解的最後產生一個額外的測試。
# TAP::Harness sees this line, the overall plan.
1..1
# All this indented subtest info is ignored by TAP::Harness.
ok 1
ok 2
not ok 3
1..3
# Looks like you failed 1 test of 3.
# TAP::Harness sees this line, and that all it knows about the subtest
# It doesn't even know its a subtest.
not ok 1 - foo
TAP::Harness將需要修補理解測驗,這將是非常歡迎的。
各地分測驗的包裝紙,使用Test::More's own subtest function爲指導,應該是這樣的:
use Test::Builder;
my @Failed_Subtests;
sub my_subtest {
my $name = shift;
# Call subtest
my $tb = Test::Builder->new;
my $subtest_ok = $tb->subtest($name, @_);
# Record the name of any failing subtests
push @Failed_Subtests, $name if !$subtest_ok;
return $subtest_ok;
}
# When the test is over, show the failed subtests
END {
if(@Failed_Subtests) {
diag sprintf "These subtests failed: %s", join(", ", @Failed_Subtests);
}
}
如果您使用的my_subtest
代替subtest
你會得到這樣的:
# These subtests failed: bar, baz
# Looks like you failed 2 tests of 3.
相反定義一個新的子測試函數,你可以替換Test :: More's。函數的主體看起來是一樣的,但是替換Perl函數的技術是另一個問題的主題。
謝謝! 我沒有設法使用測試::生成器並正確包裝子測試..你能幫我一些例子嗎? – user1836185
更新了一個例子。 – Schwern
請包括一些代碼,因爲答案取決於你做了什麼。 –
'prove -v ...' –
用'perl test.t'而不是'prove'運行它們。 – simbabque