Як пропустити тести в PHPunit?


88

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

Я знаю, що можу використовувати в командному рядку:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

як перекласти це у файл XML, оскільки <filters>тег призначений лише для покриття коду?

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


1
KO: як щодо виправлення тесту? btw, привіт від welly ;-)
zerkms

Я не писав тести, це щось неактуальне, а також не хочу змінювати основні файли
Filype

Сумнівно, ви можете це зробити. Це дуже дивна вимога
zerkms

PS: ви згадали фільтри - але це вам не допомогло, оскільки виключає весь шлях. Інакше <exclude>- зробив би роботу за вас
zerkms

Ви можете розмістити запропонований файл phpunit.xml.dist?
Філіпе

Відповіді:


168

Найшвидший і найпростіший спосіб пропустити тести, які або поламані, або вам потрібно продовжувати працювати пізніше, це просто додати наступне у верхню частину вашого індивідуального модульного тесту:

$this->markTestSkipped('must be revisited.');

Ви завжди можете додати каталоги або тести до конфігураційного файлу xml, однак, якщо це контролер або подібний, це насправді не дуже практично, тому що у вас, мабуть, є десятки інших тестів у цьому файлі. Я думаю, якщо у вас немає доступу до модульних тестів, я не впевнений, що розумію, чому, тоді у вас немає іншого вибору, крім як виключити.
jsteinmann

5
Оскільки це статичний метод (принаймні в PHPUnit 3), а деякі класи використовують пізню статичну прив'язку afaik, вам слід використовувати static::markTestSkipped('');замість $this->. Це згенерує попередження в нових версіях PHP. Підпис: public static function markTestSkipped($message = '')
Даніель В.

Потрібен кращий приклад повного файлу модульного тесту. Не просто фрагмент.
Лігемер,

@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 (...); }
Konrad Gałęzowski

видаліть умовне, і ваша відповідь буде прямою ... "markTestSkipped усередині установки, щоб пропустити весь файл"
SparK

1
@SparK Я бачу вашу думку, але я пропонував спосіб умовного пропуску цілого тестового класу. Я трохи змінив це, вилучивши свій власний спосіб робити це на користь загального правила.
Konrad Gałęzowski
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.