Как вывести в CLI во время выполнения модульных тестов PHP? - PullRequest
123 голосов
/ 21 сентября 2011

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

Я пробовал следующее (аналогично примеру PHPUnit Manual * 1004)*);

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 repos по состоянию на 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?

Ответы [ 14 ]

154 голосов
/ 26 сентября 2012

UPDATE

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

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

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


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

$this->expectOutputString('foo');

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

$ phpunit --verbose -c phpunit.xml

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

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

32 голосов
/ 21 сентября 2011

Обновление: См. Обновление 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 @package_version@ 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.

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

27 голосов
/ 20 мая 2013

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

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

9 голосов
/ 21 сентября 2011

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

Если вы пытаетесь проверить выход, проверьте this out.

Также:

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

7 голосов
/ 26 марта 2013

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

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

TestHello results

5 голосов
/ 21 сентября 2011

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

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

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

3 голосов
/ 28 февраля 2018

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

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

Выход:

...
There was 1 error:

1) theTest::testOutput
Exception: hello
3 голосов
/ 08 июля 2016

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

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

дает

3 голосов
/ 22 декабря 2015

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

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();
    }
}
2 голосов
/ 22 мая 2018

Просто используйте флаг - подробный при выполнении phpunit .

$ phpunit --verbose -c phpunit.xml 

Преимущество этого метода заключается в том, что вам не нужно менять тестовый код, вы можете печатать строки, var_dump или все, что пожелаете, и это будет отображаться в консоли только в режиме verbose установлен.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...