При запуске теста PHPUnit я хотел бы иметь возможность выводить выходные данные, чтобы я мог отлаживать одну или две вещи.
Я попробовал следующее (аналогично примеру с руководством по PHPUnit );
class theTest extends PHPUnit_Framework_TestCase
{
/**
* @outputBuffering disabled
*/
public function testOutput() {
print_r("Hello World");
print "Ping";
echo "Pong";
$out = "Foo";
var_dump($out);
}
}
Со следующим результатом:
PHPUnit @package_version@ by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.00Mb
OK (1 test, 0 assertions)
Обратите внимание, что нет ожидаемого результата.
Я использую HEAD версии репозитория git по состоянию на 19 сентября 2011 года.
Выход php -version
:
$ php -version
PHP 5.2.9 (cli) (built: Dec 8 2010 11:36:37)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
Есть ли что-то, что я делаю не так, или это потенциально ошибка PHPUnit?
php
unit-testing
phpunit
Джесс Телфорд
источник
источник
testOutput()
метод?phpunit /path/to/tests/theTest.php
(если вышеупомянутый класс был в файлеtheTest.php
).ob_get_level()
возвращается1
. Однако это противоречит следующему коду:while (ob_get_level() > 0) { ob_end_flush(); }
какие ошибки сob_end_clean(): failed to delete buffer. No buffer to delete.
. Любопытнее и любопытнее.Ответы:
ОБНОВИТЬ
Только что реализовал другой способ сделать это, который работает намного лучше, чем
--verbose
опция командной строки:Это позволяет в любое время вывести на консоль что-нибудь, не используя нежелательный вывод, который поставляется вместе с
--verbose
опцией CLI.Как отмечали другие ответы, лучше всего тестировать вывод, используя встроенные методы, такие как:
Однако иногда полезно быть непослушным и видеть одноразовые / временные выходные данные отладки в ваших тестовых примерах. Тем не
var_dump
менее, нет необходимости во взломе / обходном пути. Это можно легко сделать, установив--verbose
командной строки при запуске набора тестов. Например:Это будет отображать вывод из ваших методов тестирования при работе в среде CLI.
См .: Написание тестов для PHPUnit - Тестирование вывода .
источник
file_put_contents('php://stderr', $myDebugVar, FILE_APPEND);
вместо этого, потому что у меня было сообщениеUse of undefined constant STDERR - assumed 'STDERR'
с fwrite .STDOUT
вместоSTERR
STDERR
. Я используюPHPUnit 4.5.0
в Windows CMD линии.echo
заявление не дает те же результаты.echo
выводит, но только после того, как отображается результат теста.fwrite(STDERR, 'string')
илиfwrite(STDOUT,'string')
выдает те же результаты: вывод перед отображением результата теста.Обновление: см. Обновление rdlowrey ниже относительно использования
fwrite(STDERR, print_r($myDebugVar, TRUE));
как намного более простого обходного пути.Такое поведение является намеренным (как jasonbar уже указывал ). О конфликтующем состоянии руководства сообщили в PHPUnit.
Обходной путь - заставить PHPUnit утверждать, что ожидаемый вывод является пустым (при наличии фактического вывода), что приведет к отображению неожиданного вывода.
дает:
Обязательно отключите любые другие утверждения, которые у вас есть для теста, поскольку они могут потерпеть неудачу до того, как будет проверено выходное утверждение (и, следовательно, вы не увидите выходных данных).
источник
Попробуйте использовать
--debug
Полезно, если вы пытаетесь найти правильный путь к файлу данных включения или источника.
источник
Это не ошибка, но очень намеренно. Лучше всего записать в какой-нибудь файл журнала и привязать журнал, чтобы отслеживать результаты.
Если вы пытаетесь проверить вывод, проверьте это .
Также:
источник
Мне повезло с VisualPHPUnit , и он, помимо всего прочего, показывает полезную информацию .
источник
Вы должны действительно подумать о своих намерениях: если вам нужна информация сейчас при отладке для исправления теста, она понадобится вам на следующей неделе, когда тесты прервутся.
Это означает, что вам понадобится информация всегда, когда тест не пройден, и добавление a
var_dump
для поиска причины - это слишком много работы. Скорее поместите данные в свои утверждения.Если ваш код слишком сложен для этого, разбивайте его до тех пор, пока не достигнете уровня, когда одно утверждение (с пользовательским сообщением) скажет вам достаточно, чтобы знать, где оно сломалось, почему и как исправить код.
источник
В laravel 5 вы можете использовать dump (), дамп содержимого из последнего ответа.
дает
источник
Просто используйте флаг --verbose при выполнении phpunit .
Преимущество этого метода заключается в том, что вам не нужно менять тестовый код, вы можете печатать строки, var_dump или все, что пожелаете, и это будет отображаться в консоли только при установленном подробном режиме.
Надеюсь, это поможет.
источник
В некоторых случаях можно использовать что-то подобное для вывода чего-либо на консоль.
источник
Взломать, но работает: сгенерировать исключение с выводом отладки в качестве сообщения.
Урожайность:
источник
Это было взято из PHPUnit Docs о приспособлениях .
Это должно позволить вам выводить информацию в любой точке в течение жизненного цикла теста phpunit.
Просто замените
__METHOD__
в приведенном ниже коде все, что вы хотите вывестиПример 4.2: Пример, показывающий все доступные методы шаблона
источник
Я выводил свой Testresults на основе HTML, в этом случае было полезно очистить содержимое:
Есть второй метод PHP
который я не пробовал.
источник
PHPUnit скрывает вывод
ob_start()
. Мы можем временно отключить это.источник
Мне пришлось изменить исходный код, чтобы этот код работал, поэтому вам нужно добавить URL для этого разветвленного репозитория, чтобы композитор работал.
источник
Вот несколько методов, полезных для печати отладочных сообщений в PHPUnit 4.x:
syslog(LOG_DEBUG, "Debug: Message 1!");
Более практичный пример:
При вызове
syslog()
будет сгенерировано сообщение системного журнала (см .man syslog.conf
:).Примечание: Возможные уровни:
LOG_DEBUG
,LOG_INFO
,LOG_NOTICE
,LOG_WARNING
,LOG_ERR
и т.д.В macOS для потоковой передачи сообщений системного журнала в реальном времени выполните:
fwrite(STDERR, "LOG: Message 2!\n");
Примечание.
STDERR
Константа недоступна при чтении сценария PHP из stdin . Вот обходной путь .Примечание. Вместо этого
STDERR
вы также можете указать имя файла.file_put_contents('php://stderr', "LOG: Message 3!\n", FILE_APPEND);
Примечание. Используйте этот метод, если у вас нет определенной
STDERR
константы .register_shutdown_function('file_put_contents', 'php://stderr', "LOG: Message 4!\n", FILE_APPEND);
Примечание. Используйте этот метод, если вы хотите напечатать что-либо в самом конце, не затрагивая тесты.
Чтобы вывести переменную, используйте
var_export()
, например"Value: " . var_export($some_var, TRUE) . "\n"
.Чтобы напечатать вышеприведенные сообщения только в режиме подробного или отладочного режима, см .: Есть ли способ узнать, были ли --debug или --verbose переданы PHPUnit в тесте?
Хотя, если тестирование выходных данных является частью самого теста, ознакомьтесь со страницей : Тестирование выходных документов.
источник
Если вы используете Laravel, то вы можете использовать функции ведения журнала, такие как info (), чтобы войти в файл журнала Laravel в разделе storage / logs. Таким образом, он не появится в вашем терминале, но в файле журнала.
источник