PHPUnitで複数のアサーションを実行して最後に失敗があったか確認する

投稿日:

題目の通りなのですが、PHPUnitで複数のアサーションを実行して最後に失敗があったか確認する方法をメモしておきます。

本来(なるべく)なら1テスト1アサーションがいいのでしょうけど、とりあえず簡単なアサーションをざぁーーーっと流して最後に失敗したものだけを確認したいこともあるのではないのでしょうか。

そんな要求を満たすには以下の方法もあるのではないかという話です。
※すいません、これ以外やったことありませn

方法

以下の例外をキャッチする。

\PHPUnit_Framework_ExpectationFailedException

はい、これだけです。

PHPUnitでテストに失敗した時、内部では上記の例外をキャッチしてゴニョゴニョしているようです。(多分)
なので、一旦上記の例外を先にキャッチしてしまいます。

サンプル

簡単なサンプルは以下の通りです。
※エラーメッセージはjsonにしなくてもいいのですが

public function testSometing()
{
    $error = [];

    // 何かしらの繰り返し
    for($i = 1; $i <= 3; $i++) {

        try {
            $this->assertEquals($i, 2);
        } catch(\PHPUnit_Framework_ExpectationFailedException $e) {
            $error[$i . '番目で死んだ...'][] = $e->getMessage();
        }

    }

    if (count($error) > 0) {
        $this->fail(json_encode(['fail' => $error], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
    }
}

こんなエラーメッセージ

1) SampleTest::testSometing
{
    "fail": {
        "1番目で死んだ...": [
            "Failed asserting that 2 matches expected 1."
        ],
        "3番目で死んだ...": [
            "Failed asserting that 2 matches expected 3."
        ]
    }
}

他にも方法はあるのでしょうけど、とりあえず自分はこういっためんどくさいテストがあった場合ざっとこんな感じで流して確認しています。
(そして余力があれば後でリファクタリングをするみたいな)

現場からは以上です。

作成者: shimabox

Web系のプログラマをやっています。 なるべく楽しく生きていきたい。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください