Как вывести в 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 ]

2 голосов
/ 01 марта 2015

Это взято из 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;
    }
}
?>
1 голос
/ 27 сентября 2017

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

var_dump($array);
ob_flush();

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

flush() 

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

0 голосов
/ 02 февраля 2018

Вот несколько методов, полезных для печати отладочных сообщений в 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 в тесте?


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

0 голосов
/ 08 октября 2014

Мне пришлось изменить исходный код , чтобы этот код работал, поэтому вам нужно добавить 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...