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

16

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

16

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

phpunit --filter "/::<method>( with data set .*)?$/" <class> <file>
例如。
phpunit --filter "/::testAdd( with data set .*)?$/" DataTest DataProviderTest.php

由于测试方法名称中不会包含空格,除非它有数据集,因此您可以真正将其缩小到

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

2
不错的例子!请注意,数据集编号也可能是字符串(使用数据集中的数组键命名为dataproviders),因此\d+可能无法捕获所有内容。但是,phpunit --filter "/::test.+( with data set #.+)?$/"或类似的方式非常酷,可以运行所有带有数据提供程序的测试 ;) - edorian
@edorian - 好主意。我把它改成了.*以捕获任何数据集。 - David Harkness
我认为--filter的新语法更加简单易懂。https://phpunit.de/manual/current/en/textui.html#textui.examples.filter-patterns - martin
当前文档链接:https://phpunit.readthedocs.io/en/stable/textui.html#textui-examples-filter-patterns - geek-merlin
您无需猜测或构建测试名称。只需运行所有数据集一次,然后从测试输出中复制粘贴(一个唯一的子字符串)您想要的名称(并转义正则表达式特殊字符!)。例如:“Test 'Drupal\Tests\migrate_drupal\Kernel\Plugin\migrate\source\ContentEntityTest::testNodeSource with data set "include_translations=1&include_revisions=1&revisions_bc_mode=1" (array(true, true, true))' started”。 - geek-merlin

7
提出的问题是匹配的名称包含数据集的编号。 这意味着以下内容是有效的:
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)

在PHPUnit3.5及以上版本进行了测试。


现在它并不是很美观,而且在PHPUnit内部拥有另一种语法肯定更加可取,但现在它可能会解决你的问题,并且一旦有人发送PR,就会更加好用;)

phpunit github issue tracker上的跟踪问题有关更好的语法。


4
通过使用具有命名数据集的数据提供程序,现在更简单了:
public function provideData()
{
    yield "dataset name 1" => [
        $expected = 0,
        $val1 = 1,
        $val2 = 2
    ];

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

$ phpunit --filter "数据集名称2"


1
@TomášVotruba 我想能够运行单个测试并使我的测试清晰但不过于冗长。您可以通过搜索“phpunit数据提供程序yield”来找到更多示例。 - Aurel

2
答案中的正则表达式似乎不再起作用(至少在4.0.12中不起作用)。
看起来,--filter 不喜欢空格,并会显示以下错误:
致命错误:“preg_match(): Compilation failed: missing ) at offset”
将空格替换为 \s 可以解决此问题。引号也需要被删除(否则需将 \ 改为 \)
phpunit --filter /::testAdd(\s.*)?$/ DataTest DataProviderTest.php

你忘了在正则表达式周围加引号,以便将其作为命令行上的单个参数处理。 - David Harkness

1
在这种情况下,正则表达式将与以下字符串匹配:
DataTest::testAdd with data set #0
DataTest::testAdd with data set #1
...

所以自然而然,你的正则表达式 testAdd$ 不会起作用。


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