2014-12-06 4 views
7

Вопрос: Почему PHPUnit работает в строгом режиме?PHPUnit - Почему PHPUnit работает в строгом режиме?

Вопрос:

PHPUnit 4.3.1 Себастьян Бергманн.

чтения конфигурации из /full/path/to/configuration.xml

R

Время: 2.65 секунд Память: 11.50Mb

OK, но неполные, пропускаются, или рискованные испытания! Тесты: 1, Утверждения: 1, Рискованный: 1. Сделано.

также:

Рискованный Test: Код испытания или испытания код не (только) закрыть свои собственные выходные буферы

My PHP версии 5.4.

Как указано в документации (https://phpunit.de/manual/current/en/strict-mode.html), это относится только к строгой настройке PHPUnits.

PHPUnit может выполнять дополнительные проверки при выполнении тестов. В дополнение к мелкомасштабному контролю над строгим режимом (см. Ниже) вы можете использовать опцию командной строки --strict или установить strict = "true" в файле конфигурации XML PHPUnit, чтобы включить все их .

-

Выход Во время исполнения теста

PHPUnit может быть строгим о выходе во время испытаний. Эта проверка может быть активирована с использованием опции -disallow-test-output в командной строке или путем установки beStrictAboutOutputDuringTests = "true" в файле конфигурации PHPUnit XML .

Тест, который испускает выходной сигнал, например, путем вызова печати в тестовом коде или проверенном коде, будет отмечен как опасный, если эта проверка включена .

Я считаю, что я не активировал строгий режим. Моя командная строка: «/ usr/bin/php/usr/bin/phpunit --colors --bootstrap /full/path/to/bootstrap.php --configuration /full/path/to/configuration.xml/full/path /to/Test.php». Я также использовал конфигурацию, как указано в «https://phpunit.de/manual/current/en/appendixes.configuration.html».

<phpunit 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.3/phpunit.xsd" 
    backupGlobals="true" 
    backupStaticAttributes="false" 
    cacheTokens="false" 
    colors="false" 
    convertErrorsToExceptions="true" 
    convertNoticesToExceptions="true" 
    convertWarningsToExceptions="true" 
    forceCoversAnnotation="false" 
    mapTestClassNameToCoveredClassName="false" 
    printerClass="PHPUnit_TextUI_ResultPrinter" 
    processIsolation="false" 
    stopOnError="false" 
    stopOnFailure="false" 
    stopOnIncomplete="false" 
    stopOnSkipped="false" 
    testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader" 
    timeoutForSmallTests="1" 
    timeoutForMediumTests="10" 
    timeoutForLargeTests="60" 
    strict="false" 
    verbose="false"> 
</phpunit> 

Раньше я использовал более короткую версию этой конфигурации, которая обеспечивала тот же результат.

<phpunit 
    beStrictAboutOutputDuringTests="false" 
    strict="false" 
    colors="false"> 
</phpunit> 
+1

Вам удалось решить эту проблему? – Patrick

+0

Я сделал это в том смысле, что проблема с сообщением исчезла, но не в смысле моего первоначального намерения заставить PHPUnit игнорировать проблему. Проблема была в библиотеке, которую я использовал, и я нашел способ исправить проблему с этой целью: http://help.slimframework.com/discussions/problems/7779-output-buffers-arent-closed-when -using-app-halt –

+0

Я ответил на эту же проблему здесь http://stackoverflow.com/questions/38400305/phpunit-help-needed-about-risky-tests/40242323#40242323 –

ответ

6

Глядя на код, доступный на GitHub, кажется, что независимо от того, что документация может сказать, проблема буферизации вывода проверяется и сообщили всегда.

Таким образом, симптомы, которые вы наблюдаете, не означают, что тесты выполняются в режиме strict.

github.com/sebastianbergmann/phpunit/blob/4.3/src/Framework/TestCase.php#L818

// ... 

try { 
    $this->stopOutputBuffering(); 
} catch (PHPUnit_Framework_RiskyTestError $_e) { 
    if (!isset($e)) { 
     $e = $_e; 
    } 
} 

github.com/sebastianbergmann/phpunit/blob/4.3/src/Framework/TestCase.php#L1938-L1946

private function stopOutputBuffering() 
{ 
    if (ob_get_level() != $this->outputBufferingLevel) { 
     while (ob_get_level() > 0) { 
      ob_end_clean(); 
     } 
     throw new PHPUnit_Framework_RiskyTestError(
      'Test code or tested code did not (only) close its own output buffers' 
     ); 
    } 

    // ... 

    $this->outputBufferingActive = false; 
    $this->outputBufferingLevel = ob_get_level(); 
} 

Размещение точки останова на строках выше в вашем любимом PHPUnit тест отладчик может выявить некоторые другие зависимости (например, disallowTestOutput flag ...?)

+1

Это действительно объясняет проблему. Я исправил проблему буферизации внутри библиотеки, которую я использовал, и с тех пор не сталкивался с подобной ситуацией. http://help.slimframework.com/discussions/problems/7779-output-buffers-arent-closed-when-using-app-halt –

+0

@xmojmr, следует ли это считать ошибкой? – Pacerier

+0

@ Pacerier может быть. Я не слишком хорошо знаком с документацией phpunit.Если это противоречит тому, что говорится в документации, то это должно считаться ошибкой и как таковое должно быть зарегистрировано в [отслеживании проблем] (https://github.com/sebastianbergmann/phpunit/issues) вместе с другими 147 открытыми проблемами – xmojmr

0

Поиск в базе кода для error_reporting. Возможно, вы можете включить строгий режим в своем коде. error_reporting(E_NOTICE) достаточно, чтобы вызвать опасное предупреждение, которое вы получаете.

PHPUnit не является специальным двоичным кодом (я использую это заблуждение), его просто PHP выполняет некоторые механизмы начальной загрузки, которые запускают ваш код. Это означает, что ваш код имеет ту же среду, что и PHPUnit, поэтому, вероятно, что где-то в вашем коде вы можете настроить отчет об ошибках строго.

+1

У меня нет e_notice. Проблема заключается в буферизации вывода. – kylehyde215

0

Из вывода я считаю, что я прав, полагая, что вы делаете только один тест, поэтому настройка --stop-on-risky на самом деле не поможет.

Я рекомендую убедиться, что вы закрываете буферизацию вывода в своем коде. Если вы когда-либо используете что-то вроде ob_start, убедитесь, что вы вызываете ob_end_clean или ob_end_flush, прежде чем ваш скрипт перестанет выполняться.

В качестве второй мысли, возможно, попробуйте передать флаги -d и -v при запуске, чтобы узнать, дает ли она вам больше информации.

+1

Вы можете [редактировать] все ваши сообщения и комментарии. Возможно, вам следует переместить комментарий в свой ответ, а затем удалить комментарий. –

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