2013-01-12 65 views
3

我用Test::MoreTest::Deep寫了一個大測試。 該測試包含子測試。 當我運行的代碼,在最後一行我得到:使用Test :: More和Test :: Deep打印失敗的子測試

# Looks like you failed 3 tests of 25. 

如何打印指定失敗的子測試的總結? (每個子測試都有一個標題。)

+0

請包括一些代碼,因爲答案取決於你做了什麼。 –

+2

'prove -v ...' –

+0

用'perl test.t'而不是'prove'運行它們。 – simbabque

回答

6

簡答:你不能。

稍微長一點的答案:您必須補丁Test::BuilderTAP::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函數的技術是另一個問題的主題。

+0

謝謝! 我沒有設法使用測試::生成器並正確包裝子測試..你能幫我一些例子嗎? – user1836185

+0

更新了一個例子。 – Schwern

相關問題