Я разделил свои тесты на разные группы, чтобы не запускать самые медленные до тех пор, пока это не станет абсолютно необходимым.
Тем не менее, некоторые из них все еще медленные.
Поэтому я бы хотел увидеть названия тестов, которые либо не прошли, либо содержали ошибки, даже до того, как завершится выполнение всего набора тестов.
Например. в настоящее время, когда я запускаю 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", мне нужно долго ждать, прежде чем я увижу, какой именно тест провалился.
Я хотел бы иметь возможность разрешить выполнение тестов, но одновременно начать изучать этот конкретный тест, чтобы понять, почему он не удался.
Как?






У вас есть как минимум 3 варианта:
добавить флаг --debug (после прочтения ваших комментариев кажется, что это не будет делать то, что вам нужно, а именно показывать в реальном времени, какой тест не прошел)
создайте класс принтера и используйте его с флагом --printer
добавить --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-errorso 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? Я получаю все имя выполняемого теста
Я тоже, но это никоим образом не указывает, какие тесты провалились, так что это не очень полезно.
Прохладный. Я не знал о --testdox. Я бы хотел, чтобы была менее подробная версия (например, такая, которая будет молчать при всех успехах), но на данный момент это действительно хороший простой вариант. Спасибо!
Я оценил Ответ Гильермо Мансильи и теперь я, наконец, придумал то, что я предпочитаю еще больше:
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>
Спасибо за ответ, но
--debugсовсем не помог, а документов на phpunit.readthedocs.io/en/7.5/textui.html?highlight=--printer очень мало.