我使用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和更高版本配置为具有相同的行为?
答案 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作业,指定输出文件的位置。