简而言之一个问题:phpunit在运行test时可以使用多个数据提供程序吗?
例如,我有一个名为getById的方法,我需要为它运行成功和不成功的测试用例。
成功的测试用例意味着它可以返回相应的记录。对于不成功的,输入可以分为两类:无效和失败。
无效表示输入不合法,而失败表示输入有效,但没有相应的记录带有该ID。
所以代码是这样的:
/**
* @dataProvider provideInvalidId
* @dataProvider provideFailedId
*/
public function testGetByIdUnsuccess($id)
{
$this->assertNull($this->model->getById($id));
}
但事实证明,只使用了第一个数据提供者,而忽略了第二个数据提供者。虽然我不确定这种情况是否常见,但这是问题所在。我们可以使用多个数据提供商?如果我们可以,怎么样?
PS:在here
中找不到太多帮助答案 0 :(得分:17)
只是问题的更新,pull request已被接受,现在是代码:
/**
* @dataProvider provideInvalidId
* @dataProvider provideFailedId
*/
public function testGetByIdUnsuccess($id)
{
$this->assertNull($this->model->getById($id));
}
将在PHPUnit 5.7上运行,您可以根据需要添加任意数量的提供程序。
答案 1 :(得分:15)
您可以使用如下所示的辅助函数。唯一的问题是,如果所有“子数据提供者”提供的测试用例总数很大,那么找出导致问题的测试用例可能会很繁琐。
/**
* @dataProvider allIds
*/
public function testGetByIdUnsuccess($id)
{
$this->assertNull($this->model->getById($id));
}
public function allIds()
{
return array_merge(provideInvalidId(),provideFailedId());
}
答案 2 :(得分:3)
您可以向dataProvider数组添加注释,以提供相同的功能,同时不需要多个dataProviders。
public static function DataProvider()
{
return array(
'Invalid Id' => array(123),
'Failed Id' => array(321),
'Id Not Provided' => array(NULL),
);
}
答案 3 :(得分:0)
$dataProvider = array(1, 'unexpected');
然后,你的测试方法如下:
public function testGetById($id) {
$this->assertEquals($result_expected, $obj::getById($id));
}
所以,测试结果是:
.F
答案 4 :(得分:0)
您还可以使用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']]
);
}