Эхо в тестах phpunit

Я пытаюсь использовать echo материал в своих тестах phpunit, но пока не повезло.

Я прочитал документацию о файле конфигурации xml и, по-видимому, параметр debug - это то, что я ищу. К сожалению, он все еще не работает. В любом случае, вот мой конфигурационный файл xml:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true"
         processIsolation="true"
         verbose="true"
         debug="true">
</phpunit> 

Оба processIsolation и verbose принимаются, но debug нет.

Команда действительно работает очень хорошо, когда я прямо передаю ее phpunit следующим образом:

phpunit --debug MyTest.php # here stuff is echoed correctly

но с конфигурационным файлом xml он выглядит так, как будто он игнорируется.

Ответ 1

Текущие версии PHPUnit >3.6.4 (и всех версий 3.5.*) просто распечатывают все, что вы echo в тестовом примере.

<?php

class OutputTestCase extends PHPUnit_Framework_TestCase {

    public function testEcho() {
        echo "Hi";
    }   
}

дает:

phpunit foo.php 
PHPUnit 3.6.7 by Sebastian Bergmann.

.Hi

Time: 0 seconds, Memory: 3.25Mb

OK (1 test, 0 assertions)

Итак, если вы в старой версии 3.6 просто обновите:)

Ответ 2

Убедитесь, что вы не вызываете exit() или kill(). PHPUnit буферизирует операторы эха, и этот буфер будет потерян без вывода, если ваш script выйдет во время теста.

Ответ 3

processIsolation подавляет вывод тестов, поэтому вы должны отключить его. Взаимодействие с флагом debug, вероятно, было связано с этим: https://github.com/sebastianbergmann/phpunit/pull/1489

Ответ 4

Если ваш тест занимает много времени, и вы хотите увидеть результат во время процесса, добавьте следующий метод в свой тестовый класс:

protected function prontoPrint($whatever = 'I am printed!')
{
    // if output buffer has not started yet
    if (ob_get_level() == 0) {
        // current buffer existence
        $hasBuffer = false;
        // start the buffer
        ob_start();
    } else {
        // current buffer existence
        $hasBuffer = true;
    }

    // echo to output
    echo $whatever;

    // flush current buffer to output stream
    ob_flush();
    flush();
    ob_end_flush();

    // if there were a buffer before this method was called
    //      in my version of PHPUNIT it has its own buffer running
    if ($hasBuffer) {
        // start the output buffer again
        ob_start();
    }
}

Теперь, когда вы вызываете $this->prontoPrint($variable) внутри вашего тестового класса, он немедленно отображает текст в консоли. Я использовал этот комментарий php.net для записи функции.

PHPUnit 5.7.21 PHP 5.6.31 with Xdebug 2.5.5