はじめに

PHPUnitのデータプロバイダとは
アサーションを何度も書く必要がなくなる便利なアノテーションのこと。
PHPUnit マニュアル – 第2章 PHPUnit 用のテストの書き方

ジェネレータ関数とは
ジェネレータ関数は一度だけ値を返すのではなく、
必要に応じて何度でも値を変えて返すことができる便利な関数のこと。
PHP: ジェネレータの構文 - Manual

使い方を簡単な計算式のテストで比較

目次へ戻る

データプロバイダを使わない書き方

//引き算を行うファンクション
function sub($a, $b) {
    return $a - $b;
}

//テストファンクション
public function testSub()
{
        //テストデータの配列
    $patterns = [
        [1, 2, 1],
        [2, 3, 1],
        [5, 8, 3],
    ];

    foreach ($patterns as list($expected, $a, $b)) {
        $this->assertEquals($expected, sub($a, $b));
    }
}

メリット:
・ソースコードが短くかける
デメリット:
・どこでテストが落ちたかわかりにくい

目次へ戻る

データプロバイダのみの書き方

//引き算を行うファンクション
function sub($a, $b) {
    return $a - $b;
}

/**
 * @dataProvider provideSubitionTestParams
 * テストファンクション
 */
public function testSub($expected, $a, $b)
{
    $this->assertEquals($expected, sub($a, $b));
}

//テストデータを渡すデータプロバイダ用のファンクション
public function provideSubitionTestParams()
{
    return [
        [1, 2, 1],
        [2, 3, 1],
        [5, 8, 3],
    ];
}

メリット:
・どこで落ちたかわかりやすい
・setUp/tearDownが有効活用できる
→データプロバイダで記述すると、それぞれが1つのテスト扱いになるため、毎回setUp/tearDownが実行されます。
デメリット:
・ソースコードが長くなる

目次へ戻る

データプロバイダとジェネレータ関数を組み合わせた書き方

//引き算を行うファンクション
function sub($a, $b) {
    return $a - $b;
}

/**
 * @dataProvider provideSubitionTestParams
 * テストファンクション
 */
public function testSub($expected, $a, $b)
{
    $this->assertEquals($expected, sub($a, $b));
}

//テストデータを渡すデータプロバイダ用のファンクション
public function provideSubitionTestParams()
{
        //ジェネレータ関数でテストデータを定義
    yield "テストケース1" => [1, 2, 1];
    yield "テストケース2" => [2, 3, 1];
    yield "テストケース3" => [5, 8, 3];
}

メリット:
・どこで落ちたかわかりやすい
・setUp/tearDownが有効活用できる
→データプロバイダで記述すると、それぞれが1つのテスト扱いになるため、毎回setUp/tearDownが実行されます。
・メモリの節約になる
デメリット:
・ソースコードが長くなる

目次へ戻る

さいごに

データプロバイダとジェネレータ関数を組み合わせたことにより、
網羅的にかつ、大量のアサーションを書かずに可読性の高いテストコードがかけます。
自分なりにデータプロバイダを駆使して、
もっといい感じにテストしていきたい・・・

目次へ戻る

参考URL

PHPUnitとデータプロバイダとテストケース生成

この記事をシェアする:
東日本橋の制作・開発会社 プレスマンのスタッフブログ