PHPUnit - ничего не делает, никаких ошибок, нет вывода
Извините, что другой вопрос "phpunit не работает". Он работал уже много лет. Сегодня я переустановил PEAR и phpunit по причинам, не связанным с этой проблемой. Теперь, когда я запускаю phpunit, как обычно. Ничего не произошло. Cli просто показывает мне новую строку, без выхода.
Кто-нибудь сталкивался с этой проблемой или имел представление о том, что могло бы вызвать ее.
PHPUnit Version: 3.5.15
PEAR Version: 1.9.4
PHP Version: 5.3.8
Windows 7
Ответы
Ответ 1
Создайте простейший тестовый класс без bootstrap.php
или phpunit.xml
, чтобы убедиться, что ваша новая установка работает. PHPUnit остановится без какого-либо сообщения, если он не сможет создать экземпляр всех тестовых примеров - по одному для каждого метода тестирования и поставщика данных - перед выполнением любых тестов.
Ответ 2
Я на OSX и MAMP. Чтобы получить сообщения об ошибках, мне пришлось настроить следующие записи в php.ini
:
display_errors = On
display_startup_errors = On
Пожалуйста, не нужно, чтобы это произошло в /Applications/MAMP/bin/php/php5.3.6/conf/php.ini
.
Ответ 3
В будущем для тех, кто сталкивается с любой проблемой с PHPUnit, а PHPUnit терпит неудачу, просто добавьте эти три строки внутри phpunit.xml:
<phpunit ....... >
...
...
<php>
<ini name="display_errors" value="true"/>
</php>
</phpunit>
После этого снова запустите тесты, и теперь вы можете увидеть, почему PHPUnit не работает,
И... НАСЛАЖДАЙТЕ ТЕСТИРОВАНИЕ ЕДИНИЦЫ:)
Ответ 4
Я знаю, что вопрос о плакате orignal уже ответил, но только для людей, которые ищут в будущем: одна вещь, которая может заставить PHPUnit терпеть неудачу молча (т.е. просто прекращает выполнение тестов, не сообщая вам, почему) заключается в том, что она имеет ошибку который он настроил перед каждым тестовым прогоном, который предназначен для захвата ошибок и отображения их в конце тестового прогона. Проблема в том, что некоторые ошибки останавливают выполнение всего тестового прогона.
Что я обычно делаю, когда это происходит, в качестве первого шага, это reset обработчик ошибок к тому, что немедленно выведет сообщение об ошибке. В моем базовом тестовом классе у меня есть метод под названием 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);
}
Ответ 5
Вы уже поняли, как заставить его работать, но мое решение было немного другим.
Первое, что вы можете сделать, это проверить статус выхода. Если это не 0, то PHP вышел, и из-за установленных параметров конфигурации INI не было выведено ни одного сообщения об ошибках PHP. Что я сделал, так это включить настройку INI "display_errors" и установить "error_reporting" на E_ALL
. Затем я смог идентифицировать ошибки, такие как PHP, не способный анализировать определенный script. Как только я исправил это, PHPUnit работал правильно.
Ответ 6
Мне удалось эффектно нарисовать себя в углу с обычным "фатальным обработчиком ошибок", который в некоторых редких условиях не выдавал ничего. Эти условия, в соответствии с законом Мерфи, материализовались, как только я забыл, что обработчик был на месте.
Поскольку это была не "проблема с PHPunit", ни один из других ответов не помог [хотя проблема @David была внизу той же самой вещи], хотя симптомы были одинаковыми - phpunit завершался без вывода, no ошибки, нет журнала и никаких подсказок.
В конце концов, мне пришлось прибегнуть к пошаговой трассировке всего набора тестов, добавив это в код начальной загрузки:
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);
Если кому-либо удастся сделать хуже, чем это, и каким-то образом заблокировать stdout, эта модификация должна работать:
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);
});
Ответ 7
Убедитесь, что вы не записали какую-либо логику в свой код, который просто умирает, без вывода. Например,
<?php
if (!array_key_exists('SERVER_NAME', $_SERVER)) {
die();
}
Это был именно мой случай; Я сделал некоторые предположения об окружающей среде, которые были правильными при запуске кода через Apache, но не выполнялись при запуске из CLI, и код не выдавал никакого выхода.
PHPUnit попытался включить файл bootstrap перед тем, как предоставить обычный вывод init, но умер во время процесса начальной загрузки, следовательно, вышел со статусом 0 и без вывода.
Ответ 8
старый поток этот, но один я наткнулся на него, имея ту же проблему.
У меня была такая же проблема, ничего не возвращалось в консоль, включая print, print_r, echo и т.д.
решил его использовать с помощью --stderr
в качестве опции test-runner.
Ответ 9
Если при запуске из командной строки появилась последняя версия 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
Ответ 10
Я попробовал все здесь, но ничего не phpunit --no-configuration simpletest.php
пока я не попробовал 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');
}
}
Ответ 11
Проверьте, совпадают ли используемые phpunit и те, которые вы установили:
$ pear list phpunit/phpunit
...
script /path/to/phpunit
...
Попробуйте выполнить именно этот phpunit с полным путем.
Затем проверьте свою переменную PATH и посмотрите, есть ли в ней правильный каталог. Если нет, исправьте это.
Если это не помогает, используйте что-то пишите в исполняемый файл phpunit, например. "echo 123;" и запустить phpunit. Проверьте, видите ли вы это.
Ответ 12
Для меня конфликт был с директивой Xdebug
xdebug.remote_enable=1