Как пропустить тесты в PHPunit?

88

Я использую phpunit вместе с jenkins, и я хочу пропустить определенные тесты, установив конфигурацию в файле XML. phpunit.xml

Я знаю, что могу использовать в командной строке:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

как мне перевести это в файл XML, поскольку <filters>тег предназначен только для покрытия кода?

Я хотел бы запустить все тесты, кроме testStuffThatAlwaysBreaks

Филипе
источник
1
KO: как насчет исправления теста? кстати, привет от wellly ;-)
zerkms
Я не писал тесты, это что-то несущественное, а также не хочу менять файлы ядра
Filype
Сомневаюсь, что вы сможете это сделать. Это очень странное требование
zerkms
PS: вы упомянули фильтры - но это не могло вам помочь, потому что исключает весь путь. В противном случае <exclude>- сделает работу за вас
zerkms
вы можете опубликовать предложенный файл phpunit.xml.dist?
Filype

Ответы:

168

Самый быстрый и простой способ пропустить тесты, которые либо не работают, либо вам нужно продолжить работу позже, - просто добавить следующее в начало вашего индивидуального модульного теста:

$this->markTestSkipped('must be revisited.');
jsteinmann
источник
вы всегда можете добавить каталоги или тесты в файл конфигурации xml, однако, если это контроллер или аналогичный, это действительно не очень практично, потому что у вас, вероятно, есть десятки других тестов в этом файле. Я полагаю, если у вас нет доступа к модульным тестам, не уверен, что понимаю почему, тогда у вас нет другого выбора, кроме как исключить.
jsteinmann
5
Поскольку это статический метод (по крайней мере, в PHPUnit 3), а некоторые классы используют позднюю статическую привязку afaik, вы должны использовать static::markTestSkipped('');вместо $this->. В новых версиях PHP будет выдано предупреждение. Подпись: public static function markTestSkipped($message = '')
Daniel W.
Требуется лучший пример полного файла модульного теста. Не просто фрагмент.
Ligemer 05
@DanielW. в официальном руководстве по phpunit есть примеры, показывающие$this->markTestSkipped()
nulll
@nulll, который вы можете увидеть в исходном коде 6.5 , markTestSkipped()по-прежнему является статическим методом.
Дэниел В.
30

Если вы можете игнорировать весь файл, тогда

<?xml version="1.0" encoding="UTF-8"?>

<phpunit>

    <testsuites>
        <testsuite name="foo">
            <directory>./tests/</directory>
            <exclude>./tests/path/to/excluded/test.php</exclude>
                ^-------------
        </testsuite>
    </testsuites>

</phpunit>
Зеркмс
источник
Это то, что я пробовал, но там указано 893 теста без <exclude>и 893 теста с<exclude>
Filype
1
Тесты занимают около 20 минут, есть ли простой способ узнать, сколько тестов они будут запускать? в настоящее время мне нужно дождаться завершения первой строки....... 63 / 893 ( 7%)
Filype
5
@Filype: значит, вы, вероятно, указали неверный путь. У меня это хорошо работает. Не уверен, можно ли подсчитать количество тестов. PS: юнит-тесты не должны выполняться так долго. Я бы рекомендовал использовать @groupаннотации и сплит-тесты по своей природе
zerkms
20

Иногда полезно пропустить все тесты из определенного файла на основе пользовательских условий, определенных как PHP-код. Вы можете легко сделать это с помощью функции setUp, в которой также работает makeTestSkipped.

protected function setUp()
{
    if (your_custom_condition) {
        $this->markTestSkipped('all tests in this file are invactive for this server configuration!');
    }
}

your_custom_condition может быть передано через некоторый статический метод / свойство класса, константу, определенную в файле начальной загрузки phpunit, или даже глобальную переменную.

Конрад Галензовски
источник
Что такое Configкласс? Где мне его разместить?
cronfy
@cronfy это может быть любой доступный класс с глобальной областью видимости (шаблон проектирования Singleton / Register) или даже глобальная переменная, установленная в файле начальной загрузки в phpunit. В основном логика такова: if ($ testsFromThisFileShouldBeSkipped) {$ this-> markTestSkipped (...); }
Конрад Галензовски
удалите условие, и ваш ответ будет прямым ... "markTestSkipped внутри настройки, чтобы пропустить весь файл"
SparK
1
@SparK Я понимаю вашу точку зрения, но я предоставил способ условного пропуска всего тестового класса. Я немного изменил его, убрав свой собственный способ сделать это в пользу общего правила.
Konrad Gałęzowski