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)
        );
    }
}

?>
4

5 回答 5

15

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

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

例如

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

由于除非有数据集,否则测试方法的名称中不会有空格,因此您可以将其缩小为

phpunit --filter "/::testAdd( .*)?$/" DataTest DataProviderTest.php
于 2012-08-30T17:37:11.533 回答
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

于 2012-08-30T13:52:12.097 回答
3

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

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

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

$ phpunit --filter "dataset name 2"

于 2019-03-20T10:43:20.880 回答
2

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

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

致命错误:“preg_match(): Compilation failed: missing ) at offset

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

phpunit --filter /::testAdd(\s.*)?$/ DataTest DataProviderTest.php
于 2015-10-22T18:23:02.293 回答
1

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

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

所以自然你的正则表达式testAdd$不会工作。

于 2012-08-30T10:42:41.530 回答