使用 phpunit 9.5 捕获警告、通知和弃用
Posted
技术标签:
【中文标题】使用 phpunit 9.5 捕获警告、通知和弃用【英文标题】:catching warnings, notices and deprecations with phpunit 9.5 【发布时间】:2022-01-16 03:37:57 【问题描述】:引用https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html#testing-php-errors-warnings-and-notices,“默认情况下,PHPUnit 会将测试执行期间触发的 PHP 错误、警告和通知转换为异常”。考虑到这一点,这是我的单元测试:
<?php
class DemoTest extends PHPUnit\Framework\TestCase
public function testDemo()
try
trigger_error('zzz', E_USER_DEPRECATED);
catch (\Throwable $e)
当我使用 PHPUnit 9.5.10(在 PHP 8.0.9 或 PHP 8.1.0 上)运行 vendor/bin/phpunit
时,我得到以下信息:
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')
对我不起作用。
有什么想法吗?
【问题讨论】:
这个问题和***.com/q/70321515/569976 的区别在于另一个问题是关于 PHPUnit 9.4 和 PHPUnit 9.5 的。 PHPUnit 9.4 中的问题仅在 PHP 8.1 上表现出来,而这个问题至少在 PHP 8.0 和 8.1 中具有一致的行为。 【参考方案1】:在changelog of 9.5.10 中声明:
默认情况下,PHPUnit 不再将 PHP 弃用转换为异常(配置 convertDeprecationsToExceptions="true" 以启用此功能)
所以这是意料之中的。从技术上讲,人们甚至可以争辩说关于“错误、警告和通知”的说法是正确的,因为弃用是它们自己的类别。
您通常在XML configuration file 中配置此设置,-c
提供。
还要注意文档页面上关于 error_reporting
ini/runtime 设置的注释:它也不能排除弃用(E_ALL
很好)。
【讨论】:
【参考方案2】:似乎意图是抛出并捕获异常,但使用trigger_error
是不一样的(它不是抛出异常)。有a great answer 解释差异。
如果您的意图是处理弃用错误,那么我建议在可以自定义处理 E_DEPRECATED 消息的情况下使用set_error_handler。
【讨论】:
引用phpunit.readthedocs.io/en/9.5/…,“默认情况下,PHPUnit 将测试执行期间触发的 PHP 错误、警告和通知转换为异常”。 PHPUnit 无疑是通过使用它自己的自定义错误处理程序来做到这一点的。请记住,我并没有尝试在常规 PHP 脚本中执行此操作 - 我尝试在 PHPUnit 单元测试的上下文中执行此操作。以上是关于使用 phpunit 9.5 捕获警告、通知和弃用的主要内容,如果未能解决你的问题,请参考以下文章
在 Heroku 中运行任务的 Rails 2.3 样式插件和弃用警告