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

Что делает режим PHPUnit Strict?

Мне интересно, что такое "строгий режим в PHPUnit"?

например:

phpunit --strict

или в phpunit.xml

<phpunit strict="true">

Я включил его, чтобы попробовать, и мои тесты начали с ошибкой

PHP_Invoker_TimeoutException: Execution aborted after 1 second
4b9b3361

Ответ 1

Короткий ответ: для длительных тестов используйте аннотацию для увеличения допустимого времени выполнения:

@large // 10 seconds
@medium // 5 seconds
@small // 1 second max <-- Default, so no point using

Длинный ответ:

Вот обновленный набор информации, который был получен с помощью @Crozin.

В моем случае ошибка заключалась в том, что тест проходил слишком долго ( > 1 секунда). (Схема Doctrine ORM drop + create может замедлять работу, см. этот ZendCast за то, что я делал). Это вызвало проблему (и некоторую отдачу) от PHP_Invoker. Строгий режим не позволяет выводить.

По чтению/обратному проектированию /usr/share/php/pear/share/pear/PHPUnit/Util/Test.php::getSize() (и getGroups() в одном классе). Я понял, что есть 3 недокументированные аннотации, которые мы можем использовать:

@large  // 10 seconds
@medium // 5 seconds
@small // 1 second max run time

Они могут быть указаны на уровне класса или на уровне метода. Проблема № 490 в PHPUnit github указывает на проблемы с поставкой уровня уровня класса и метода, поэтому YMMV, если вы их смешиваете. Как сказал крозин, выделенные тайм-ауты составляют 10,5,1 секунды соответственно.

Альтернативное решение заключалось в том, чтобы увеличить продолжительность выполнения вызываемой функции (на моем медленном компьютере).

sudo vi /usr/share/php/pear/share/pear/PHP/Invoker.php

Increase line 1 "declare(ticks = 1);" to
    "declare(ticks = 10);" // or any higher int that meets your needs 

Вот куча информации о строгом режиме, который помог мне найти решение:

PHP_Invoker
   Класс утилиты для вызова вызываемых вызовов с таймаутом. Этот пакет необходим для обеспечения соблюдения тайм-аутов тестирования в строгом режиме. [Инструкции по установке PHPUnit]

Строгий режим    Тесты, которые ничего не утверждают, отмечены как неполные    Тестирование, которое является неполным (или пропущенным), не дает никакого покрытия кода Slideshare by Sebastian Bergmann (слайд 10)

Примечание
Обратите внимание, что PHPUnit проглатывает весь вывод, который испускается во время выполнения теста. В строгом режиме тест, который испускает выход, не удастся. Тестирование раздела вывода в руководстве PHPUnit

Ответ 2

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

Это все, что я мог найти в документации, но я также проверил источники, и я нашел это в строгом режиме:

  • Тесты без утверждений могут быть отмечены как неполные/сбои.
  • Каждый тест может выполняться с указанием времени выполнения в зависимости от его размера и наличия расширения pcntl и Библиотека PHP_Invoker. Существует три значения тайм-аута:

    • timeoutForSmallTests (значение по умолчанию: 1)
    • timeoutForMediumTests (значение по умолчанию: 10)
    • timeoutForLargeTests (значение по умолчанию: 60)

    Размер теста (малый, средний или большой) определяется методом PHPUnit_Util_Test::getSize():

    • Тестовые примеры, опускающиеся с PHPUnit_Extensions_Database_TestCase или PHPUnit_Extensions_SeleniumTestCase, являются большими.
    • Тесты и индивидуальные тесты также могут быть сделаны большими или средними, добавив их в группы "большой" или "медиум" соответственно.
    • В противном случае тест невелик.

Кажется, что строгий режим делает только три вышеупомянутые изменения, но я не совсем уверен в этом. Я никогда раньше не изучал источники PHPUnit и не использовал строгий режим.