Не удается выполнить одиночный тест с поставщиком данных в PHPUnit
У меня возникла проблема при использовании командной строки для запуска тестов: если я запустил 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)
);
}
}
?>
Ответы
Ответ 1
Регулярное выражение для обработки тестов с или без наборов данных
phpunit --filter "/::<method>( with data set .*)?$/" <class> <file>
Например
phpunit --filter "/::testAdd( with data set .*)?$/" DataTest DataProviderTest.php
Поскольку у тестового метода не будет пробела в имени, если у него нет набора данных, вы действительно можете уменьшить его до
phpunit --filter "/::testAdd( .*)?$/" DataTest DataProviderTest.php
Ответ 2
Как и @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
Ответ 3
В этом случае регулярное выражение сопоставляется со следующей строкой:
DataTest::testAdd with data set #0
DataTest::testAdd with data set #1
...
Итак, ваше регулярное выражение testAdd$
не будет работать.
Ответ 4
Регулярное выражение в ответе больше не работает (по крайней мере, не в 4.0.12).
Похоже, что -filter не любит пробел и дает следующую ошибку:
Неустранимая ошибка: "preg_match(): Ошибка компиляции: отсутствует) при смещении
Это фиксируется заменой пространства на \s. Кавычки также должны быть удалены (иначе\должно быть \)
phpunit --filter /::testAdd(\s.*)?$/ DataTest DataProviderTest.php