Как отображать имя неудачного теста PHPUnit даже до завершения всех тестов

Я разделил свои тесты на разные группы, чтобы не запускать самые медленные до тех пор, пока это не станет абсолютно необходимым.

Тем не менее, некоторые из них все еще медленные.

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

Например. в настоящее время, когда я запускаю phpunit tests/Unit/ --verbose, я вижу такой вывод:

PHPUnit 7.5.1 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.2.14-1+ubuntu16.04.1+deb.sury.org+1 with Xdebug 2.6.0
Configuration: /home/vagrant/Code/myproject/phpunit.xml

........F.....

Но даже несмотря на то, что я вижу "F", мне нужно долго ждать, прежде чем я увижу, какой именно тест провалился.

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

Как?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
1 281
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас есть как минимум 3 варианта:

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

  2. создайте класс принтера и используйте его с флагом --printer

  3. добавить --testdox флаг

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

Вам нужно создать новый класс (обычно в директории /tests). Убедитесь, что этот класс расширяет PHPUnit_TextUI_ResultPrinter. Затем в файле phpunit.xml вы добавляете эти настройки внутри

     printerFile = "tests/TestDurationPrinter.php"  <-- filename 
     printerClass = "TestDurationPrinter   <-- Class you created.

Мой принтер выглядит так:

    class TestDurationPrinter extends \PHPUnit_TextUI_ResultPrinter
    {
    /**
     * @param PHPUnit_Framework_Test|PHPUnit_Extensions_PhptTestCase $test
     */
    public function startTest(PHPUnit_Framework_Test $test)
    {
        $this->write(sprintf(
            "\nRunning '%s::%s'...",
            get_class($test),
            $test->getName()
        ));
    }

    /**
     * @param PHPUnit_Framework_Test|PHPUnit_Extensions_PhptTestCase $test
     * @param float $time
     */
    public function endTest(PHPUnit_Framework_Test $test, $time)
    {
        $this->write(sprintf(
            "ended and took ~ %s seconds.",
            round($time)
        ));
    }
}

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

Я надеюсь, это поможет вам.

Обновлено: еще одна вещь, которую вы можете сделать, это добавить флаг

--stop-on-error
so that tests stop as soon as there's an error. There's also
--stop-on-failure
(I think this is want you want). I always use both as my testsuite has around 800 tests and the entire execution takes around 3 minutes.

Спасибо за ответ, но --debug совсем не помог, а документов на phpunit.readthedocs.io/en/7.5/textui.html?highlight=--printe‌​r очень мало.

Ryan 27.02.2019 20:16

какой результат вы получаете с --debug? Я получаю все имя выполняемого теста

Guillermo Mansilla 27.02.2019 20:20

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

Ryan 27.02.2019 20:24

Прохладный. Я не знал о --testdox. Я бы хотел, чтобы была менее подробная версия (например, такая, которая будет молчать при всех успехах), но на данный момент это действительно хороший простой вариант. Спасибо!

Ryan 01.03.2019 20:45

Я оценил Ответ Гильермо Мансильи и теперь я, наконец, придумал то, что я предпочитаю еще больше:

1) Я отредактировал тег <phpunit> моего phpunit.xml, включив в него:

printerFile = "tests/CustomPhpUnitConsolePrinter.php"
printerClass = "CustomPhpUnitConsolePrinter"

2) Мой CustomPhpUnitConsolePrinter.php такой:

<?php

class CustomPhpUnitConsolePrinter extends \PHPUnit\TextUI\ResultPrinter {

    protected static $skippedTests = [];
    protected static $testsWithUnknownStatus = [];

    /**
     * @param \PHPUnit\Framework\Test|\PHPUnit\Extensions\PhptTestCase $test
     * @param float $time
     */
    public function endTest(\PHPUnit\Framework\Test $test, $time): void {
        parent::endTest($test, $time);
        $status = $test->getStatus();
        if ($status != \PHPUnit\Runner\BaseTestRunner::STATUS_PASSED) {//https://stackoverflow.com/a/6744246/470749
            if ($status == \PHPUnit\Runner\BaseTestRunner::STATUS_SKIPPED) {
                self::$skippedTests[] = \PHPUnit\Util\Test::describeAsString($test);
            } else if ($status == \PHPUnit\Runner\BaseTestRunner::STATUS_UNKNOWN) {
                self::$testsWithUnknownStatus[] = \PHPUnit\Util\Test::describeAsString($test);
            } else {
                $this->write(\sprintf(PHP_EOL . "[%s]", \PHPUnit\Util\Test::describeAsString($test)));
            }
        }
    }

    protected function printFooter(\PHPUnit\Framework\TestResult $result): void {
        if (self::$skippedTests) {
            $this->write(PHP_EOL . strtoupper('► Skipped tests:') . PHP_EOL);
            $this->write(implode(PHP_EOL, self::$skippedTests) . PHP_EOL);
        }
        if (self::$testsWithUnknownStatus) {
            $this->write(PHP_EOL . strtoupper('► Tests with Unknown status:') . PHP_EOL);
            $this->write(implode(PHP_EOL, self::$testsWithUnknownStatus) . PHP_EOL);
        }
        parent::printFooter($result);
    }

}

3) Я также добавил этот раздел перед закрывающим тегом </phpunit> (см. документы):

<logging>
    <!--        https://stackoverflow.com/a/52377685/470749-->
    <log type = "testdox-html" target = "./storage/logs/testdox.html"/>
</logging>

Другие вопросы по теме