Как вывести в CLI во время выполнения модульных тестов PHP?

При запуске теста 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 @[email protected] 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?

113 голосов | спросил Jess Telford 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 21 Sep 2011 03:49:10 +0400 2011, 03:49:10

12 ответов


0

UPDATE

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

class TestSomething extends PHPUnit_Framework_TestCase {
    function testSomething() {
        $myDebugVar = array(1, 2, 3);
        fwrite(STDERR, print_r($myDebugVar, TRUE));
    }
}

Это позволяет в любой момент вывести что-либо на консоль без нежелательного вывода, который поставляется вместе с параметром CLI --verbose.


Как уже отмечалось в других ответах, лучше всего протестировать вывод с помощью встроенных методов, таких как:

$this->expectOutputString('foo');

Однако иногда полезно быть непослушным и видеть одноразовые /временные результаты отладки из ваших тестовых случаев. Тем не менее, нет необходимости в var_dump хаке /обходном пути. Этого легко достичь, установив параметр командной строки --verbose при запуске набора тестов. Например:

$ phpunit --verbose -c phpunit.xml

Это отобразит вывод из ваших методов тестирования при работе в среде CLI.

См .: Написание тестов для PHPUnit - тестирование Выход .

ответил rdlowrey 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 26 Sep 2012 20:24:13 +0400 2012, 20:24:13
0

Обновление . См. обновление rdlowrey ниже относительно использования fwrite(STDERR, print_r($myDebugVar, TRUE));, так как обходится намного проще


Это поведение является преднамеренным (так как jasonbar имеет указал ). Конфликтующее состояние руководства было сообщено в PHPUnit.

Обходной путь - заставить PHPUnit утверждать, что ожидаемый вывод пуст (когда есть выходной файл), что приведет к отображению неожиданного вывода.

 class theTest extends PHPUnit_Framework_TestCase
{
    /**
     * @outputBuffering disabled
     */
    public function testOutput() {
        $this->expectOutputString(''); // tell PHPUnit to expect '' as output
        print_r("Hello World");
        print "Ping";
        echo "Pong";
        $out = "Foo";
        var_dump($out);
    }   
}

дает:

PHPUnit @[email protected] by Sebastian Bergmann.

F

Time: 1 second, Memory: 3.50Mb

There was 1 failure:

1) theTest::testOutput
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-''
+'Hello WorldPingPongstring(4) "Foo"
+'

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

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

ответил Jess Telford 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 21 Sep 2011 04:40:18 +0400 2011, 04:40:18
0

Попробуйте использовать --debug

Полезно, если вы пытаетесь найти правильный путь к файлу данных включения или источника.

ответил chim 20 Maypm13 2013, 18:56:04
0

Мне немного повезло с VisualPHPUnit , и он, помимо прочего, помогает показать результаты.

class TestHello extends PHPUnit_Framework_TestCase 
{
    public function test_Hello() 
    {
        print "hello world";
    }
}

Результаты TestHello

ответил Bob Stein 26 MaramTue, 26 Mar 2013 01:24:22 +04002013-03-26T01:24:22+04:0001 2013, 01:24:22
0

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

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

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

ответил cweiske 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 21 Sep 2011 12:38:28 +0400 2011, 12:38:28
0

В некоторых случаях можно использовать что-то подобное для вывода чего-либо на консоль

 class yourTests extends PHPUnit_Framework_TestCase
{
    /* Add Warnings */
    protected function addWarning($msg, Exception $previous = null)
    {
        $add_warning = $this->getTestResultObject();
        $msg = new PHPUnit_Framework_Warning($msg, 0, $previous);
        $add_warning->addWarning($this, $msg, time());
        $this->setTestResultObject($add_warning);
    }

    /* Add errors */
    protected function addError($msg, Exception $previous = null)
    {
        $add_error = $this->getTestResultObject();
        $msg = new PHPUnit_Framework_AssertionFailedError($msg, 0, $previous);
        $add_error->addError($this, $msg, time());
        $this->setTestResultObject($add_error);
    }

    /* Add failures */
    protected function addFailure($msg, Exception $previous = null)
    {
        $add_failure = $this->getTestResultObject();
        $msg = new PHPUnit_Framework_AssertionFailedError($msg, 0, $previous);
        $add_failure->addFailure($this, $msg, time());
        $this->setTestResultObject($add_failure);
    }

    public function test_messages()
    {
        $this->addWarning("Your warning message!");
        $this->addError("Your error message!");
        $this->addFailure("Your Failure message");
    }

    /* Or just mark test states! */
    public function test_testMarking()
    {
        $this->markTestIncomplete();
        $this->markTestSkipped();
    }
}
ответил mkungla 22 TueEurope/Moscow2015-12-22T02:51:23+03:00Europe/Moscow12bEurope/MoscowTue, 22 Dec 2015 02:51:23 +0300 2015, 02:51:23
0

