2013-02-28 35 views
22

一个问题简而言之:phpunit在运行测试时可以使用多个数据提供者吗?phpunit可以使用多个数据提供者

例如,我有一个名为getById的方法,我需要为它运行成功和失败的测试用例。

成功的测试用例意味着它可以返回相应的记录。如果不成功,输入可能分为两类:无效和失败。

无效表示输入不合法,失败则表示输入可能有效,但没有与该ID对应的记录。

因此,代码是这样的:

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

但事实证明,只有第一个数据提供者已被使用,忽略了第二个。虽然我不确定这个塞纳里奥是否常见,但这是一个问题。我们能否使用多个数据提供者?如果可以的话,怎么样?

PS:在here

+0

我处于类似的情况,其中单独的dataProviders会使代码更具可读性(通过提供给他们的数据来记录代码和测试用例)。我想知道最佳做法是什么? – Pitt 2016-04-13 04:31:55

回答

2

没有发现太多的帮助,您可以添加评论到您的数据提供程序阵列,提供相同的功能,而不是需要多次的dataProvider。

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

您可以使用如下所示的帮助函数。唯一的问题是,如果所有“子数据提供者”提供的测试用例总数很大,那么确定哪个测试用例会引起问题可能非常繁琐。

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

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

好了,你可以从另一个侧面考虑它;) 你确切地知道什么是你的预期,例如getById(1)预期的结果是$ result_expected,而不是$ result_null 所以,你可以做一个数据提供器这样

$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工作,你就可以作为你想添加尽可能多的提供者。

相关问题