phpunit - 如何合并2个数据提供者

时间:2014-09-24 19:36:02

标签: php phpunit

我有两个不同的数据提供者,我想使用两个数据提供者的数据作为我的测试用例。

我在dataProviders部分做了一个数组合并

  public function provider_data() {

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

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

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

    return $newarray;
}

但是我看到我的测试用例正在执行两次,我注意到测试用例实际上是针对每个数组(Data1和Data2)分别执行的,但它们是合并的。我在这做错了什么?我应该如何组合2个数据提供者(两个数据提供者都有完全不同的输入数据格式)

2 个答案:

答案 0 :(得分: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不会引用用于将参数与变量匹配的键。它仅基于数组中值的顺序。因此,请谨慎使用测试用例中的参数。

答案 1 :(得分:0)

我想我会发布这个答案,试图合并两个不同长度的数组。我用过这个逻辑

    $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;