Подтвердить что ты не робот

Не удается выполнить одиночный тест с поставщиком данных в 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)
        );
    }
}

?>
4b9b3361

Ответ 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