エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【phpunit】同じテストコードをコピペしない工夫、dataProvider【423日目】

コピペでテスト書いてませんか

よくあるのが、入力を変えると、結果が変わるというテスト。

元コード

function testFunc($data)
{
....
}

テストコード

function testFunc_いろいろ返ってくる()
{
    $data = true;
    $expected = [1,2,3],

    .....


    $this->assertSame($expected, $result);
}


function testFunc_空っぽ()
{
    $data = false;
    $expected = [],

    .....


    $this->assertSame($expected, $result);
}

他コピペでdataとexpectedを変えていく・・・

こういうのもったいない。

入力と結果を関数で渡すdataProvider

こんなときに、$dataや$expectedを関数で渡してみよう

/**
  * @test
  * @dataProvider testDataProvider
  */
function testFunc($data, $expected)
{
    .....


    $this->assertSame($expected, $result);
}


function testDataProvider()
{
    return [
        'いろいろ返ってくる' => [
            'data' => true,
            'expected' => [1,2,3]
        ],
        '空っぽ' => [
            'data' => false,
            'expected' => []
        ]
    ];
}

何してるの?

テストのコメント欄に、 @dataProviderと関数名を書くと、
引数に値を入れることが出来る。

testDataProviderで配列を渡してやると、それをいい感じにテストしてくれる。
この場合、dataがtrueのときと、falseのときのテストが動く。

それぞれexpectedには、対応するdataが使われるので、見やすい!そしてコピペいらず!

ちなみに、キーに'空っぽ'とか日本語入れてますが、エラーが出たら、このキー名が表示されます。

めっちゃわかりやすい・・・!

参考になりそうなコード

github.com

クリックしたら、該当のコードに移ります。

ぜひdataProvider使って、コピペ減らして見やすいテストコードを!