2014-09-24 36 views
0

我有2個不同的數據提供者,我想使用來自兩個數據提供者的數據爲我的測試用例。phpunit - 如何合併2個數據提供者

我做了一個陣列中的dataProvider部分合併爲

public function provider_data() { 

    $data1 = $this->getData('home_data'); 

    $data2= $this->getData('data2'); 

    $newarray = array_merge($data1, $data2); 

    return $newarray; 
} 

但我看到的是越來越執行我的測試情況下,兩次,我注意到,測試用例實際執行爲每個陣列(數據1和數據2)seperately雖然他們合併了。我在這裏做錯了什麼?我應該如何結合2個數據提供者(無論是數據提供者輸入的數據完全不同的格式)

+0

的[可用於PHPUnit多個數據提供商(https://stackoverflow.com/questions/15125437/can-phpunit-use-multiple-data-provider) – Potherca 2017-09-19 10:19:47

回答

2

你將需要做一些更深入的不僅僅是一個簡單的array_merge。數據提供者提供了一個數組,其中每個條目都是一個單獨的測試用例。每個測試用例都是包含參數的數組。像這樣:

'testCase 1' => array(
    0 => argument 1, 
    1 => argument 2 
), 
'testCase 2' => array(
    0 => argument 1, 
    1 => argument 2 
), 

既然你說你測試運行兩次,每個數據提供者必須只提供一個條目。 array_merge將第二個數據提供程序數組附加到您的第一個數組中,製作兩個測試用例。如果您想每個數據提供商提供的數據結合起來,你將需要做類似如下:

public function provider_data() { 
    $data1 = $this->getData('home_data'); 
    $data2 = $this->getData('data2'); 

    $testCases = array(); 

    foreach ($data1 as $key => $arguments) { 
     $testCases[] = array_merge($arguments, $data2[$key]); 
    } 

    return $testCases; 
} 

這從第二組數據採用的參數,並將其添加到第一個參數。現在,您的測試將收到來自兩個數據提供者的組合參數。

這假定兩個數據數組的長度相同。如果他們不是,你將需要添加一些邏輯來處理這種情況。還要記住參數列表,PHPUnit不會引用用於將參數與變量進行匹配的鍵。它僅基於數組中值的順序。所以要小心你的測試用例中的參數。

+0

由於可能的複製!這真的有幫助! – user3920295 2014-09-24 20:17:14

0

我想我會張貼這個答案,以及試圖合併2個不同長度的數組。我用這個邏輯

$data1 = $this->loadData('data1'); 
    $data2 = $this->loadData('data2'); 
    $newarray = array(); 
    foreach($data1 as $key1 => $value1){ 
     foreach ($data2 as $key2 => $value2) { 
      $newarray[] = array_merge($value2, $data1[$key1]); 
     } 
    } 
return $newarray;