Печать вывода отладки на консоль в Codeception

Очень толстый вопрос, а есть ли способ вывести в Codeception собственные отладочные сообщения на консоль? Я имею в виду сообщения, которые не имеют ничего общего с утверждениями, просто для отладки самих тестов (например, как вы бы var_dump() переменную на любом обычном веб-сайте PHP)

Я уже пробовал var_dump(), echo и print, но безрезультатно. Использование makeAResponseDump() WebDebug также не дает требуемых результатов, я просто хочу иметь возможность видеть содержимое своей переменной без запуска отладчика, такого как xdebug.


person Ayame__    schedule 19.02.2014    source источник


Ответы (9)


См. раздел Отладка, в котором говорится

Вы можете распечатать любую информацию внутри теста, используя функцию codecept_debug.

И я использую его в своем классе *Cept:

codecept_debug($myVar);

Ваш вывод отладки виден только при запуске с параметром --debug (-v его не показывает, но -vv и -vvv показывают):

codecept run --debug

И вывод выглядел так:

Validate MyEntity table insert (MyCept) 
Scenario:
* I persist entity "AppBundle\Entity\MyEntity"

  AppBundle\Entity\MyEntity Object
  (
      [Id:AppBundle\Entity\MyEntity:private] => 1
      [Description:AppBundle\Entity\MyEntity:private] => Description
  )

 PASSED 
person Bae    schedule 26.05.2015
comment
Это работает для меня. Просто хотелось бы иметь этот пользовательский и временный вывод отладки, не видя всего --debug материала, который будет отображаться для каждого отдельного запуска. - person jerclarke; 09.07.2021

\Codeception\Util\Debug::debug($this->em);die();

и запустите Codeception с флагом --debug.

person sennett    schedule 09.09.2014
comment
метод отладки не имеет значения. вы можете использовать var_dump(). и если вы запускаете тесты phpunit, даже --debug не требуется. - person coviex; 10.07.2015

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

class WebHelper extends \Codeception\Module
{
    public function seeMyVar($var){
        $this->debug($var);
    }
}

и вызывая класс как таковой:

$foo = array('one','two');
$I->seeMyVar($foo);

затем я получаю отладочный вывод, который я ищу

I see my var "lambda function"
  Array
  (
      [0] => one
      [1] => two
  )

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

person Ayame__    schedule 19.02.2014
comment
Я начал думать, что был немного глуп, потому что не видел очевидного способа сделать это. Спасибо, что поделились своим решением! - person Alex Jegtnes; 23.02.2014
comment
Почему бы просто не позвонить var_dump, print_r или print? У меня работает изнутри tryToTest - person pymarco; 09.05.2014
comment
Поскольку ни один из вышеперечисленных не работал в моих тестах, возможно, теперь есть более новая версия, начиная с исходного сообщения, которая заставила ее работать на вас? - person Ayame__; 15.05.2014
comment
Добавление флагов -v или -vv , -vvv сделает все ваши print_r и var_dumps видимыми в выводе. - person Gayan Hewa; 19.02.2015

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

codecept run -vvv

где каждый v увеличивает детализацию вывода (по умолчанию очень тихо).

person Luca Tumedei    schedule 22.05.2015

По умолчанию Codeception говорит, что произошла ошибка, но не показывает ее подробно. Однако, согласно этой записи в блоге, добавление --debug подробно показывает ошибки.

codecept run --debug

person Bibek Shrestha    schedule 08.09.2014

Короткая версия будет codecept run tests/acceptance/SomeCest.php -d
-d покажет вам шаги и отладку

person Stipe    schedule 17.04.2017

Короткий, красивый и простой способ

Определенно codecept_debug с опцией --debug - один из правильных способов.

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

Однако есть еще один короткий, красивый и простой способ

Утвердите переменную с помощью true или чего-либо случайного, используя assertSame для отображения/var_dump переменной

Допустим, мне нужно посмотреть, что внутри $mango, и я уверен, что это неправда или «что-то случайное».

$I->assertTrue($mango)
$I->assertSame($mango, 'something random') // I am pretty sure $mango does not equals to 'something random'

Приведенные выше операторы будут выдавать ошибку при печати $mango, и самое приятное то, что она будет напечатана внизу, поэтому нет необходимости прокручивать и нет многословия. Также таким образом нет необходимости добавлять --debug в команду CLI.

Ограничение:

Из 10 типов данных в PHP

Four scalar types:


bool
int
float (floating-point number, aka double)
string


Four compound types:

array
object
callable
iterable


And finally two special types:

resource
NULL

Выше мой способ хорошо работает только с 6:

Four scalar types:

bool
int
float (floating-point number, aka double)
string


One compound types:

array


And finally one special types:

NULL

Значение object, resource будет напечатано не очень хорошо.

person Sohel Ahmed Mesaniya    schedule 09.01.2021

Просто позвоните ob_flush() после вывода текста

Пример кода:

    public function testDebugOutputToCli() {
        var_dump(new DateTime());
        ob_flush();
    }

Скриншот кода и выходных данных:

Скриншот использования ob_flush для вывода контента, который в противном случае был бы скрыт PHPUnit

Почему? PHPUnit всегда буферизует вывод, поэтому нам нужно сбрасывать буфер при отладке

Я боролся со всеми приведенными выше ответами, особенно потому, что выбранный ответ — использование codecept_debug() с --debug, как говорится в руководстве, — вызвал огромную волну отладочного вывода, что сделало его невозможным для меня.

Я читал руководство по PHPUnit как хороший ботаник и наткнулся на это, что, я думаю, объясняет, что вызывает всю эту проблему во всем PHPUnit, а не только в Codeception:

Руководство по PHPUnit, результаты тестирования: «Иногда вы хотите утверждать, что выполнение метода, например, генерирует ожидаемый результат (например, через эхо или печать). Класс PHPUnit\Framework\TestCase использует функцию буферизации вывода PHP, чтобы обеспечить необходимую для этого функциональность».

Это имеет смысл и объясняет, почему мы не видим результат. PHPUnit сохраняет его на случай, если мы захотим изучить комментарии! Именно так это всегда должно работать в наших реальных тестах, мы, конечно, не хотим, чтобы случайные вещи попадали на экран только потому, что мы вызвали функцию, которая использует echo.

Но когда мы отлаживаем, мы просто хотим сразу увидеть текст, и, понимая все это, решение очевидно: Просто используйте ob_flush() для печати содержимого выходного буфера по требованию!

Три ура за чтение забавных руководств!

P.S. Также нашел этот совет, скрытый в Как показать var_dumps в phpunit или codeception от Джулиана на dev.to

person jerclarke    schedule 10.07.2021

Согласно ОП

Я просто хочу видеть содержимое моей переменной

Если у вас есть переменная типа

$var="hello";

И вы хотите вывести его в консоль, тогда просто выполните

$I->comment($var);
person Robert Sinclair    schedule 23.07.2021