В laravel 5 вы можете использовать dump (), дамп содержимого из последнего ответа.

class ExampleTest extends TestCase{
    public function test1()
    {
        $this->post('/user', ['name' => 'Gema']);
        $this->dump();
    }
}

дает

ответил Branny Bk 8 J000000Friday16 2016, 07:17:53
0

Это взято из Документов PHPUnit о приспособлениях .

Это должно позволить вам выводить информацию в любой момент в течение жизненного цикла теста phpunit.

Просто замените __METHOD__ в приведенном ниже коде тем, что хотите вывести

Пример 4.2: пример, показывающий все доступные методы шаблона

<?php
class TemplateMethodsTest extends PHPUnit_Framework_TestCase
{
    public static function setUpBeforeClass()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function setUp()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function assertPreConditions()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    public function testOne()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        $this->assertTrue(TRUE);
    }

    public function testTwo()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        $this->assertTrue(FALSE);
    }

    protected function assertPostConditions()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function tearDown()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    public static function tearDownAfterClass()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function onNotSuccessfulTest(Exception $e)
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        throw $e;
    }
}
?>
ответил Chris 1 MarpmSun, 01 Mar 2015 21:01:46 +03002015-03-01T21:01:46+03:0009 2015, 21:01:46
0

Взломать, но работает: создать исключение с выводом отладки в качестве сообщения.

class theTest extends PHPUnit_Framework_TestCase
{
    public function testOutput() {
        throw new \Exception("hello");
    }   
}

Урожайность:

...
There was 1 error:

1) theTest::testOutput
Exception: hello
ответил Matthias Rella 28 FebruaryEurope/MoscowbWed, 28 Feb 2018 13:58:54 +0300000000pmWed, 28 Feb 2018 13:58:54 +030018 2018, 13:58:54
0

Я вывожу свой Testresults на основе HTML, в этом случае было бы полезно сбросить содержимое:

var_dump($array);
ob_flush();

Существует второй метод PHP

flush() 

который я не пробовал.

ответил Sudo 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 27 Sep 2017 22:17:11 +0300 2017, 22:17:11
0

Вот несколько методов, полезных для печати отладочных сообщений в PHPUnit 4.x:

  • syslog(LOG_DEBUG, "Debug: Message 1!");

    Более практичный пример:

    syslog(LOG_DEBUG, sprintf("%s: Value: %s", __METHOD__, var_export($_GET, TRUE)));
    

    Вызов syslog() создаст сообщение системного журнала (см. man syslog.conf).

    Примечание. Возможные уровни: LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING, LOG_ERR и т. д.

    В macOS для потоковой передачи сообщений системного журнала в режиме реального времени выполните:

    log stream --level debug --predicate 'processImagePath contains "php"'
    
  • 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 в тесте?


Хотя, если тестирование вывода является частью самого теста, ознакомьтесь: Страница результатов тестирования документов.

ответил kenorb 2 FebruaryEurope/MoscowbFri, 02 Feb 2018 21:22:46 +0300000000pmFri, 02 Feb 2018 21:22:46 +030018 2018, 21:22:46
0

Мне пришлось изменить исходный код , чтобы этот код работал, поэтому вам нужно добавить URL-адрес этого раздвоенного репозитория для композитора, для этого будет работать

class TestCase extends \PHPUnit_Framework_TestCase
{
    /**
     *  Save last response
     * @var Response|null A Response instance
     */
    static $lastResponse;
    /**
     *  Modify to save response
     *
     * @param  string $method
     * @param  string $uri
     * @param  array $parameters
     * @param  array $files
     * @param  array $server
     * @param  string $content
     * @param  bool $changeHistory
     * @return \Illuminate\Http\Response
     */
    final public function call(
        $method,
        $uri,
        $parameters = [],
        $files = [],
        $server = [],
        $content = null,
        $changeHistory = true
    ) {

        $response = parent::call($method, $uri, $parameters, $files, $server, $content, $changeHistory);
        static::$lastResponse = $this->client->getResponse();
        return $response;
    }


    /**
     * Modify message to add response text
     *
     * @param mixed $value
     * @param PHPUnit_Framework_Constraint $constraint
     * @param string $message
     * @since  Method available since Release 3.0.0
     */
    final public static function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '')
    {
        $message .= PHP_EOL . static::$lastResponse . PHP_EOL;
        parent::assertThat($value, $constraint, $message);
    }
}
ответил gadelkareem 8 +04002014-10-08T17:01:12+04:00312014bEurope/MoscowWed, 08 Oct 2014 17:01:12 +0400 2014, 17:01:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132