2012-08-30 2 views
13

У меня проблема при использовании командной строки для запуска тестов: если я бегу 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

В этом случае регулярное выражение сравнивается с следующей строкой:

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

Поэтому, естественно, ваше регулярное выражение testAdd$ не будет работать.

6

Как @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 это будет лучше использовать;)

Tracking вопрос для более хорошего синтаксиса на phpunit github issue tracker

13

регулярного выражения для обработки тестов с или без наборов данных является

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. + (с dat набор #. +)?$/"или что-то очень классное средство для запуска всех тестов с поставщиками данных;) – edorian

+0

@edorian - Хороший вызов. Я изменил его на'. * ', чтобы поймать любой набор данных. –

+0

Я думаю, что новый синтаксис для' -filter' всегда проще https://phpunit.de/manual/current/en/textui.html#textui.examples.filter-patterns – martin

1

регулярное выражение в ответ уже не (по крайней мере, не в 4.0.12).

Похоже --filter не любит пространство, и дает следующее сообщение об ошибке:

Фатальная ошибка: «preg_match(): компиляция не удалась: отсутствующий) на смещение

Это исправляется заменив пространство \ S кавычки должны также удаляются (или иначе \ должно быть \)

phpunit --filter /::testAdd(\s.*)?$/ DataTest DataProviderTest.php 
+0

Вы пропустили кавычки вокруг регулярного выражения, чтобы рассматривать его как единственный параметр в командной строке, линия. –

Смежные вопросы