如何配置PHPUnit将dataprovider错误视为失败而不是警告?

时间:2019-04-02 11:11:34

标签: php phpunit

我使用PHPUnit运行我的PHP单元测试。当数据提供者无法加载时,它会发出警告而不是失败。

直到PHPUnit版本4,当数据提供程序加载失败时,PHPUnit输出中将显示失败。 从PHPUnit 5开始,将发出警告。这是使用脚本运行测试时的问题(例如,在持续集成中),因此我看不到结果。

另一个差异是使用PHP 5和PHP 7运行代码时。使用PHP 5运行测试时,我没有看到PHPUnit输出,而是立即看到PHP致命错误。使用PHP 7时,仅当PHPUnit进入失败的测试时才显示失败/警告。这使我相信这与PHPUnit设置的error_handler有关,可以捕获PHP7抛出但PHP5不会抛出的错误。

这是我的PHP代码:

class TestTest extends PHPUnit_Extensions_Database_TestCase
{
    /**
     * @dataProvider provider_sample
     */

    public function test_sample($foo)
    {
        $this->assertString($foo);
    }

    public function provider_sample()
    {
        return [
            [ClassName::string] // no such class, this should fail
        ];
    }

    public function getDataset()
    {
        return new ArrayDataSet([]);
    }
}

这是运行PHPUnit 4的结果:

PHPUnit 4.8.36 by Sebastian Bergmann and contributors.

Runtime:        PHP 7.2.5
Configuration:  /home/some-path/phpunit.xml
Warning:        The Xdebug extension is not loaded
                No code coverage will be generated.

F

Time: 120 ms, Memory: 14.00MB

There was 1 failure:

1) Warning
The data provider specified for TestTest::test_sample is invalid.
Class 'ClassName' not found

FAILURES!
Tests: 1, Assertions: 0, Failures: 1.

这是使用PHPUnit 5运行相同代码的结果:

PHPUnit 5.7.21 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.2.5
Configuration: /home/some-path/phpunit.xml
Error:         No code coverage driver is available

W                                                                   1 / 1 (100%)

Time: 99 ms, Memory: 14.00MB

There was 1 warning:

1) Warning
The data provider specified for TestTest::test_sample is invalid.
Class 'ClassName' not found

WARNINGS!
Tests: 1, Assertions: 0, Warnings: 1.

PHPUnit 4的结果是我期望和想要的。 有没有一种方法可以将PHPUnit 5和更高版本配置为具有相同的行为?

2 个答案:

答案 0 :(得分:0)

检查文件名并导入

 require_once 'ClassName.php';

答案 1 :(得分:0)

我认为您无法完全满足您的要求,但是如果您想将PHPUnit与持续集成服务器(例如Jenkins)进行集成,则可以生成一个JUnit兼容的报告,其中包含警告而是错误,并告诉Jenkins使用该错误而不是PHPUnit报告。

为此,您将需要扩展PHPUnit随附的JUnit记录器:

use PHPUnit\Util\Log\JUnit;

class MyJUnit extends Junit {
    public function addWarning(Test $test, Warning $e, float $time): void {
        $this->addError($test, $e, $time);
    }
}

并在phpunit.xml中将其注册为侦听器:

<listeners>
  <listener class="MyJUnit" file="MyJUnit.php">
    <arguments>
      <!-- 
        Print the output to the file instead of stdout 
        which is the default.
      -->
      <string>junit.xml</string> 
    </arguments>
  </listener>
</listeners>

最后,转到Jenkins设置并添加一个JUnit作业,指定输出文件的位置。