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

vas*_*sin 14 php phpunit

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

phpunit -–no-configuration -–filter testAdd DataTest DataProviderTest.php
Run Code Online (Sandbox Code Playgroud)

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

phpunit -–no-configuration -–filter /::testAdd$/ DataTest DataProviderTest.php
Run Code Online (Sandbox Code Playgroud)

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

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

?>
Run Code Online (Sandbox Code Playgroud)

Dav*_*ess 13

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

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

例如

phpunit --filter "/::testAdd( with data set .*)?$/" DataTest DataProviderTest.php
Run Code Online (Sandbox Code Playgroud)

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

phpunit --filter "/::testAdd( .*)?$/" DataTest DataProviderTest.php
Run Code Online (Sandbox Code Playgroud)

  • 很好的例子!请注意,数据集编号也可能是一个字符串(在数据集中使用数组键命名为dataproviders),因此\ d +可能无法捕获所有内容.但是`phpunit --filter"/ :: test.+(数据集#.+)?$ /"`或者某种东西是一种非常酷的方式来运行数据提供者的所有测试;) (2认同)

edo*_*ian 7

就像@sjoerd指出的那样,匹配的名称包含数据集的编号.

这意味着这有效:

phpunit --filter "testAdd with data set #0" DataTest DataProviderTest.php
Run Code Online (Sandbox Code Playgroud)

对你的文件产生:

PHPUnit 3.7.0RC1 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 5.25Mb

OK (1 test, 1 assertion)
Run Code Online (Sandbox Code Playgroud)

在PHPUnit 3.5及更高版本中测试过.


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

跟踪问题的更好的语法 phpunit github issue tracker


Sjo*_*erd 1

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

DataTest::testAdd with data set #0
DataTest::testAdd with data set #1
...
Run Code Online (Sandbox Code Playgroud)

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