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

无法使用PHPUnit中的数据提供程序运行单个测试,php,phpunit,Php,Phpunit,我在使用命令行运行测试时遇到了一个问题:如果我像这样运行phpunit: phpunit -–no-configuration -–filter testAdd DataTest DataProviderTest.php 它很好用。 但我们使用正则表达式精确指定要测试的方法的名称: phpunit -–no-configuration -–filter /::testAdd$/ DataTest DataProviderTest.php 不幸的是,第二种方法不起作用。 源代码是: <?

我在使用命令行运行测试时遇到了一个问题:如果我像这样运行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)
        );
    }
}

?>

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

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

因此,您的regex
testAdd$
自然无法工作。

Like@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 --filter "/::<method>( with data set .*)?$/" <class> <file>
由于测试方法的名称中没有空格,除非它有一个数据集,所以您可以将其缩小到

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

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

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

致命错误:“preg_match():编译失败:丢失)偏移量处

这是通过将空格替换为\s来解决的。引号也需要删除(否则\需要删除)


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

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

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

$phpunit--filter“dataset name 2”

很好的示例!请注意,数据集编号也可能是字符串(使用数据集中的数组键命名数据提供程序),因此\d+可能无法捕获所有内容。但是
phpunit--filter”/::test.+(使用数据集#.+)$/“
或其他一些东西是使用数据提供程序运行所有测试的一种非常酷的方式;)@伊多莉安-好电话。我把它改为
*
,以捕获任何数据集。我认为
--filter
的新语法更容易链接到当前文档:您不必自己猜测或构造测试名称。只需运行一次所有数据集,然后从测试输出(以及转义regexp特殊字符!)复制所需名称的粘贴(唯一的子字符串)。示例:“测试'Drupal\Tests\migrate\Drupal\Kernel\Plugin\migrate\source\ContentEntityTest::testNodeSource with data set“include\u translations=1&include\u revisions=1&revisions\u bc\u mode=1”(数组(true,true,true))已启动”您错过了正则表达式周围的引号,将其视为命令行上的单个参数。@TomášVotruba我希望能够运行单个测试并使我的测试清晰,但不要太冗长。您可以通过搜索“phpunit数据提供者收益率”找到更多示例。
phpunit --filter /::testAdd(\s.*)?$/ DataTest DataProviderTest.php
public function provideData()
{
    yield "dataset name 1" => [
        $expected = 0,
        $val1 = 1,
        $val2 = 2
    ];

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