4

Test::Moreとを使って大きなテストを書きましたTest::Deep。テストにはサブテストが含まれています。コードを実行すると、最後の行で次のようになります。

# Looks like you failed 3 tests of 25.

失敗したサブテストを指定する要約を印刷するにはどうすればよいですか?(各サブテストにはタイトルがあります。)

4

1 に答える 1

7

簡単な答え: できません。

少し長い答え: Test::BuilderまたはTAP::Harnessにパッチを適用する必要があります。

ハッキーな答え: 名前と結果を取得する subtest 関数の周りにラッパーを配置し (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 自身のサブテスト関数をガイドとして使用するサブテストのラッパーは、次のようになります。

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 を置き換えることができます。関数の本体は同じように見えますが、Perl 関数を置き換える手法は別の問題です。

于 2013-01-13T00:34:55.197 に答える