phpunit可以使用多个数据提供程序

imc*_*ddy 28 php tdd phpunit unit-testing

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

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

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

无效意味着输入不合法,而失败意味着输入可能有效,但没有相应的记录与该ID.

所以代码是这样的:

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

但事实证明,只使用了第一个数据提供者,而忽略了第二个数据提供者.虽然我不确定这种情况是否常见,但这是问题所在.我们可以使用多个数据提供商?如果我们可以,怎么样?

PS:在这里找不到太多帮助

Ale*_*ela 21

只是问题的更新,拉取请求被接受,现在代码:

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

将在PHPUnit 5.7上运行,您将能够根据需要添加任意数量的提供程序.

  • 一个问题:我有非常通用的测试用例名称。如果您提供名称,则必须确保它们在您的提供程序中是唯一的,否则只会执行具有该名称的最后一个测试用例。 (2认同)

Dwa*_*ell 15

您可以使用辅助函数,如下所示.唯一的问题是,如果所有"子数据提供者"提供的测试用例总数很大,那么找出导致问题的测试用例可能会很繁琐.

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

public function allIds()
{
    return array_merge(provideInvalidId(),provideFailedId());
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*non 6

您还可以使用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']]
    );
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ott 4

您可以向 dataProvider 数组添加注释,以提供相同的功能,同时不需要多个 dataProvider。

public static function DataProvider()
{
    return array(
        'Invalid Id'      => array(123),
        'Failed Id'       => array(321),
        'Id Not Provided' => array(NULL),
);
}
Run Code Online (Sandbox Code Playgroud)