无法在PHPUnit中使用数据提供程序运行单个测试

时间:2012-08-30 09:16:50

标签: php phpunit

使用命令行运行测试时遇到问题:如果我像这样运行phpunit:

phpunit -–no-configuration -–filter testAdd DataTest DataProviderTest.php

它工作正常。 但是我们使用正则表达式来准确指定我们想要测试的方法的名称:

phpunit -–no-configuration -–filter /::testAdd$/ DataTest DataProviderTest.php

不幸的是,第二种方法不起作用。 源代码是:

<?php
class DataTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     */
    public function testAdd($a, $b, $c)
    {
        $this->assertEquals($c, $a + $b);
    }

    public function provider()
    {
        return array(
          array(0, 0, 0),
          array(0, 1, 1),
          array(1, 0, 1),
          array(1, 1, 3)
        );
    }
}

?>

5 个答案:

答案 0 :(得分:13)

使用或不使用数据集处理测试的正则表达式是

phpunit --filter "/::<method>( with data set .*)?$/" <class> <file>

例如

phpunit --filter "/::testAdd( with data set .*)?$/" DataTest DataProviderTest.php

由于测试方法名称中没有空格,除非它有数据集,否则你可以将其缩小为

phpunit --filter "/::testAdd( .*)?$/" DataTest DataProviderTest.php

答案 1 :(得分:7)

与@sjoerd一样,指出匹配的名称包含数据集的编号。

这意味着这有效:

phpunit --filter "testAdd with data set #0" DataTest DataProviderTest.php

针对您的文件生成:

PHPUnit 3.7.0RC1 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 5.25Mb

OK (1 test, 1 assertion)

在PHPUnit 3.5及更高版本中测试。


它不是很漂亮,在PHPUnit中有另一种语法是绝对可取的,但现在它可以解决你的问题,一旦有人发送PR,它将更好用;)

跟踪phpunit github issue tracker

上更好语法的问题

答案 2 :(得分:2)

答案中的正则表达式似乎不再起作用(至少在4.0.12中不行)。

看起来--filter不喜欢这个空格,并给出以下错误:

致命错误:&#34; preg_match():编译失败:丢失)偏移量

通过用\ s替换空格来解决这个问题。引号也需要删除(否则\需要是\)

phpunit --filter /::testAdd(\s.*)?$/ DataTest DataProviderTest.php

答案 3 :(得分:1)

在这种情况下,正则表达式与以下字符串匹配:

DataTest::testAdd with data set #0
DataTest::testAdd with data set #1
...

很自然地,你的正则表达式testAdd$将不起作用。

答案 4 :(得分:0)

通过使用具有命名数据集的数据提供程序,现在变得更简单:

public function provideData()
{
    yield "dataset name 1" => [
        $expected = 0,
        $val1 = 1,
        $val2 = 2
    ];

    yield "dataset name 2" => [...];
}

$ phpunit --filter "dataset name 2"

相关问题