使用 phpunit 9.5 捕获警告、通知和弃用
catching warnings, notices and deprecations with phpunit 9.5
引用 https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html#testing-php-errors-warnings-and-notices , "默认情况下,PHP单元将测试执行期间触发的 PHP 错误、警告和通知转换为异常”。牢记这一点,这是我的单元测试:
<?php
class DemoTest extends PHPUnit\Framework\TestCase
{
public function testDemo()
{
try {
trigger_error('zzz', E_USER_DEPRECATED);
} catch (\Throwable $e) {}
}
}
当我 运行 vendor/bin/phpunit
使用 PHPUnit 9.5.10 时(在 PHP 8.0.9 或 PHP 8.1.0 上)我得到以下信息:
PHPUnit 9.5.10 by Sebastian Bergmann and contributors.
R 1 / 1 (100%)
Deprecated: zzz in C:\path\to\code\tests\DemoTest.php on line 8
Time: 00:00.007, Memory: 6.00 MB
There was 1 risky test:
1) DemoTest::testDemo
This test did not perform any assertions
C:\path\to\code\tests\DemoTest.php:5
OK, but incomplete, skipped, or risky tests!
Tests: 1, Assertions: 0, Risky: 1.
我不想在输出中看到错误,如果没有抛出异常,那么 $this->expectException('PHPUnit\Framework\Error\Deprecated')
对我不起作用。
有什么想法吗?
好像本意是抛出并捕获异常,但是用trigger_error
就不一样了(不是抛出异常)。有 a great answer 解释差异。
如果您打算处理弃用错误,那么我建议在可以自定义处理 E_DEPRECATED 消息的地方使用 set_error_handler。
在 changelog of 9.5.10 中指出:
PHPUnit no longer converts PHP deprecations to exceptions by default (configure convertDeprecationsToExceptions="true" to enable this)
所以这是预料之中的。从技术上讲,人们甚至可以争辩说关于“错误、警告和通知”的说法是正确的,因为弃用是它们自己的类别。
您通常在 XML configuration file 中配置它,提供 -c
。
还要注意文档页面上关于 error_reporting
ini/runtime 设置的注释:它也不能排除弃用(E_ALL
很好)。
引用 https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html#testing-php-errors-warnings-and-notices , "默认情况下,PHP单元将测试执行期间触发的 PHP 错误、警告和通知转换为异常”。牢记这一点,这是我的单元测试:
<?php
class DemoTest extends PHPUnit\Framework\TestCase
{
public function testDemo()
{
try {
trigger_error('zzz', E_USER_DEPRECATED);
} catch (\Throwable $e) {}
}
}
当我 运行 vendor/bin/phpunit
使用 PHPUnit 9.5.10 时(在 PHP 8.0.9 或 PHP 8.1.0 上)我得到以下信息:
PHPUnit 9.5.10 by Sebastian Bergmann and contributors.
R 1 / 1 (100%)
Deprecated: zzz in C:\path\to\code\tests\DemoTest.php on line 8
Time: 00:00.007, Memory: 6.00 MB
There was 1 risky test:
1) DemoTest::testDemo
This test did not perform any assertions
C:\path\to\code\tests\DemoTest.php:5
OK, but incomplete, skipped, or risky tests!
Tests: 1, Assertions: 0, Risky: 1.
我不想在输出中看到错误,如果没有抛出异常,那么 $this->expectException('PHPUnit\Framework\Error\Deprecated')
对我不起作用。
有什么想法吗?
好像本意是抛出并捕获异常,但是用trigger_error
就不一样了(不是抛出异常)。有 a great answer 解释差异。
如果您打算处理弃用错误,那么我建议在可以自定义处理 E_DEPRECATED 消息的地方使用 set_error_handler。
在 changelog of 9.5.10 中指出:
PHPUnit no longer converts PHP deprecations to exceptions by default (configure convertDeprecationsToExceptions="true" to enable this)
所以这是预料之中的。从技术上讲,人们甚至可以争辩说关于“错误、警告和通知”的说法是正确的,因为弃用是它们自己的类别。
您通常在 XML configuration file 中配置它,提供 -c
。
还要注意文档页面上关于 error_reporting
ini/runtime 设置的注释:它也不能排除弃用(E_ALL
很好)。