使用命令行运行测试时遇到问题:如果我像这样运行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)
);
}
}
?>
答案 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,它将更好用;)
上更好语法的问题答案 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"