PHPUnit - ничего не делает, ни ошибок, ни вывода - PullRequest
42 голосов
/ 18 сентября 2011

Извините за еще один вопрос "phpunit не работает". Раньше он работал годами. Сегодня я переустановил PEAR и phpunit по причинам, не связанным с этой проблемой. Теперь, когда я запускаю phpunit, как обычно. Ничего не произошло. Кли просто показывает мне новую строку, без вывода вообще.

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

PHPUnit Version: 3.5.15 
PEAR Version: 1.9.4 
PHP Version: 5.3.8 
Windows 7

Ответы [ 12 ]

53 голосов
/ 24 августа 2012

Я на OSX и MAMP. Чтобы получить сообщения об ошибках, мне пришлось настроить следующие записи в php.ini:

display_errors = On
display_startup_errors = On

Пожалуйста, обратите внимание, что это не должно входить в /Applications/MAMP/bin/php/php5.3.6/conf/php.ini.

40 голосов
/ 25 февраля 2015

Для дальнейшего использования, для тех, кто сталкивается с какой-либо проблемой с PHPUnit, а PHPUnit не работает автоматически, просто добавьте эти три строки в phpunit.xml:

<phpunit ....... >
    ...
    ...
    <php>
         <ini name="display_errors" value="true"/>
    </php>
</phpunit>

После этого снова запустите тесты, и теперь вы можете увидеть, почему PHPUnit не работает,

И ... НАСЛАЖДАЙТЕСЬ ЕДИНЫМ ТЕСТИРОВАНИЕМ:)

27 голосов
/ 08 июня 2013

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

То, что я обычно делаю, когда это происходит, в качестве первого шага сбрасывает обработчик ошибок на что-то, что немедленно выводит сообщение об ошибке. В моем базовом классе тестирования у меня есть метод с именем setVerboseErrorHandler, который я вызову в верхней части теста (или в setUp), когда это произойдет. Ниже требуется php 5.3 или выше (из-за закрытия), поэтому, если вы используете 5.2 или ниже, вы можете сделать это обычной функцией.

protected function setVerboseErrorHandler() 
{
    $handler = function($errorNumber, $errorString, $errorFile, $errorLine) {
        echo "
ERROR INFO
Message: $errorString
File: $errorFile
Line: $errorLine
";
    };
    set_error_handler($handler);        
}
22 голосов
/ 20 сентября 2011

Создайте самый простой тестовый класс, который вы можете без bootstrap.php или phpunit.xml, чтобы сначала убедиться, что ваша новая установка работает. PHPUnit остановится без какого-либо сообщения, если не сможет создать все тестовые примеры - по одному для каждого метода тестирования и поставщика данных - перед выполнением каких-либо тестов.

6 голосов
/ 02 декабря 2011

Вы уже выяснили, как заставить его работать, но мое решение было немного другим.

Первое, что вы можете сделать, это проверить состояние выхода. Если это не 0, то PHP завершился и из-за установленных параметров конфигурации INI ни одно из сообщений об ошибках PHP не было выведено. Я включил настройку INI «display_errors» и установил «error_reporting» на E_ALL. Затем я смог выявить ошибки, такие как PHP не в состоянии проанализировать определенный сценарий. Как только я это исправил, PHPUnit работал правильно.

5 голосов
/ 31 января 2015

Мне удалось эффектно нарисовать себя в углу с помощью пользовательского «обработчика фатальных ошибок», который в некоторых редких условиях приводил к выводу ничего . Эти условия, в соответствии с законом Мерфи, материализовались, когда я забыл, что обработчик на месте.

Поскольку это не было «проблемой PHPunit», ни один из других ответов не помог [хотя проблема @ Дэвида была в сущности одинаковой], даже если симптомы были одинаковыми - phpunit завершается без вывода, нет ошибки, без журнала и без подсказки.

В итоге мне пришлось прибегнуть к пошаговой трассировке всего набора тестов, добавив это в код начальной загрузки:

register_shutdown_function(function() {
    foreach ($GLOBALS['lastStack'] as $i => $frame) {
        print "{$i}. {$frame['file']} +{$frame['line']} in function {$frame['function']}\n";
    }
});
register_tick_function(function() {
    $GLOBALS['lastStack'] = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 8);
});
declare(ticks=1);

Если кому-то удастся сделать хуже, чем это, и каким-то образом заблокировать стандартный вывод, эта модификация должна работать:

register_shutdown_function(function() {
    $fp = fopen("/tmp/path-to-debugfile.txt", "w");
    foreach ($GLOBALS['lastStack'] as $i => $frame) {
        fwrite($fp, "{$i}. {$frame['file']} +{$frame['line']} in function {$frame['function']}\n");
    }
    fclose($fp);
});
4 голосов
/ 12 февраля 2015

старая ветка, но я наткнулся, когда возникла та же проблема.

У меня была такая же проблема, ничего не возвращалось на консоль, включая print, print_r, echo и т. Д.

решил это, используя --stderr в качестве опции test-runner .

4 голосов
/ 28 апреля 2013

Убедитесь, что вы не написали никакой логики в коде, который просто умирает без вывода. Например,

<?php

if (!array_key_exists('SERVER_NAME', $_SERVER)) {
    die();
}

Это был именно мой случай; Я сделал некоторые предположения относительно среды, которые были правильными при запуске кода через Apache, но не были выполнены при запуске из CLI, и код не отображал вывод.

PHPUnit попытался включить файл начальной загрузки перед тем, как выдать обычный вывод init, но умер во время процесса начальной загрузки, поэтому завершил работу со статусом 0 и без вывода.

3 голосов
/ 08 мая 2014

Если при запуске из командной строки последней версии phpunit, подобной этой

> php phpunit
or
> ./phpunit
or
> php ./phpunit.phar
or
> ./phpunit.phar

, и вы сразу же возвращаетесь к приглашению без сообщений, это, вероятно, связано с настройкой «suhosin secutiry».phpunit теперь является пакетом phar, включающим все библиотеки.Чтобы иметь возможность запускать такой файл, когда в php включен модуль безопасности suhosin, вы должны сначала установить этот

suhosin.executor.include.whitelist = phar

в свой файл php.ini (например, с помощью debian / ubuntu, возможно, вам придется отредактироватьфайл /etc/php5/conf.d/suhosin.ini

2 голосов
/ 29 марта 2018

Я попробовал все здесь, но ничего не получалось, пока я не попытался phpunit --no-configuration simpletest.php.это, наконец, дало мне вывод, что означает, что мой phpunit.xml.dist файл поврежден.(Я вернусь и обновлю это после отладки.)

содержание simpletest.php ниже, но любой тестовый файл должен работать.

<?php
use PHPUnit\Framework\TestCase;

final class FooTest extends TestCase
{
    public function testFoo()
    {
        $this->assertEquals('x', 'y');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...