2013-02-28 48 views
22

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

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

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

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

ので、コードは次のようになります:

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

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

PS:複数のDataProviderを必要としない間は、同じ機能を提供するために、あなたのdataProvider配列にコメントを追加することができますhere

+0

別のdataProvidersを使用すると、コードを読みやすくしているような状況になります(コードとテストケースが提供されたデータによってドキュメント化されている)。私は何がベストプラクティスになるのだろうか? – Pitt

答えて

2

にあまりにも多くの助けを見つけることができませんでした。

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

以下に示すようにヘルパー機能を使用できます。唯一の問題は、すべての "サブデータプロバイダ"によって提供されるテストケースの総数が多い場合、どのテストケースが問題を引き起こしているかを知るのが面倒なことです。あなたがデータプロバイダを作ることができる、あなたがそうgetById(1)期待される結果は$ result_expectedした例はなく、$ result_null のために、あなたの期待されている内容を正確に把握 );

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

public function allIds() 
{ 
    return array_merge(provideInvalidId(),provideFailedId()); 
} 
0

だけでなく、あなたは別の側面から、それを検討することもできこの

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

のように、このようなあなたの試験方法は:

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

ので、テスト結果は次のとおりです。

.F 
11

の質問にだけ更新は、pull requestが受け入れられ、今コード:

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

はPHPUnitの5.7上で動作しますが、あなたが望む限り多くのプロバイダを追加することができます。

関連する問題