如何向phpunit测试方法传递数据?

3

我正在编写phpunit测试用例方法,该方法接受一个参数。

我的代码如下:

class myTestCase extends PHPUnit_Framework_TestCase
{
    public function testMyCase($date){

        $resultSet=$this->query("select * from testCase where date='$date'");
        $this->assertTrue($resultSet,True);
    }
}

我正在尝试从Linux终端运行上述测试用例。
phpunit --filter testMyCase myTestCase.php

但是不知道如何传递参数。请帮忙。
谢谢。

看起来不可能。检查一下这个答案,或许能在某种程度上帮到你:https://stackoverflow.com/a/32467538/2270041 - Matteo
assertTrue() 的第二个参数应该是一个 string,请参见 https://github.com/sebastianbergmann/phpunit/blob/6.3.0/src/Framework/Assert.php#L1148-L1151。 - localheinz
请参阅 https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers。 - localheinz
3个回答

4
首先,您应该使用最新版本的PHPUnit(v6.x)。存在PHPUnit_Framework_TestCase让人觉得您正在使用较旧的版本。但我离题了......
您需要一个数据提供程序。
class myTestCase extends PHPUnit_Framework_TestCase
{
    /**
    * @dataProvider providerTestMyCase
    **/

    public function testMyCase($date, $expectedRowCount) {

        $sql  = "select * from testCase where date = '$date'";
        $stmt = self::$pdo->prepare($sql);
        $result = $stmt->execute($sql);

        //We expect the query will always work.
        $this->assertTrue($result);

        //We are expecting the rowcount will be consistent with the expected rowcounts.
        $this->assertSame($expectedRowCount,$stmt->rowCount());
    }

    public funtion providerTestMyCase() {
        return [ [ '2017-08-01' , 76 ]
               , [ '2017-08-02' , 63 ]
               , [ '2017-08-03' , 49 ]
               , [ '2017-08-04' , 31 ]
               , [ '2017-08-05' , 95 ]
               ]
    }
}

请反复阅读:数据库测试 以及 @dataProvider


建议使用最新版本的 phpunit/phpunit 是可以的,但也许有理由不能使用最新版本:phpunit/phpunit:^6 需要 php: ^7.0,但是该项目可能需要的版本不能满足此要求。 - localheinz
5.6版本已于6个月前停止了活动支持当前的最佳实践是使用7.x版本。如果您正在编写新代码,它应该是7.0兼容的,否则您将会遇到一些问题。7更快,更安全(自7.2开始使用libsodium),PHPUnit <6.0不再受支持。继续使用5.6只会在他们的项目中增加技术债务。只有在没有其他选择的情况下才可以继续使用5.6。 - DrDamnit
我知道,但是:我一直在为数百万美元的大型遗留项目工作,最初没有任何测试覆盖率,并且无法直接切换到PHP7。尽管升级可能带来潜在的好处,但有很多原因目前还不可能实现。 - localheinz

0

也许你并不需要它。

class myTestCase extends PHPUnit_Framework_TestCase
{
    public function testMyCases()
    {
        $dates = [
            '2017-01-01 00:00:00',
            '2017-08-03 15:00:00'
        ];

        foreach ($dates as $date) {
            $resultSet = $this->query("select * from testCase where date='$date'");
            $this->assertTrue($resultSet, true);
        }

    }
}

3
最好使用@dataProvider,但这个想法是正确的——所有经过测试的排列组合都应该在测试用例中进行记录。 - Alex Blex

-1

你的测试方法依赖于$date。你可以给它一个数据提供者(如前面的答案中所述),或者让它依赖于另一个返回日期的测试方法。

...

function testDateDependency()
{
    $date = '...';
    $this->assertInternalType('string', $date, 'dependency check');

    return $date;
}

/**
 * @depends testDateDependency
 */
function testMyCase($date) {

    ...

这是我所知道的两个选项(第二个是数据提供程序,可能更优越,因为您可以更轻松地提供更多不同的依赖值)。PHPUnit文档可能会显示更多选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接