Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何配置PHPUnit以将数据提供程序错误视为失败而不是警告?_Php_Phpunit - Fatal编程技术网

如何配置PHPUnit以将数据提供程序错误视为失败而不是警告?

如何配置PHPUnit以将数据提供程序错误视为失败而不是警告?,php,phpunit,Php,Phpunit,我使用PHPUnit运行PHP单元测试。当数据提供程序加载失败时,将导致警告,而不是失败 在PHPUnit版本4之前,当数据提供程序无法加载时,PHPUnit输出中将显示失败。 从PHPUnit 5开始,将发出警告。当使用脚本运行测试时(例如在持续集成中),这是一个问题,因此我看不到结果 另一个区别是使用PHP5和PHP7运行代码时。使用PHP5运行测试时,我没有看到PHPUnit输出,而是立即得到一个PHP致命错误。对于PHP7,它仅在PHPUnit到达失败的测试时显示失败/警告。这让我相信这

我使用PHPUnit运行PHP单元测试。当数据提供程序加载失败时,将导致警告,而不是失败

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

另一个区别是使用PHP5和PHP7运行代码时。使用PHP5运行测试时,我没有看到PHPUnit输出,而是立即得到一个PHP致命错误。对于PHP7,它仅在PHPUnit到达失败的测试时显示失败/警告。这让我相信这与PHPUnit设置的错误处理程序有关,它可以捕获PHP7抛出的错误,但PHP5没有

以下是我的PHP代码:

class TestTest扩展PHPUnit\u扩展\u数据库\u测试用例
{
/**
*@dataProvider\u示例
*/
公共功能测试样本($foo)
{
$this->assertString($foo);
}
公共函数提供程序\u示例()
{
返回[
[ClassName::string]//没有这样的类,应该失败
];
}
公共函数getDataset()
{
返回新的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.

phpunit4的结果正是我所期望和想要的。
有没有办法将PHPUnit 5和更高版本配置为具有相同的行为?

检查文件名并导入

 require_once 'ClassName.php';

我不认为您可以完全按照您的要求来做,但是如果您想将PHPUnit与持续集成服务器(例如,Jenkins)集成,那么您可以生成一个与JUnit兼容的报告,并将警告报告为错误,然后告诉Jenkins使用该报告而不是PHPUnit报告

为此,您需要扩展PHPUnit附带的JUnit logger:

使用PHPUnit\Util\Log\JUnit;
类MyJUnit扩展了Junit{
公共函数addWarning(Test$Test,Warning$e,float$time):void{
$this->addError($test,$e,$time);
}
}
并将其注册为
phpunit.xml
中的侦听器:


junit.xml

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

这确实避免了问题,但我想实现的是,如果给定无法加载类名,我希望发出一个失败,而不是警告。可能在一般意义上,在任何数据提供程序中,您都需要首先验证是否确实可以生成有效数据,如果不能,可能会抛出异常。在本例中,您可以使用类_exists()来查看是否可以创建有效数据,在本例中,有效数据就是ClassName对象。如果不是,那么抛出一个异常应该会导致测试失败,我认为。除了抛出一个异常,您可以使用
$this->fail()
$this->assertTrue(false)
手动使测试失败,但我不确定这些是否在数据提供程序方法中起作用。您可以使用
$this->assertTrue(class_exists('ClassName',true))
@Huy,这太具体了。我希望每次数据提供者未能正确解决问题时,都能得到通知。例如,获取失败而不是警告。可能会看到以下内容:。“…数据提供程序在调用setUpBeforeClass静态方法和..SetupMethod之前执行…这是PHPUnit能够计算测试总数所必需的。”因此,从技术上讲,数据提供程序是在类中的第一个测试运行之前执行的。它不是测试的一部分,而是设置的一部分。因此,我不确定是否有办法使数据提供程序的测试失败-仅作为安装过程中的错误。也许其他人知道一个更好的way@Huy从PHPUnit的角度来看,无论是不能自动加载类还是从数据提供程序抛出异常,它们都最终成为
PHPUnit\u Framework\u警告
。PHPUnit没有提出改变它的方法,@sebastianbergmann对此非常坚定:谢谢!经过一些调整,这已经接近我真正需要的了。