如何在所有测试完成之前显示失败的PHPUnit测试的名称

5w9g7ksd  于 5个月前  发布在  PHP
关注(0)|答案(3)|浏览(60)

我把测试分成了不同的组,这样我就不用费心去运行最慢的测试,除非绝对必要。
但有些人仍然很慢。
因此,我很想看到在整个测试套件完成运行之前失败或有错误的测试的名称。
例如,当我运行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”,我也需要等很长时间才能看到哪个测试失败了。
我希望能够允许测试继续运行,但同时开始研究特定的测试,看看它失败的原因。
怎么做?

guicsvcw

guicsvcw1#

你至少有三个选择:

  1. add --debug flag(在阅读您的评论后,似乎这不会做您需要的事情,即在真实的时间内显示测试失败)
    1.创建一个打印机类,并使用它与--printer标志
  2. add --testdox标志
    很久以前,我不得不做我自己的打印机,因为我需要显示一个测试花了多长时间。所以基本上我是打印时,一个测试开始,它的名称和它花了多长时间。你可以使用这个代码,并适应你的需要。
    您需要创建一个新类(通常在/tests directoy下)。确保该类扩展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

,这样一旦出现错误,测试就会停止。还有

--stop-on-failure

(我想这是你想要的)。我总是使用这两个,因为我的测试套件有大约800个测试,整个执行大约需要3分钟。

bweufnob

bweufnob2#

我很欣赏Guillermo Mansilla's answer现在我终于想出了一些我更喜欢的东西:
1)我编辑了我的 phpunit.xml<phpunit>标签,以包括:

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>之前添加了这一节(参见docs):

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

a7qyws3x

a7qyws3x3#

Ryan's answer的一个小细节是:你不能扩展接口。
我所做的是在PHPUnit\TextUI\DefaultResultPrinter上扩展。

相关问题