web-dev-qa-db-ja.com

phpunitは複数のデータプロバイダーを使用できますか

要するに1つの質問:phpunitはテストを実行するときに複数のデータプロバイダーを使用できますか?

たとえば、getByIdというメソッドがあり、成功したテストケースと失敗したテストケースの両方を実行する必要があります。

テストケースが成功すると、対応するレコードを返すことができます。また、失敗した場合、入力は無効と失敗の2つのカテゴリに分類されます。

無効は入力が正当ではないことを意味し、失敗は入力が有効である可能性があることを意味しますが、そのIDを持つ対応するレコードはありません。

したがって、コードは次のようになります。

/** 
 * @dataProvider provideInvalidId
 * @dataProvider provideFailedId
 */
public function testGetByIdUnsuccess($id)
{   
    $this->assertNull($this->model->getById($id));
}   

しかし、2番目のデータプロバイダーを無視して、最初のデータプロバイダーのみが使用されていることが判明しました。このシナリオが一般的かどうかはわかりませんが、ここに質問があります。複数のデータプロバイダーを使用できますか?そして、可能であれば、どのように?

PS: ここ であまり助けを見つけられませんでした

32
imcoddy

質問の更新だけで、 プルリクエスト が受け入れられ、コードは次のようになりました。

/** 
 * @dataProvider provideInvalidId
 * @dataProvider provideFailedId
 */
public function testGetByIdUnsuccess($id)
{   
    $this->assertNull($this->model->getById($id));
}

PHPUnit 5.7で動作し、必要な数のプロバイダーを追加できます。

20

以下に示すヘルパー関数を使用できます。唯一の問題は、すべての「サブデータプロバイダー」によって提供されるテストケースの総数が多い場合、どのテストケースが問題を引き起こしているのかを特定するのが面倒になる可能性があることです。

/** 
 * @dataProvider allIds
 */
public function testGetByIdUnsuccess($id)
{   
    $this->assertNull($this->model->getById($id));
}  

public function allIds()
{
    return array_merge(provideInvalidId(),provideFailedId());
}
15
Dwayne Towell

複数のdataProviderを必要とせずに、同じ機能を提供するために、dataProvider配列にコメントを追加できます。

public static function DataProvider()
{
    return array(
        'Invalid Id'      => array(123),
        'Failed Id'       => array(321),
        'Id Not Provided' => array(NULL),
);
}
3
Steven Scott

CrossDataProviders を使用することもできます。これにより、データプロバイダーを相互に組み合わせて使用​​できます。

<?php

/** 
 * @dataProvider provideInvalidIdAndValues
 */
public function testGetByIdUnsuccess($id, $value)
{   
    $this->assertNull($this->model->getById($id));
}   

function provideInvalidIdAndValues() {
    return DataProviders::cross(
        [[1], [2], [3]],
        [['Rob'], ['John'], ['Dennis']]
    );
}
0
Danon

まあ、あなたはそれを別の側面から考えることができます;)あなたはあなたが期待するものを正確に知っています、例えばgetById(1)期待される結果は$ result_nullではなく$ result_expectedなので、あなたはこのようなデータプロバイダーを作ることができます

$dataProvider = array(1, 'unexpected');

次に、次のようなテスト方法:

public function testGetById($id) {
    $this->assertEquals($result_expected, $obj::getById($id));
}

したがって、テスト結果は次のとおりです。

.F
0
user1802365