如何配置PHPUnit以将数据提供程序错误视为失败而不是警告?
我使用PHPUnit运行PHP单元测试。当数据提供程序加载失败时,将导致警告,而不是失败 在PHPUnit版本4之前,当数据提供程序无法加载时,PHPUnit输出中将显示失败。 从PHPUnit 5开始,将发出警告。当使用脚本运行测试时(例如在持续集成中),这是一个问题,因此我看不到结果 另一个区别是使用PHP5和PHP7运行代码时。使用PHP5运行测试时,我没有看到PHPUnit输出,而是立即得到一个PHP致命错误。对于PHP7,它仅在PHPUnit到达失败的测试时显示失败/警告。这让我相信这与PHPUnit设置的错误处理程序有关,它可以捕获PHP7抛出的错误,但PHP5没有 以下是我的PHP代码:如何配置PHPUnit以将数据提供程序错误视为失败而不是警告?,php,phpunit,Php,Phpunit,我使用PHPUnit运行PHP单元测试。当数据提供程序加载失败时,将导致警告,而不是失败 在PHPUnit版本4之前,当数据提供程序无法加载时,PHPUnit输出中将显示失败。 从PHPUnit 5开始,将发出警告。当使用脚本运行测试时(例如在持续集成中),这是一个问题,因此我看不到结果 另一个区别是使用PHP5和PHP7运行代码时。使用PHP5运行测试时,我没有看到PHPUnit输出,而是立即得到一个PHP致命错误。对于PHP7,它仅在PHPUnit到达失败的测试时显示失败/警告。这让我相信这
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对此非常坚定:谢谢!经过一些调整,这已经接近我真正需要的了。