データプロバイダ


私が建てたときSalary Calculator for Germany Laravelを使用して、PHPUnitを使用して単体テストでコードをカバーし始めました.私が計算を信頼することができたので、私がより多くの端ケースをカバーしなければならなかったとき、これは特に便利になりました.私がその時点まで知らなかった特徴の1つはData Providers in PHPUnit .

どのようなデータプロバイダですか?


メソッドまたはクラスのテストを書くとき、同じコードの値を複数のアサーションを書き込みます.データプロバイダは、すべての変更がメソッドに渡される値である場合に便利です.

DataProviders are a framework for easily controlling how data can be provided from a source


データプロバイダなしでテストを書く方法の例を挙げましょう.メソッドがあると仮定しますadd($a, $b) 授業でOperations これは数値を合計して値を返します.
    public function test_add()
    {
        $actual = (new Operations)->add(1, 2);
        $this->assertEquals(3, $actual);
    }

複数のアサーションを追加する場合、次のような別のアサーションを追加するようになります.
    public function test_add()
    {
        $actual = (new Operations)->add(1, 2);
        $this->assertEquals(3, $actual);

        $actual = (new Operations)->add(3, 4);
        $this->assertEquals(7, $actual);
    }

    // Or a test per method
    public function test_add_first()
    {
        $actual = (new Operations)->add(1, 2);
        $this->assertEquals(3, $actual);
    }

    public function test_add_second()
    {
        $actual = (new Operations)->add(3, 4);
        $this->assertEquals(7, $actual);
    }



これらのメソッドは、メソッドのシグネチャが変更された場合や、より多くのケースをカバーする場合にオーバーヘッドを追加します.

PhpUnitでデータプロバイダを使用する方法


データプロバイダは、同じテストの値の複数のセットを渡すことができますこれを簡素化することができます.公式文書から
データプロバイダメソッド
  • に違いないpublic
  • のいずれかを返します.Iterator インターフェースと各反復ステップの配列を生成します.
    <--カードエンド:マークダウン
  • 既存のテストケースをデータプロバイダを使用して変換します.私たちはdataProvider データプロバイダの名前に従って注釈を付けます.
    /**
    * @dataProvider addProvider
    */
    public function test_add($a, $b, $expected)
    {
        $actual = (new Operations)->add($a, $b);
            $this->assertEquals($expected, $actual);
    }
    
    public function addProvider()
    {
        return array(
                array(1, 2, 3),
                array(4, 5, 7),
        );
    }
    
    
    この場合、PHPUnitは配列を取り出し、項目をループ(配列)に渡し、メソッドパラメーターの位置に基づいて引数を渡します.
    最初の項目では、array(1, 2, 3) , 呼び出しtest_add(1, 2, 3) とアサーションを検証します.次のアイテムなど.

    インラインデータプロバイダ


    データプロバイダを使用したテストケースでは、データプロバイダのインライン化によりさらに簡単化できます.使用する注釈はtestWith
    /**
    * @testWith array(
                array(1, 2, 3),
                array(4, 5, 7),
        );
    */
    public function test_add($a, $b, $expected)
    {
        $actual = (new Operations)->add($a, $b);
            $this->assertEquals($expected, $actual);
    }